Skip to content

fix(dev): flush re-emitted assets when their content changes - #10637

Merged
h-a-n-a merged 2 commits into
rolldown:mainfrom
btea:fix/dev-flush-changed-assets
Aug 17, 2026
Merged

h-a-n-a merged 2 commits into
rolldown:mainfrom
btea:fix/dev-flush-changed-assets

Conversation

@btea

@btea btea commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

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.

AI disclosure

This PR was developed with AI assistance. All generated changes were reviewed, tested, and adjusted before submission.

@shulaoda shulaoda self-assigned this Aug 6, 2026
@codspeed

codspeed Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 7 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing btea:fix/dev-flush-changed-assets (1e7671c) with main (84010dc)2

Open in CodSpeed

Footnotes

  1. 10 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

  2. No successful run was found on main (f85ef44) during the generation of this report, so 84010dc was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩

Comment thread crates/rolldown_common/src/file_emitter.rs Outdated

@h-a-n-a h-a-n-a left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks! Hand over to you @shulaoda . You're the assignee.

btea and others added 2 commits August 17, 2026 14:36
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
h-a-n-a force-pushed the fix/dev-flush-changed-assets branch from ca6f7cc to 1e7671c Compare August 17, 2026 06:36
@h-a-n-a
h-a-n-a enabled auto-merge (squash) August 17, 2026 06:36
@h-a-n-a
h-a-n-a merged commit 3745db1 into rolldown:main Aug 17, 2026
31 checks passed
@btea
btea deleted the fix/dev-flush-changed-assets branch August 17, 2026 07:00
@rolldown-guard rolldown-guard Bot mentioned this pull request Aug 19, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Sponsor
SponsoredKunjungi sekarang
Promo