NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #2562 most downloaded on npm
Fast JavaScript/TypeScript bundler in Rust with Rollup-compatible API.
Last release 5 days ago
30 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Most releases are documented
notes for 33 of 42 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
614 releases · first in 2024
Nothing published for this version
Nothing published for this version
Nothing published for this version
One column per month.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
node: add output.codeSplitting option and deprecate output.advancedChunks (#7855) by @hyf0
output.codeSplitting option and deprecate output.advancedChunks (#7855) by @hyf0insert (#7812) by @IWANABETHATGUYslice (#7807) by @IWANABETHATGUYdynamicImportInCjs is false (#7823) by @shulaodaadvanced_chunks to manual_code_splitting (#7856) by @hyf0experimental.disableLiveBindings option (#7820) by @sapphi-red@linkcode where possible (#7824) by @sapphi-redchecks.* (#7801) by @sapphi-redCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
⚡ Inline Dynamic Imports for Statically Imported Modules
⚡ Inline Dynamic Imports for Statically Imported Modules
Before:
import { foo } from './foo.js'
console.log(foo)
import('./foo.js').then(mod => console.log(mod.foo))
Previously, import('./foo.js') would create a separate async chunk.
After:
var foo_exports = /* @__PURE__ */ __exportAll({ foo: () => foo });
const foo = "foo";
console.log(foo);
Promise.resolve().then(() => foo_exports).then((mod) => console.log(mod.foo));
The dynamic import is inlined since foo.js is already statically imported.
import(..) (#7726) by @hyf0preserve_entry_signatures from AddEntryModuleMsg (#7762) by @shulaodauser_defined_entries by reference (#7756) by @shulaodaResolvedId correctly (#7746) by @hyf0ModuleLoader (#7731) by @shulaodaresolve_user_defined_entries (#7727) by @shulaodaoutput.dynamicImportInCjs related rollup test results (#7776) by @sapphi-redtest: vite-tests label (#7770) by @shulaodaCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
import(..) (#7726) by @hyf0preserve_entry_signatures from AddEntryModuleMsg (#7762) by @shulaodauser_defined_entries by reference (#7756) by @shulaodaResolvedId correctly (#7746) by @hyf0ModuleLoader (#7731) by @shulaodaresolve_user_defined_entries (#7727) by @shulaodaoutput.dynamicImportInCjs related rollup test results (#7776) by @sapphi-redtest: vite-tests label (#7770) by @shulaodaexperimental/devtools: rename InputOptions#debug to InputOptions#devtools (#7686) by @Copilot
should_transform_js for raw options (#7697) by @shulaodaoutput.dynamicImportInCjs option (#7677) by @shulaodaChecksOptions type (#7653) by @sapphi-redStableModuleId as the map key if possible (#7718) by @hyf0StableModuleId instead of &str from Module#stable_id() (#7717) by @hyf0Module#stable_id() (#7716) by @hyf0StableModuleId type (#7715) by @hyf0id.as_arc_str().clone().into() (#7714) by @hyf0ModuleId#resource_id and use as_arc_str directly (#7710) by @hyf0Module#id_clone (#7709) by @hyf0Module#id_as_str and use Module#id directly (#7708) by @hyf0ExternalModule#id have the type ModuleId (#7707) by @hyf0Module#id to Module#id_as_str (#7706) by @hyf0ModuleId instead of raw ArcStr for ScanStageCache (#7701) by @hyf0ModuleId as the type of ResolvedId#id (#7694) by @hyf0resolved_request_info.rs to resolved_id.rs and move its contents (#7687) by @hyf0<CWD>/node_modules/.rolldown (#7692) by @hyf0InvalidOption for hash placeholder generation errors (#7674) by @shulaodahomepage field to package.json (#7648) by @trivikrCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
✨ TypeScript Project References Support
✨ TypeScript Project References Support
tsconfig⚡ Optimize Dynamic Entry Facade Chunks
Before
entry.js ──────► chunk-common.js (contains counter.js content)
│
└─ import() ─► counter-facade.js ─► chunk-common.js
// counter-facade.js (unnecessary extra file)
export { counter } from './chunk-common.js'
After
entry.js ──────► chunk-common.js (contains counter.js content)
│
└─ import() ─► chunk-common.js (direct reference)
🏷️ Rename __export to __exportAll
rolldown-plugin-dts to v0.20.0 for compatibilityCANNOT_CALL_NAMESPACE warning (#7636) by @sapphi-red__export to __exportAll to be compatible with cjs-module-lexer (#7640) by @IWANABETHATGUYCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
✨ Support importerId hook filter
✨ Support importerId hook filter
import { defineConfig } from 'rolldown';
import { importerId, include } from '@rolldown/pluginutils';
export default defineConfig({
input: ['./index.ts'],
plugins: [{
name: 'my-plugin',
resolveId: {
filter: [include(importerId(/main\.js$/))],
handler(id, importer) {
// ...
},
},
}],
});
MIXED_EXPORT error to MIXED_EXPORTS (#7565) by @sapphi-redid property to exporter in CIRCULAR_REEXPORT error (#7592) by @sapphi-redids property to CIRCULAR_DEPENDENCY error (#7591) by @sapphi-reddevMode.lazy (#7549) by @hyf0parseAst function errors (#7568) by @sapphi-redexporter property to MISSING_EXPORT error (#7564) by @sapphi-redid property to PARSE_ERROR error (#7563) by @sapphi-redOutputPlugin (#7610) by @KazariEXpostBanner content should be placed after shebang (#7583) by @bteanotify.pollInternal and notify.compareContents (#7595) by @sapphi-redcleanDir work with default output directory (#7579) by @shulaodaMISSING_NAME_OPTION_FOR_UMD_EXPORT error to MISSING_NAME_OPTION_FOR_IIFE_EXPORT error (#7566) by @sapphi-redmodule identifier (#7544) by @leegeunhyeokstable_id field from PARSE_ERROR error (#7593) by @sapphi-redWatcher struct (#7551) by @hyf0LinkingMetadata::stmt_info_included to check if a stmt_info is included (#7572) by @IWANABETHATGUYLinkingMetadata::is_included to check if a module is included (#7571) by @IWANABETHATGUYkill-port in ignoreDeps in renovate.json (#7619) by @sapphi-redpnpm install during tests (#7560) by @hyf0kill-port@1 to improve performance (#7575) by @hyf0Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
✨ Post-Minification Banner & Footer
✨ Post-Minification Banner & Footer
postBanner and postFooter options allow adding content to chunks after minification, ensuring your comments won't be stripped by the minifier:export default {
output: {
minify: true,
postBanner: '/* My Library v1.0.0 */', // Always preserved
},
};
inlineDynamicImports options (#7539) by @Copilotmemfs from rolldown/experimental for browser builds (#7490) by @CopilotpostBanner and postFooter (#7487) by @sevenc-nanashirolldown_plugin_lazy_compilation (#7488) by @hyf0experimental.transform_hires_sourcemap: 'boundary' by default (#7478) by @sapphi-redoutput.exports, output.format, output.hash_characters (#7542) by @sapphi-red__proto__ export for module namespace correctly (#7534) by @sapphi-red__proto__ export correctly (#7533) by @sapphi-redminify: 'dce-only' (#7520) by @sapphi-redInfinity for chunk_limit (#7497) by @shulaodano entry found for key error when merging CJS namespace exports (#7474) by @sapphi-redexperimental.hmr to experimental.devMode (#7527) by @hyf0closeBundle behavior (#7525) by @sapphi-redcrates/rolldown/tests/rollup (#7480) by @sapphi-redbanner/footer/intro/outro for config variants (#7532) by @sapphi-reddce/dce_of_decorators esbuild test is now passing (#7531) by @sapphi-red.github/instructions/bug-investigation.instructions.md (#7506) by @sapphi-redCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
Added checks.pluginTimings option to emit warnings when plugins significantly impact build performance
⏱️ Plugin Timing Analysis
checks.pluginTimings option to emit warnings when plugins significantly impact build performance[!WARNING] For hooks using
ctx.resolve()orctx.load(), the reported time includes waiting for other plugins, which may overestimate that plugin's actual cost.Additionally, since plugin hooks execute concurrently, the statistics represent accumulated time rather than wall-clock time. The measured duration also includes Rust-side processing overhead, Tokio async scheduling overhead, NAPI data conversion overhead, and JavaScript event loop overhead.
CIRCULAR_REEXPORT error (#7337) by @CopilotyarnPnp option when pnp is detected (#5791) by @sapphi-redprocess.on('exit') instead of signal-exit on webcontainers (#7421) by @sapphi-redimports when an import is removed (#7348) by @sapphi-redNormalizedInputOptions#cwd should always exists (#7360) by @hyf0scripts/src/esbuild-tests (#7377) by @sapphi-redpluginTimings documentation with detection mechanism (#7428) by @shulaoda--grep work and document it (#7431) by @sapphi-redwatchChange hook create / delete tests (#7349) by @sapphi-redcontinuous generate hmr patch and debounce bundle tests (#7368) by @hyf0ignoreReasons due to architectural limitation (#7434) by @Copilotjust update-esbuild-diff and add it to CI (#7404) by @sapphi-redtsconfig: true in rust tests (#7389) by @sapphi-redtest-dev-server (#7351) by @hyf0SymbolRefFlags (#7358) by @IWANABETHATGUYCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
Drop i686-pc-windows-msvc target support
💥 Breaking Changes
i686-pc-windows-msvc target support🚀 Chunk Merging Optimization
preserveEntrySignature is not strict)Before:
entry.js → imports → shared.js (common chunk)
entry2.js → imports → shared.js
Output: 3 chunks (entry.js, entry2.js, shared.js)
After:
entry.js → contains shared code
entry2.js → imports → entry.js
Output: 2 chunks (entry.js, entry2.js)
i686-pc-windows-msvc target support (#7230) by @sapphi-redisLegacy callback (#7321) by @shulaodadisableCache option (#6763) by @sapphi-redcreateTokioRuntime for tsdown (#7264) by @shulaodamoduleSideEffects for already loaded modules (#7254) by @shulaodacssScopeTo for scoped CSS tree-shaking (#7240) by @shulaodaoutput.generateCode.preset: 'es2015' should set output.generateCode.symbols: true by default (#7314) by @sapphi-redregister_modules async (#7289) by @hyf0defer_sync_scan_data in non-incremental build mode (#7255) by @shulaodaisLegacy callback for proper legacy detection (#7260) by @shulaoda?inline=true query for inlined CSS (#7245) by @shulaodaremoveClient async (#7313) by @hyf0cssScopeTo from JS module options (#7253) by @shulaodaresolve_asset_urls_in_css (#7250) by @shulaodatrustPolicyExclude for chokidar and semver (#7302) by @sapphi-redhtml5gum to 0.8.1 (#7265) by @shulaodagetModuleOptions from PluginContext (#7266) by @shulaodanul to workaround https://github.com/anthropics/claude-c… (#7237) by @IWANABETHATGUYCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
Change output.generatedCode.profilerNames default to false
💥 Breaking Change
output.generatedCode.profilerNames default to false🔧 Vite-Style TypeScript Configuration
tsconfig: true to enable auto-discovery mode where each module finds its nearest tsconfig.json. See more details here⚙️ Toolchain Upgrade
output.generatedCode.profilerNames default to false (#7139) by @Copilotplugins (#7210) by @sxzzinline parameter to cssMinify callback (#7191) by @shulaodarender_chunk to replace __VITE_IS_MODERN__ flag (#7178) by @shulaodaDevEngine::hasLatestBuildOutput with DevEngine::getBundleState (#7145) by @sapphi-red@vite-ignore comment (#7141) by @shulaodaasset_resolver logic (#7137) by @shulaodatry_fs_resolve logic (#7136) by @shulaodaviteAssetImportMetaUrlPlugin and add dynamic URL tests (#7119) by @shulaodahtml5gum with correct span tracking (#7193) by @shulaodaoriginal_file_name (#7175) by @shulaodafilename instead of reference_id for imported assets (#7174) by @shulaodapublic_base for html_result_map key (#7169) by @shulaodafile_to_url cache (#7166) by @shulaodaFileEmitter::emit_file causing duplicate asset emissions (#7164) by @shulaodareference_id parsing in render_asset_url_in_js (#7143) by @shulaodainlineDynamicImports is enabled (#7129) by @IWANABETHATGUYparse / parseSync functions (#7127) by @sapphi-redoxc_resolver for tsconfig discovery (#7220) by @shulaodaresolve_file for tsconfig discovery (#7216) by @shulaodaViteMetadata::get_or_insert_default() (#7189) by @shulaodaViteMetadata::get() to always return a value (#7188) by @shulaodaguess_mime_skip_utf8_check for binary assets (#7161) by @shulaodaAssetUrlIter (#7144) by @shulaodaplaywright install in case playwright binary is missing (#7226) by @sapphi-redwaitBuildFinished if ERROR event occurs (#7224) by @sapphi-redoxc_resolver_napi to 11.14.0 (#7217) by @shulaodarolldown-plugin-dts to 0.18.0 (#7125) by @shulaodaCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
Support for Node.js module.exports export in ESM `js // ESM file can now export module.exports export const foo = 'foo' export { foo as 'module.export
🔄 Node.js ESM Compatibility
module.exports export in ESM// ESM file can now export module.exports
export const foo = 'foo'
export { foo as 'module.exports' }
⚙️ Toolchain Upgrade
get_hash utility function (#7059) by @shulaodaCSSEntriesCache (#7015) by @shulaodatransformIndexHtml logic (#7010) by @shulaodabindingifyViteHtmlPlugin (#7008) by @shulaodageneratedCode.symbols for reexport dynamic modules. (#6993) by @IWANABETHATGUYmodule.exports ESM export (#6967) by @Copilotcanonical name not found for "__toESM" error when only named imports are used from a CJS module (#7094) by @sapphi-redrender_asset_url_in_js (#7061) by @shulaodaget_or_insert_default for HTMLProxyResult (#7052) by @shulaodacommonjs-proxy CSS requests (#7050) by @shulaodais_css_module (#7049) by @shulaodais_css_request (#7048) by @shulaodahandle_style_tag_or_attribute (#7038) by @shulaodaconfig to htmlInlineProxyPlugin (#7036) by @shulaoda/*$vite$:1*/ correctly (#7018) by @shulaodastyle_urls (#7017) by @shulaodaviteHtmlPlugin related logic (#7013) by @shulaodaensure_latest_bundle_output shouldn't loop infinitely (#6974) by @hyf0DevEngine#ensure_latest_bundle_output should schedule a rebuild task if there're no queued tasks (#6968) by @hyf0root instead of cwd (#7035) by @shulaodaroot instead of cwd (#7034) by @shulaodaroot instead of cwd (#7033) by @shulaodaroot instead of cwd (#7032) by @shulaodaroot instead of cwd (#7031) by @shulaodaroot instead of cwd (#7030) by @shulaodaroot instead of cwd (#7029) by @shulaodarolldown_dev crate (#6997) by @hyf0rolldown_dev crate (#6996) by @hyf0Fs (#6998) by @shulaodais_module_facade() to is_entry_point() for clarity (#6994) by @IWANABETHATGUYResult<_> from the return type of BundleCoordinator::schedule_build_if_stale (#6980) by @sapphi-redCoordinatorStatus to CoordinatorStateSnapshot (#6973) by @hyf0InitialBuildState with CoordinatorState (#6972) by @hyf0Debug, Clone, Copy for CjsGlobalAssignmentType (#6971) by @camc314CoordinatorMsg::HasLatestBuildOutput with GetStatus (#6960) by @hyf0ensure_current_build_finish shouldn't block the coordinator's event loop (#6959) by @hyf0collect_vec (#6999) by @IWANABETHATGUYrolldown_debug to rolldown_devtools (#7026) by @hyf0recover_from_initial_build_error to error_recovery/from_initial_build_syntax_error (#6990) by @hyf0typescript/consistent-type-imports rule (#6987) by @shulaodarolldown: oxc_resolver v11.13.2 (#6956) by @Boshen
experimental.hmr is set for APIs other than dev (#6860) by @Copilotanyhow::Context::context where applicable (#6952) by @sapphi-redrolldown_watcher to rolldown_fs_watcher (#6958) by @hyf0Co-authored-by: sapphi-red 49056869+sapphi-red@users.noreply.github.com
node/exports: export ./plugins in publishConfig for rolldown (#6926) by @Copilot
./plugins in publishConfig for rolldown (#6926) by @Copilotmeta.ast for transform hook (#6919) by @IWANABETHATGUYmeta.ast + meta.nativeString (#6922) by @IWANABETHATGUYCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
Deprecated top-level options are removed
:boom: Breaking Changes
this.emitFile now respects chunkFileNames for chunk type// 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
Note: If you're using
rolldown-plugin-dts, please upgrade to version>=0.17.5to ensure compatibility with this change.
Deprecated top-level options are removed
define → transform.defineinject → transform.injectdropLabels → transform.dropLabelskeepNames → output.keepNamesprofilerNames → output.generatedCode.profilerNamesStable plugins are moved from rolldown/experimental
// Before
import { replacePlugin, esmExternalRequirePlugin } from 'rolldown/experimental';
// After
import { replacePlugin, esmExternalRequirePlugin } from 'rolldown/plugins';
RolldownBuild#scan is removed, now only available from rolldown/experimental// 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);
this.emitFile does not respect chunkFileNames (#6868) by @CopilotdropLabels option (#6915) by @sapphi-redkeepNames option (#6914) by @sapphi-redprofilerNames option (#6913) by @sapphi-reddefine and inject options (#6912) by @sapphi-redrolldown/plugins (#6303) by @shulaodaRolldownBuild#scan, only expose it from rolldown/experimental (#6889) by @hyf0BundleMode to handle incremental build exhaustively (#6894) by @hyf0parseSync / parseAsync function (#6866) by @sapphi-red__toESM helper when only named imports are used from CJS modules (#6850) by @CopilothtmlInlineProxyPlugin (#6856) by @shulaodaload hook logic (#6855) by @shulaodaresolveId hook logic (#6854) by @shulaodahook_resolve_id_trigger correctly (#6908) by @hyf0NormalizedOutputOptionsImpl and NormalizedInputOptionsImpl enumerable (#6861) by @hyf0RolldownOutput should be enumerable (#6852) by @CopilotBundleContext to BundleHandle (#6893) by @hyf0build_span to bundle_span (#6892) by @hyf0PluginDriverFactory to manage creation of PluginDriver (#6891) by @hyf0BindingBundlerImpl (#6888) by @hyf0Bundler to ClassicBundler and clarify the purpose (#6887) by @hyf0BuildFactory/Build to BundleFactory/Bundle (#6886) by @hyf0Bundler (#6884) by @hyf0BuildFactory for Bundler (#6883) by @hyf0Bundler that satisfy the usage of RolldownBuild (#6877) by @hyf0nonEnumerable decorator (#6862) by @hyf0default export interop (#6875) by @sapphi-redthis in exported functions (#6865) by @sapphi-redoxc_resolver and oxc_resolver_napi (#6901) by @shulaodaCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
meta.magicString and meta.ast now only initialized once (#6828) by @IWANABETHATGUY
meta.magicString and meta.ast now only initialized once (#6828) by @IWANABETHATGUYminify function (#6836) by @sapphi-red__VITE_PRELOAD__ (#6833) by @shulaodarenderBuiltUrl (#6835) by @shulaodaIS_MODERN_FLAG (#6823) by @shulaodaCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
default preserveEntrySignatures to 'exports-only' to align with Rollup (#6723) by @Copilot
preserveEntrySignatures to 'exports-only' to align with Rollup (#6723) by @CopilotEVAL warning message (#6776) by @sapphi-red__toESM when not needed to reduce output size (#6751) by @CopilotEMPTY_IMPORT_META warning message (#6761) by @sapphi-redRemovedPureCSSFilesCache logic (#6745) by @shulaodagenerateBundle logic (#6744) by @shulaodafreeExternalMemory to free external memory immediately (#6721) by @hyf0this.resolve is also tracked under corresponding session (#6798) by @hyf0preserveEntrySignatures: 'allow-extension' (#6753) by @Copilotnames field (#6742) by @shulaoda#[napi(gettter)], use function call directly (#6694) by @hyf0freeExternalMemory (#6781) by @hyf0default import from CJS modules" section (#6795) by @sapphi-redesmExternalRequirePlugin link more prominent (#6792) by @sapphi-redcleanDir option (#6741) by @hyf0attachDebugInfo: 'none' (#6738) by @IWANABETHATGUYpackages/rolldown/tests except diagnostics directory (#6772) by @Copilotpreserve_entry_signatures: 'allow-extension' (#6727) by @Copilotavoid define deprecation warning when loading a config file (#6641) by @sapphi-red
legacyInconsistentCjsInterop option (#6687) by @sapphi-redCSSStyles (#6691) by @shulaodavitejs/vite#20585 (#6684) by @shulaodatransform.jsx correctly (#6698) by @ocavuegenerateBundle outputs (#6647) by @aprosaildefine deprecation warning when loading a config file (#6641) by @sapphi-redtransformToRollupOutput when needed (#6695) by @hyf0transformToRollupOutput into mutable and immutable versions (#6693) by @hyf0BindingOutputs (#6692) by @hyf0CSSEntriesCache (#6685) by @shulaodaBindingRenderBuiltUrl (#6653) by @shulaodaexperimental.nativeMagicString (#6713) by @IWANABETHATGUYoptimization (#6719) by @IWANABETHATGUYoutput.cleanDir timing behavior for plugin compatibility (#6682) by @CopilotpreserveEntrySignature doc (#6661) by @IWANABETHATGUYtreeshake (#6650) by @IWANABETHATGUYtypedoc dependency and cleanup unused documentation generation (#6686) by @Copilotoxlint --type-aware (#5660) by @BoshenDevTestMeta#dev (#6672) by @hyf0DevTestMeta under TestMeta#dev to control dev related behaviors (#6666) by @hyf0Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
Deprecated some top-level options
:boom: Breaking Changes
jsx removed, use transform.jsx insteadoutput.minifyInternalExports now enabled by default:dart: Enhanced Tree-Shaking
// config.json
{
"apiUrl": "[https://api.example.com](https://api.example.com/)",
"timeout": 5000,
"retries": 3,
"debug": false
}
// main.js
// Before: Entire JSON was included in bundle
import config from './config.json';
console.log(config.apiUrl);
// After: Only the used property is included
// Bundle now contains just the apiUrl value
new Uint8Array(), new Int32Array(), etc.) marked as pure:gear: Configuration Improvements
output.cleanDir optiondefine → transform.defineinject → transform.injectdropLabels → transform.dropLabelskeepNames → output.keepNamesprofilerNames → output.generatedCode.profilerNamesoutput.minifyInternalExports for format: 'es' or minify: true (#6594) by @sapphi-redInputOptions.jsx, prefer transform.jsx always (#6548) by @hyf0transform.jsx (#6630) by @shulaodainject_to_body function (#6622) by @shulaodais_legacy field (#6620) by @shulaodaviteHtmlPlugin (#6609) by @shulaodaviteCSSPostPlugin (#6606) by @shulaodaviteCSSPlugin (#6605) by @shulaodaoutput.clearDir to clean up dir before build (#6486) by @aprosailRolldownOutput instead of BindingOutputs from onOutput (#6563) by @sapphi-reddropLabels and add transform.dropLabels (#6557) by @hyf0keepNames and add output.keepNames (#6556) by @hyf0profilerNames and add output.generatedCode.profilerNames (#6555) by @hyf0inject and define and add transform.define, transform.inject (#6544) by @hyf0experimental.nativeMagicString (#6514) by @IWANABETHATGUYpackage_json_path from resolveId hook (#6434) by @sapphi-redshould have idx error happens with deferSyncScanData + incremental rebuild (#6568) by @sapphi-redbundler.scandoesn't get handled (#6547) by @Copilotsourcemap is disabled (#6510) by @IWANABETHATGUYBindingAssetInlineLimit (#6625) by @shulaodaBindingAssetPluginConfig (#6624) by @shulaodaviteCSSPlugin config (#6610) by @shulaodaTaskInput into enum to reduce invalid states (#6575) by @hyf0ScanStageCache#merge (#6564) by @IWANABETHATGUYclient_id to check if module is executed for test environment (#6566) by @hyf0&str or JsString to avoid unnecessary clone (#6523) by @hyf0&str to avoid unnecessary clone (#6520) by @hyf0/guide/in-depth/ to /in-depth/ (#6554) by @CopilotAdditional Thanks in acknowledgements page (#6507) by @hyf0experimental.nativeMagicString (#6504) by @IWANABETHATGUYcreateTokioRuntime (#6618) by @hyf0ClientInput (#6565) by @hyf0cross_module_optimization stage parallel (#6552) by @IWANABETHATGUYreplacePlugin to compatible with rollup (#6639) by @IWANABETHATGUYbuild.ts (#6621) by @IWANABETHATGUYcargo publish --workspace work (#6287) by @Boshenopposite_minify_internal_exports and remove minify_internal_exports extend test (#6596) by @hyf0BindingBuiltinPluginName (#6574) by @shulaodanotify crate (#6573) by @Boshen.len() and .is_empty() to HybridIndexVec (#6570) by @sapphi-redAGENT.md with verified prompts (#6533) by @hyf0too-many-lines-threshold to 200 (#6530) by @shulaodaCo-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
:zap: Parallel Sourcemap Generation with experimental.nativeMagicString
:zap: Parallel Sourcemap Generation with experimental.nativeMagicString
transform hookBefore: Transform + sourcemap both blocked in JS :x: After: Only transform in JS, sourcemaps in Rust thread :white_check_mark:
Comparison in apps/10000 benchmark:
See more details: Document & Benchmark
processedHtml logic (#6494) by @shulaodanativeMagicString options (#6469) by @IWANABETHATGUYclose (#6483) by @hyf0output.paths (#6470) by @IWANABETHATGUYpreserveEntrySignatures with includeDependenciesRecursively option (#6468) by @hyf0on_hmr_updatrs to node (#6454) by @hyf0on_output to node (#6453) by @hyf0on_hmr_updatrs callback (#6443) by @hyf0experimental.nativeMagicString: false (#6488) by @IWANABETHATGUYresolve.modules into account (#6484) by @PickachuadvancedChunks#includeDependenciesRecursively to rust (#6448) by @hyf0minify: { compress: true } (#6433) by @sapphi-redBundler for public usage (#6480) by @hyf0BindingClientHmrUpdate (#6456) by @hyf0DevOnHmrUpdates API (#6455) by @hyf0experimental.strictExecutionOrder (#6450) by @hyf0why-plugin-hook-filter in depth (#6446) by @IWANABETHATGUYDiagnosticOptions#stabilize_path (#6447) by @hyf0BindingHmrOutput (#6457) by @hyf0utils.rs (#6460) by @shulaoda"type": "module" in package.json (#6441) by @iiio2rolldown: oxc v0.94.0 (#6428) by @Boshen
RebuildStrategy#Auto by default (#6420) by @hyf0DevOptions#on_output (#6412) by @hyf0DevOptions#rebuild_strategy (#6396) by @hyf0RebuildStrategy::Auto to issue rebuild automatically if detecting full reload hmr update (#6395) by @hyf0call_id for renderChunk hook (#6392) by @hyf0DevEngine#close (#6377) by @hyf0DevEngine#close (#6376) by @hyf0watchChange hook (#6403) by @sapphi-redeval and arguments (#6381) by @sapphi-redPackageJson and remove unused fields (#6418) by @hyf0BindingResult to pass errors from rust to js (#6390) by @hyf0BindingError to cover JsError and NativeError (#6388) by @hyf0BindingError to NativeError (#6387) by @hyf0setTimeout -> clearTimeout (#6375) by @sapphi-redthis.addWatchFile (#5219) by @sapphi-redSnapshotSection to organize snapshot content (#6407) by @hyf0ArtifactsSnapshot and BuildRoundOutput into standalone files (#6406) by @hyf0ArtifactsSnapshot to make generating snapshot more clear (#6405) by @hyf0GitHub casing (#6401) by @iiio2rolldown_binding_watcher crate (#6386) by @hyf0normalizeErrors into aggregateBindingErrorsIntoError (#6389) by @hyf0add_watch_file that the path should be a normalized absolute path (#6371) by @sapphi-redCo-authored-by: sapphi-red 49056869+sapphi-red@users.noreply.github.com
dev: remove deprecated new field from HMR options and related configurations (#6337) by @hyf0
output.generatedCode.symbols (#6335) by @IWANABETHATGUYvite-ignore attribute (#6348) by @shulaodahtml5ever and markup5ever_rcdom (#6327) by @shulaodaon_output callback (#6330) by @hyf0disable_watcher (#6329) by @hyf0hasLatestBuildOutput instead of scheduleBuildIfStale and add edit-reload test (#6321) by @sapphi-redHmrManager to HmrState and tweak namings (#6358) by @hyf0Bundler to expose hmr related methods (#6356) by @hyf0html5gum instead (#6343) by @shulaodanew field from HMR options and related configurations (#6337) by @hyf0cjs_ast_analyzer immutable for better reuse (#6326) by @IWANABETHATGUYcatalog: to unify version of all dependencies (#6339) by @hyf0Co-authored-by: shulaoda 165626830+shulaoda@users.noreply.github.com
20%-30% faster sourcemap generation
⚡ Sourcemap Performance Boost
MagicString binding (#6289) by @IWANABETHATGUYCow<str> instead of &str (#6288) by @IWANABETHATGUYsourcemap_ignore_list js function call (#6313) by @IWANABETHATGUYreplace (#6312) by @IWANABETHATGUYlto: thin in profile mode for better profiling experience. (#6320) by @IWANABETHATGUYSupport for /* @__NO_SIDE_EFFECTS__ */ annotation
⚡ MacOS Performance Boost
🎯 Cross-Chunk Optimization
/* @__NO_SIDE_EFFECTS__ */ annotation/* @vite-ignore */ comment for dynamic imports (#6264) by @IWANABETHATGUY#__NO_SIDE_EFFECTS__ annotation for export default function declaration (#6239) by @IWANABETHATGUY@vite-ignore comment (#6240) by @shulaodaexhaustive option (#6236) by @shulaodaensure_latest_build_output should work correctly when eagerBuild: false (#6262) by @hyf0build.rs to task generator (#6284) by @shulaodaSpanExt (#6266) by @IWANABETHATGUY@rolldown-ignore ignore comment support (#6265) by @IWANABETHATGUYAddress::from (#6245) by @IWANABETHATGUYstmt_info_idx in StmtInfo (#6244) by @IWANABETHATGUYCrossModuleOptimizationRunnerContext in cross_module_optimization (#6243) by @IWANABETHATGUYWatcherEventService to BuildDriverService (#6232) by @hyf0this.load using futures instead of callbacks (#6222) by @sapphi-redruntime_resolve_base option (#6226) by @sapphi-redcargo publish --workspace work (#6281) by @Boshencargo publish --dry-run --workspace (#6279) by @Boshencorrect deprecated JSDoc reference for jsx option (#6195) by @shulaoda
⚡ Windows Performance Boost
oxc-resolver optimizations📦 OXC Runtime Helpers Now Embedded
@oxc-project/runtime neededBoth improvements require zero configuration - just update to the latest version and enjoy! 🎉
[!warning]
💥 BREAKING CHANGES
- rolldown_plugin_oxc_runtime: embed helpers to support browser environment (#6177) by @shulaoda
scan_mode in bundler.scan (#6204) by @IWANABETHATGUYfalse in resolve.alias to ignore resolution (#6203) by @shulaodagetJsonSchema (#6186) by @shulaodato_string_literal (#6178) by @sapphi-redByteLocator#byte_offset (#6169) by @shulaodaskip_write option (#6151) by @sapphi-redjsx.pragmaFrag instead of jsx.pragmaFlag (#6200) by @sapphi-redmemberExpression (#6192) by @IWANABETHATGUYbyte_slice instead of slice for correct span handling (#6185) by @shulaodaminifyInternalExports (#6166) by @sapphi-redeval or arguments in strict mode (#6140) by @IWANABETHATGUYprocess is not defined in repl (#6147) by @IWANABETHATGUYrolldown with .wasm binding (#6153) by @hyf0build.ts to prepare to support build rolldown package with wasi binding (#6152) by @hyf0FlatOptions in whole build session (#6211) by @IWANABETHATGUYcomments in ScopeHoistingFinalizerContext (#6205) by @IWANABETHATGUYcross_module_inline_const to cross_module_optimization (#6193) by @IWANABETHATGUYclass and function visitor to class_decl, function_decl (#6176) by @IWANABETHATGUYBuildDiagnostic (#6165) by @shulaodaRolldownBuild (#6136) by @shulaodaEventKind::IoError (#6134) by @shulaodaside_effects_free_function_symbol_ref (#6206) by @IWANABETHATGUYinstantiate_chunk (#6159) by @sapphi-redif: always() to wasi-test (#6190) by @sapphi-red@rolldown/browser build if no node related changes detected (#6189) by @sapphi-red@rolldown/browser build without errors (#6155) by @hyf0type_aliases.rs (#6133) by @shulaodaYour coding agent can read these notes before it upgrades. Set up the MCP server →