Skip to content

fix(dev/lazy): make resolve_id idempotent when the resolved id is already a lazy entry#9439

Merged
graphite-app[bot] merged 1 commit into
mainfrom
05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry
May 19, 2026
Merged

fix(dev/lazy): make resolve_id idempotent when the resolved id is already a lazy entry#9439
graphite-app[bot] merged 1 commit into
mainfrom
05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry

Conversation

@h-a-n-a

@h-a-n-a h-a-n-a commented May 18, 2026

Copy link
Copy Markdown
Member

Summary

This PR fixed an issue that resolve_id is not idempotent, causing lazy compilation to fail.

In LazyCompilationPlugin::resolve_id, calling ctx.resolve may trigger
other plugins' resolve_id hooks (in this case, vite alias plugin), and these hooks may also call ctx.resolve,
so it may cause LazyCompilationPlugin::resolve_id to be called multiple times for the same module
so that the original_id may be marked as rolldown-lazy=1 already.

Here we changed this behavior and check if the module has already been marked as a lazy entry.
Otherwise, delete modules[$STABLE_PROXY_MODULE_ID] may not be aligned with the module ID.

closes vitejs/vite#22454

Test

Added lazy-aliased-import test.

h-a-n-a commented May 18, 2026

Copy link
Copy Markdown
Member Author

How to use the Graphite Merge Queue

Add the label graphite: merge-when-ready to this PR to add it to the merge queue.

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@netlify

netlify Bot commented May 18, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 078c6aa
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6a0c04ca3d925c0008a97b6b

@h-a-n-a h-a-n-a marked this pull request as ready for review May 18, 2026 10:32
@h-a-n-a h-a-n-a force-pushed the 05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry branch from c6b369c to 19cea25 Compare May 18, 2026 10:32
@h-a-n-a h-a-n-a requested a review from sapphi-red May 18, 2026 10:32
@codspeed-hq

codspeed-hq Bot commented May 18, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing 05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry (d083bc7) with main (776ec77)

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.

@h-a-n-a h-a-n-a force-pushed the 05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry branch from eb9280c to 62a37e8 Compare May 18, 2026 10:40

h-a-n-a commented May 19, 2026

Copy link
Copy Markdown
Member Author

Merge activity

  • May 19, 6:34 AM UTC: The merge label 'graphite: merge-when-ready' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • May 19, 6:34 AM UTC: h-a-n-a added this pull request to the Graphite merge queue.
  • May 19, 6:39 AM UTC: Merged by the Graphite merge queue.

…lready a lazy entry (#9439)

## Summary

This PR fixed an issue that `resolve_id` is not idempotent, causing lazy compilation to fail.

In `LazyCompilationPlugin::resolve_id`, calling `ctx.resolve` may trigger
other plugins' resolve_id hooks (in this case, vite alias plugin), and these hooks may also call `ctx.resolve`,
so it may cause `LazyCompilationPlugin::resolve_id` to be called multiple times for the same module
so that the `original_id` may be marked as `rolldown-lazy=1` already.

Here we changed this behavior and check if the module has already been marked as a lazy entry.
Otherwise, `delete modules[$STABLE_PROXY_MODULE_ID]` may not be aligned with the module ID.

closes vitejs/vite#22454

## Test

Added `lazy-aliased-import` test.
@graphite-app graphite-app Bot force-pushed the 05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry branch from d083bc7 to 078c6aa Compare May 19, 2026 06:35
@graphite-app graphite-app Bot merged commit 078c6aa into main May 19, 2026
32 checks passed
@graphite-app graphite-app Bot deleted the 05-18-fix_dev_lazy_make_resolve_id_idempotent_when_the_resolved_id_is_already_a_lazy_entry branch May 19, 2026 06:39
@rolldown-guard rolldown-guard Bot mentioned this pull request May 20, 2026
shulaoda added a commit that referenced this pull request May 20, 2026
## [1.0.2] - 2026-05-20

### 🚀 Features

- devtools: emit package size in PackageGraphReady (#9434) by @IWANABETHATGUY
- devtools: classify package dependency types (#9427) by @IWANABETHATGUY
- devtools: map packages to modules and chunks (#9426) by @IWANABETHATGUY
- devtools: mark used packages (#9423) by @IWANABETHATGUY
- devtools: make duplicate packages discoverable (#9422) by @IWANABETHATGUY
- devtools: emit package metadata (#9421) by @IWANABETHATGUY
- update oxc to 0.132.0 (#9449) by @shulaoda
- update oxc to 0.131.0 (#9424) by @shulaoda
- allow checks.* to escalate emissions to hard errors (#9388) by @IWANABETHATGUY
- dev: support watcher options `include` and `exclude` (#9395) by @h-a-n-a
- emit warnings for invalid pure annotations (#9381) by @Kyujenius

### 🐛 Bug Fixes

- hash: keep chunk file names stable when an unrelated entry is added (#9444) by @hyf0
- call `codeSplitting.groups[].name` in deterministic order (#9457) by @sapphi-red
- dev/lazy: make `resolve_id` idempotent when the resolved id is already a lazy entry (#9439) by @h-a-n-a
- chunk-optimization: publish absorbed dynamic-entry namespace cross-chunk (#9448) by @IWANABETHATGUY
- treeshake: propagate pure annotation through compound exprs (#9431) by @Dunqing
- finalizer: skip redundant init call when barrel executes in same chunk (#9354) by @IWANABETHATGUY
- linking: initialize wrapped ESM re-export owners (#9353) by @IWANABETHATGUY
- do not inherit __toESM across chunks for named-only external imports (#9333) (#9415) by @IWANABETHATGUY
- watcher: don't write output or emit events after close() (#9328) by @situ2001
- chunk-optimization: avoid unsafe dynamic-only merges (#9398) by @IWANABETHATGUY
- cjs: rename CJS-wrapped locals that would shadow chunk-scope names (#9392) by @hyf0
- dev/lazy: watch lazy modules added in rebuilds (#9391) by @h-a-n-a

### 🚜 Refactor

- rolldown_dev: move dev example to break publish cycle (#9465) by @Boshen
- binding: drop unsafe napi string helper, hoist transform ArcStr (#9456) by @hyf0
- ecmascript_utils: split rewrite_ident_reference off JsxExt trait (#9417) by @IWANABETHATGUY
- use `ThreadsafeFunction::call_async_catch` (#9390) by @sapphi-red

### 📚 Documentation

- devtools: document @rolldown/debug usage and package graph consumption (#9435) by @IWANABETHATGUY
- replace `Inter` with system font stack in OG template SVG (#9240) by @yvbopeng
- remove `output.comments` warning as all issues have been resolved (#9393) by @sapphi-red
- in-depth: clarify @__PURE__ scope and document positions (#9389) by @Kyujenius
- readme: remove release candidate notice (#9387) by @shulaoda

### ⚡ Performance

- vite-resolve: cache importer existence checks (#9443) by @Brooooooklyn
- binding: reduce plugin string clones (#9436) by @Brooooooklyn

### 🧪 Testing

- enable `legal_comments_inline` test (#9394) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- bump pnpm to v11.1.2 (#9447) by @Boshen
- deps: update rust crates (#9461) by @renovate[bot]
- deps: update rollup submodule for tests to v4.60.4 (#9453) by @rolldown-guard[bot]
- deps: update test262 submodule for tests (#9454) by @rolldown-guard[bot]
- deps: update npm packages (#9430) by @renovate[bot]
- deps: update github actions (#9429) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to v0.25.1 (#9452) by @renovate[bot]
- deps: update rust crates (#9428) by @renovate[bot]
- revert allow checks.* to escalate emissions to hard errors (#9388) (#9438) by @IWANABETHATGUY
- update mimalloc-safe to 0.1.61 (#9413) by @shulaoda
- deny `todo`, `unimplemented`, and `print_stderr` clippy lints (#9412) by @Boshen
- deps: update mimalloc-safe to 0.1.60 (#9410) by @shulaoda
- remove `pip install setuptools` workaround for node-gyp on macOS (#9370) by @sapphi-red
- renovate: disable automerge to require manual approval (#9386) by @shulaoda
- deps: update napi (#9385) by @renovate[bot]

### ❤️ New Contributors

* @yvbopeng made their first contribution in [#9240](#9240)

Co-authored-by: shulaoda <[email protected]>
V1OL3TF0X pushed a commit to V1OL3TF0X/rolldown that referenced this pull request May 25, 2026
…lready a lazy entry (rolldown#9439)

## Summary

This PR fixed an issue that `resolve_id` is not idempotent, causing lazy compilation to fail.

In `LazyCompilationPlugin::resolve_id`, calling `ctx.resolve` may trigger
other plugins' resolve_id hooks (in this case, vite alias plugin), and these hooks may also call `ctx.resolve`,
so it may cause `LazyCompilationPlugin::resolve_id` to be called multiple times for the same module
so that the `original_id` may be marked as `rolldown-lazy=1` already.

Here we changed this behavior and check if the module has already been marked as a lazy entry.
Otherwise, `delete modules[$STABLE_PROXY_MODULE_ID]` may not be aligned with the module ID.

closes vitejs/vite#22454

## Test

Added `lazy-aliased-import` test.
V1OL3TF0X pushed a commit to V1OL3TF0X/rolldown that referenced this pull request May 25, 2026
## [1.0.2] - 2026-05-20

### 🚀 Features

- devtools: emit package size in PackageGraphReady (rolldown#9434) by @IWANABETHATGUY
- devtools: classify package dependency types (rolldown#9427) by @IWANABETHATGUY
- devtools: map packages to modules and chunks (rolldown#9426) by @IWANABETHATGUY
- devtools: mark used packages (rolldown#9423) by @IWANABETHATGUY
- devtools: make duplicate packages discoverable (rolldown#9422) by @IWANABETHATGUY
- devtools: emit package metadata (rolldown#9421) by @IWANABETHATGUY
- update oxc to 0.132.0 (rolldown#9449) by @shulaoda
- update oxc to 0.131.0 (rolldown#9424) by @shulaoda
- allow checks.* to escalate emissions to hard errors (rolldown#9388) by @IWANABETHATGUY
- dev: support watcher options `include` and `exclude` (rolldown#9395) by @h-a-n-a
- emit warnings for invalid pure annotations (rolldown#9381) by @Kyujenius

### 🐛 Bug Fixes

- hash: keep chunk file names stable when an unrelated entry is added (rolldown#9444) by @hyf0
- call `codeSplitting.groups[].name` in deterministic order (rolldown#9457) by @sapphi-red
- dev/lazy: make `resolve_id` idempotent when the resolved id is already a lazy entry (rolldown#9439) by @h-a-n-a
- chunk-optimization: publish absorbed dynamic-entry namespace cross-chunk (rolldown#9448) by @IWANABETHATGUY
- treeshake: propagate pure annotation through compound exprs (rolldown#9431) by @Dunqing
- finalizer: skip redundant init call when barrel executes in same chunk (rolldown#9354) by @IWANABETHATGUY
- linking: initialize wrapped ESM re-export owners (rolldown#9353) by @IWANABETHATGUY
- do not inherit __toESM across chunks for named-only external imports (rolldown#9333) (rolldown#9415) by @IWANABETHATGUY
- watcher: don't write output or emit events after close() (rolldown#9328) by @situ2001
- chunk-optimization: avoid unsafe dynamic-only merges (rolldown#9398) by @IWANABETHATGUY
- cjs: rename CJS-wrapped locals that would shadow chunk-scope names (rolldown#9392) by @hyf0
- dev/lazy: watch lazy modules added in rebuilds (rolldown#9391) by @h-a-n-a

### 🚜 Refactor

- rolldown_dev: move dev example to break publish cycle (rolldown#9465) by @Boshen
- binding: drop unsafe napi string helper, hoist transform ArcStr (rolldown#9456) by @hyf0
- ecmascript_utils: split rewrite_ident_reference off JsxExt trait (rolldown#9417) by @IWANABETHATGUY
- use `ThreadsafeFunction::call_async_catch` (rolldown#9390) by @sapphi-red

### 📚 Documentation

- devtools: document @rolldown/debug usage and package graph consumption (rolldown#9435) by @IWANABETHATGUY
- replace `Inter` with system font stack in OG template SVG (rolldown#9240) by @yvbopeng
- remove `output.comments` warning as all issues have been resolved (rolldown#9393) by @sapphi-red
- in-depth: clarify @__PURE__ scope and document positions (rolldown#9389) by @Kyujenius
- readme: remove release candidate notice (rolldown#9387) by @shulaoda

### ⚡ Performance

- vite-resolve: cache importer existence checks (rolldown#9443) by @Brooooooklyn
- binding: reduce plugin string clones (rolldown#9436) by @Brooooooklyn

### 🧪 Testing

- enable `legal_comments_inline` test (rolldown#9394) by @sapphi-red

### ⚙️ Miscellaneous Tasks

- bump pnpm to v11.1.2 (rolldown#9447) by @Boshen
- deps: update rust crates (rolldown#9461) by @renovate[bot]
- deps: update rollup submodule for tests to v4.60.4 (rolldown#9453) by @rolldown-guard[bot]
- deps: update test262 submodule for tests (rolldown#9454) by @rolldown-guard[bot]
- deps: update npm packages (rolldown#9430) by @renovate[bot]
- deps: update github actions (rolldown#9429) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to v0.25.1 (rolldown#9452) by @renovate[bot]
- deps: update rust crates (rolldown#9428) by @renovate[bot]
- revert allow checks.* to escalate emissions to hard errors (rolldown#9388) (rolldown#9438) by @IWANABETHATGUY
- update mimalloc-safe to 0.1.61 (rolldown#9413) by @shulaoda
- deny `todo`, `unimplemented`, and `print_stderr` clippy lints (rolldown#9412) by @Boshen
- deps: update mimalloc-safe to 0.1.60 (rolldown#9410) by @shulaoda
- remove `pip install setuptools` workaround for node-gyp on macOS (rolldown#9370) by @sapphi-red
- renovate: disable automerge to require manual approval (rolldown#9386) by @shulaoda
- deps: update napi (rolldown#9385) by @renovate[bot]

### ❤️ New Contributors

* @yvbopeng made their first contribution in [rolldown#9240](rolldown#9240)

Co-authored-by: shulaoda <[email protected]>
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.

vite 8.0.13 regression in dev mode with bundledDev:true and react lazy loading with resolve.alias

2 participants