fix(dev): flush re-emitted assets when their content changes - #10637
Merged
Merged
Conversation
Merging this PR will not alter performance
Comparing Footnotes
|
h-a-n-a
reviewed
Aug 13, 2026
The `FileEmitter` is reused for the whole DevEngine lifetime and `emitted_files` is never cleared in dev mode. Since the reference id of an asset emitted with an explicit `fileName` is derived from that name, re-emitting the asset with changed content in a later build was silently dropped after the first flush: `add_additional_files` skipped it forever. This broke consumers that serve emitted assets in dev, e.g. Vite's bundled dev server missing updated html entry assets (vitejs/vite#23179). Record the source hash of every flushed asset and mark the file dirty when it is re-emitted with different content, so it is flushed again. Assets re-emitted with unchanged content stay deduplicated, and the filename conflict check still only runs on the first flush.
Co-authored-by: andrew <andywangsy@gmail.com> Signed-off-by: btea <2356281422@qq.com>
h-a-n-a
force-pushed
the
fix/dev-flush-changed-assets
branch
from
August 17, 2026 06:36
ca6f7cc to
1e7671c
Compare
h-a-n-a
enabled auto-merge (squash)
August 17, 2026 06:36
Merged
shulaoda
added a commit
that referenced
this pull request
Aug 19, 2026
## [1.2.5] - 2026-08-19 ### 🚀 Features - bench: record per-suite peak memory in the node benchmark (#10704) by @IWANABETHATGUY - binding: allocation-tracking global allocator behind the `tracking_allocator` feature (#10703) by @IWANABETHATGUY - add armv7 android (armv7-linux-androideabi) support (#10691) by @shulaoda - add `NAMESPACE_CONFLICT` warning for conflicting star re-exports (#7452) by @AliceLanniste ### 🐛 Bug Fixes - rolldown_plugin_vite_reporter: avoid ANSI erase-line escape in non-TTY output (#10692) by @shulaoda - rolldown_plugin_vite_resolve: preserve Yarn PnP virtual importer (#10591) by @Freakazo - exclude hash placeholders from case-insensitive filename deconfliction (#10590) by @Nic-Polumeyv - code-splitting: fold already-loaded side-effectful libraries into eager entries (#10645) by @JoviDeCroock - dev: flush re-emitted assets when their content changes (#10637) by @btea - renamer: rename nested `require`/`__filename`/`__dirname` bindings in CJS output (#10655) by @marcoroth - silence two wasm-only warnings (#10668) by @IWANABETHATGUY ### 🚜 Refactor - skip case folding for filenames with hash placeholders (#10689) by @hyfdev - code-splitting: remove redundant synthetic statement owner (#10503) by @hyfdev - renamer: move the cjs check into `rename_bindings_shadowing_cjs_ambient_names` (#10672) by @IWANABETHATGUY ### 📚 Documentation - agents: point the never-edit list at the binding files that exist (#10719) by @melbinjp ### 🧪 Testing - deconflict: pin renaming the external process binding away from the global (#10702) by @hyfdev - dev: expect a hot update across a circular import (#10700) by @hyfdev ### ⚙️ Miscellaneous Tasks - deps: upgrade oxc to 0.146.0 (#10707) by @Boshen - deps: update rust crates (#10684) by @renovate[bot] - deps: update npm packages (#10685) by @renovate[bot] - build the benchmark comparison window from the JSON lines (#10701) by @IWANABETHATGUY - wasi: retry the Node Test step to absorb the shared-dlmalloc flake (#10699) by @hyfdev - append benchmark results to storage as JSON lines (#10682) by @IWANABETHATGUY - deps: update github actions (#10683) by @renovate[bot] - deps: update dependency rolldown-plugin-dts to v0.28.2 (#10679) by @renovate[bot] - deps: update dependency rolldown-plugin-dts to v0.28.1 (#10674) by @renovate[bot] ### ❤️ New Contributors * @melbinjp made their first contribution in [#10719](#10719) * @Freakazo made their first contribution in [#10591](#10591) * @marcoroth made their first contribution in [#10655](#10655) Co-authored-by: shulaoda <165626830+shulaoda@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The
FileEmitteris reused for the whole DevEngine lifetime andemitted_filesis never cleared in dev mode. Since the reference id of an asset emitted with an explicitfileNameis derived from that name, re-emitting the asset with changed content in a later build was silently dropped after the first flush:add_additional_filesskipped it forever. This broke consumers that serve emitted assets in dev, e.g. Vite's bundled dev server missing updated html entry assets (vitejs/vite#23179).Record the source hash of every flushed asset and mark the file dirty when it is re-emitted with different content, so it is flushed again. Assets re-emitted with unchanged content stay deduplicated, and the filename conflict check still only runs on the first flush.
AI disclosure
This PR was developed with AI assistance. All generated changes were reviewed, tested, and adjusted before submission.