feat(chunk-optimizer): skip circular dependency check when strict execution order is enabled#8886
Conversation
How to use the Graphite Merge QueueAdd 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. |
✅ Deploy Preview for rolldown-rs canceled.
|
There was a problem hiding this comment.
Pull request overview
This PR updates the generate-stage chunk optimizer to bypass the “would this merge create a circular chunk dependency?” safeguard when strictExecutionOrder is enabled, based on the assumption that init_*() wrappers make such cycles safe.
Changes:
- Skip the circular chunk dependency check during facade-chunk merge-op discovery when
strictExecutionOrderis enabled. - Keep the existing circular-dependency prevention behavior unchanged when
strictExecutionOrderis not enabled.
Merging this PR will not alter performance
Comparing Footnotes
|
...own/optimization/chunk_merging/skip_circular_dep_check_with_strict_execution_order/_test.mjs
Outdated
Show resolved
Hide resolved
Merge activity
|
…cution order is enabled (#8886) ## Summary When `strictExecutionOrder` is enabled, rolldown wraps modules in `init_()` functions that guard execution order at runtime. This means circular chunk dependencies are safe — the wrappers ensure correct initialization regardless of load order. Currently, the chunk optimizer conservatively skips merging chunks that would create circular dependencies. This PR skips that circular dependency check when `strictExecutionOrder` is enabled, allowing more aggressive chunk merging and producing fewer output chunks. ## Changes - Wrap the circular dependency check in `chunk_optimizer.rs` with `!self.options.is_strict_execution_order_enabled()`, so it is bypassed when strict execution order is active. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
a6ee216 to
1226947
Compare
## [1.0.0-rc.12] - 2026-03-25 ### 🚀 Features - chunk-optimizer: skip circular dependency check when strict execution order is enabled (#8886) by @hyf0 ### 🐛 Bug Fixes - emit build warnings during watch mode rebuilds (#8897) by @IWANABETHATGUY - lazy-barrel: load import-then-export specifiers when barrel has local exports (#8895) by @shulaoda - correct execution order of transferred CJS init calls (#8877) by @IWANABETHATGUY - mcs: `entriesAware` should calculate sizes without duplication (#8887) by @hyf0 - non-deterministic chunk generation (#8882) by @sapphi-red - `is_top_level` incorrectly treats strict-mode scopes as top-level (#8878) by @Dunqing ### 🚜 Refactor - treeshake: migrate SideEffectDetector to Oxc's MayHaveSideEffects trait (#8624) by @Dunqing ### 🧪 Testing - make dev server tests deterministic by replacing fixed sleeps with event-driven polling (#8561) by @Boshen ### ⚙️ Miscellaneous Tasks - deps: update dependency vite-plus to v0.1.14 (#8902) by @camc314 - deps: update dependency oxfmt to ^0.42.0 (#8891) by @renovate[bot] - deps: update rust crate oxc_sourcemap to v6.1.1 (#8890) by @renovate[bot] - remove Rolldown MF plan (#8883) by @shulaoda - deps: update rollup submodule for tests to v4.60.0 (#8881) by @sapphi-red - deps: update test262 submodule for tests (#8880) by @sapphi-red - deps: upgrade oxc crates to 0.122.0 (#8879) by @shulaoda Co-authored-by: shulaoda <[email protected]>
…mizer The circular dependency check added by rolldown#8371 was correct for chunks containing the runtime module or runtime-dependent modules (e.g., __commonJSMin, __toESM), but overly conservative for regular ESM chunks. ESM handles circular imports fine — modules are initialized lazily and circular references are resolved at access time. Only runtime helpers need to be available synchronously before the importing module executes, making circular chunk imports harmful only when runtime is involved. This fix scopes the circular dependency check to only apply when the source chunk contains: 1. The runtime module itself, OR 2. Modules that depend on runtime helpers (depended_runtime_helper) For all other pure ESM chunks, the merge is allowed regardless of whether it would create circular chunk imports. In large applications, this was causing +53% more JS files and +8% bundle size because the cycle detection blocked almost all common chunk merges. Closes rolldown#8371 regression Refs: rolldown#8361, rolldown#8886, rolldown#8910, rolldown#8915

Summary
When
strictExecutionOrderis enabled, rolldown wraps modules ininit_()functions that guard execution order at runtime. This means circular chunk dependencies are safe — the wrappers ensure correct initialization regardless of load order.Currently, the chunk optimizer conservatively skips merging chunks that would create circular dependencies. This PR skips that circular dependency check when
strictExecutionOrderis enabled, allowing more aggressive chunk merging and producing fewer output chunks.Changes
chunk_optimizer.rswith!self.options.is_strict_execution_order_enabled(), so it is bypassed when strict execution order is active.🤖 Generated with Claude Code