-
Notifications
You must be signed in to change notification settings - Fork 678
perf(rolldown): improve sourcemap chain processing #6858
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
perf(rolldown): improve sourcemap chain processing #6858
Conversation
How to use the Graphite Merge QueueAdd the label graphite: merge 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. |
✅ Deploy Preview for rolldown-rs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for rolldown-rs canceled.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR optimizes the sourcemap chain processing by replacing the O(n log n) sorting algorithm with an O(n) partitioning approach. The change maintains the same ordering semantics (Load elements before Transform elements, with Transform elements sorted by plugin order) while improving performance.
Key Changes
- Replaced
sort_bywith explicit partitioning intoload_elementsandtransform_elementsvectors - Only Transform elements are sorted by plugin order, avoiding unnecessary comparisons
- The sourcemap chain is reconstructed with Load elements first, followed by sorted Transform elements
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Benchmarks Rust |
Merge activity
|
Replace O(n log n) sort_by with O(n) partition for sourcemap chain processing. Since only two variants exist (Load/Transform), we can: 1. Partition elements into Load and Transform vectors in O(n) time 2. Sort only Transform elements by plugin order 3. Reconstruct with Load elements first, then sorted Transform elements This removes unnecessary O(n log n) work and is faster on transform-heavy projects. Pre-allocated vectors reduce allocations. Addresses performance hint /performance/2
ddb032c to
f6e3845
Compare
Replace O(n log n) sort_by with O(n) partition for sourcemap chain processing. Since only two variants exist (Load/Transform), we can: 1. Partition elements into Load and Transform vectors in O(n) time 2. Sort only Transform elements by plugin order 3. Reconstruct with Load elements first, then sorted Transform elements This removes unnecessary O(n log n) work and is faster on transform-heavy projects. Pre-allocated vectors reduce allocations. Addresses performance hint /performance/2
f6e3845 to
341113b
Compare
## [1.0.0-beta.48] - 2025-11-10
:boom: Breaking Changes
- `this.emitFile` now respects `chunkFileNames` for chunk type
```js
// rolldown.config.js
export default {
output: {
chunkFileNames: 'chunks/[name]-[hash].js'
}
}
// In plugin
this.emitFile({
type: 'chunk',
id: './my-module.js'
});
// Before: Output might not follow chunkFileNames pattern
// After: Output follows 'chunks/[name]-[hash].js' pattern
```
- Deprecated top-level options removed
- `define` → `transform.define`
- `inject` → `transform.inject`
- `dropLabels` → `transform.dropLabels`
- `keepNames` → `output.keepNames`
- `profilerNames` → `output.generatedCode.profilerNames`
- Stable plugins moved from experimental
```js
// Before
import { replacePlugin, esmExternalRequirePlugin } from 'rolldown/experimental';
// After
import { replacePlugin, esmExternalRequirePlugin } from 'rolldown/plugins';
```
- `RolldownBuild#scan` is removed, now only available from `rolldown/experimental`
```js
// Before: scan was a method on RolldownBuild
const build = await rolldown(config);
await build.scan();
// After: import scan from rolldown/experimental
import { scan } from 'rolldown/experimental';
await scan(config);
```
### 💥 BREAKING CHANGES
- `this.emitFile` does not respect `chunkFileNames` (#6868) by @Copilot
- remove deprecated top-level `dropLabels` option (#6915) by @sapphi-red
- remove deprecated top-level `keepNames` option (#6914) by @sapphi-red
- remove deprecated top-level `profilerNames` option (#6913) by @sapphi-red
- remove deprecated top-level `define` and `inject` options (#6912) by @sapphi-red
- move stable plugins from experimental to `rolldown/plugins` (#6303) by @shulaoda
- node: remove experimental `RolldownBuild#scan`, only expose it from `rolldown/experimental` (#6889) by @hyf0
### 🚀 Features
- add side-effect detection for global constructors with primitive arguments (#6898) by @IWANABETHATGUY
- rust: use `BundleMode` to handle incremental build exhaustively (#6894) by @hyf0
- detect side-effect-free global function calls (#6897) by @IWANABETHATGUY
- expose `parseSync` / `parseAsync` function (#6866) by @sapphi-red
- skip `__toESM` helper when only named imports are used from CJS modules (#6850) by @Copilot
- rolldown_binding: expose `htmlInlineProxyPlugin` (#6856) by @shulaoda
- rolldown_plugin_html_inline_proxy: align `load` hook logic (#6855) by @shulaoda
- rolldown_plugin_html_inline_proxy: align `resolveId` hook logic (#6854) by @shulaoda
- rolldown_plugin_html_inline_proxy: initialize (#6853) by @shulaoda
### 🐛 Bug Fixes
- cli: support nested options in CLI properly (#6911) by @sapphi-red
- debug: ensure injecting `hook_resolve_id_trigger` correctly (#6908) by @hyf0
- use chunk-specific exports for entry module export detection (#6904) by @IWANABETHATGUY
- debug: ensure build get injected and add tests (#6896) by @hyf0
- error: return friendly error for bundler already closed scenario (#6878) by @hyf0
- improve dynamic entry processing with iterative approach (#6869) by @IWANABETHATGUY
- handle tsconfig option resolve error (#6871) by @sapphi-red
- handle error when creating output chunk directories (#6870) by @sapphi-red
- node: `NormalizedOutputOptionsImpl` and `NormalizedInputOptionsImpl` enumerable (#6861) by @hyf0
- node: keys of `RolldownOutput` should be enumerable (#6852) by @Copilot
### 🚜 Refactor
- rust: rename `BundleContext` to `BundleHandle` (#6893) by @hyf0
- rust: rename `build_span` to `bundle_span` (#6892) by @hyf0
- rust: introduce `PluginDriverFactory` to manage creation of `PluginDriver` (#6891) by @hyf0
- crates/rolldown_binding: remove useless `BindingBundlerImpl` (#6888) by @hyf0
- crates/rolldown_binding: rename `Bundler` to `ClassicBundler` and clarify the purpose (#6887) by @hyf0
- rust: rename `BuildFactory/Build` to `BundleFactory/Bundle` (#6886) by @hyf0
- rust: tweak incremental build related methods of `Bundler` (#6884) by @hyf0
- rust: manage build via `BuildFactory` for `Bundler` (#6883) by @hyf0
- node: implement a new `Bundler` that satisfy the usage of `RolldownBuild` (#6877) by @hyf0
- node: remove useless `nonEnumerable` decorator (#6862) by @hyf0
### 📚 Documentation
- add documentation for native replace plugin (#6315) by @shulaoda
- in-depth/directives: expand description of how directives are handled (#6882) by @sapphi-red
- in-depth/bundling-cjs: clarify the condition of `default` export interop (#6875) by @sapphi-red
- add troubleshooting section for `this` in exported functions (#6865) by @sapphi-red
- update prebuilt binaries list based on Node 24 platform support tier (#6864) by @sapphi-red
- remove unsupported [ext] placeholder from entryFileNames and chunkFileNames (#6859) by @Copilot
### ⚡ Performance
- rolldown: improve sourcemap chain processing (#6858) by @Brooooooklyn
### 🧪 Testing
- add test case for issue #6881 with scientific notation (#6906) by @IWANABETHATGUY
### ⚙️ Miscellaneous Tasks
- deps: update npm packages (#6918) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to v0.17.5 (#6917) by @renovate[bot]
- deps: lock file maintenance (#6907) by @renovate[bot]
- deps: update rust crates (#6905) by @renovate[bot]
- deps: update npm packages (#6903) by @renovate[bot]
- deps: update github-actions (#6902) by @renovate[bot]
- deps: update `oxc_resolver` and `oxc_resolver_napi` (#6901) by @shulaoda
- deps: update dependency rolldown-plugin-dts to v0.17.4 (#6895) by @renovate[bot]
- deps: update dependency tsdown to v0.16.1 (#6885) by @renovate[bot]
- deps: upgrade napi to remove linker args that skip missing symbols (#6867) by @Boshen
Co-authored-by: shulaoda <[email protected]>
Replace O(n log n) sort_by with O(n) partition for sourcemap chain processing. Since only two variants exist (Load/Transform), we can:
This removes unnecessary O(n log n) work and is faster on transform-heavy projects. Pre-allocated vectors reduce allocations.
Addresses performance hint /performance/2