npm / rolldown
rolldown
What changed in rolldown 1, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-18.
2 breaking4 new APIs and options1 performance3 behavior and defaults2 tooling41 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initrolldown 153 changes
Breaking changes 2
JSON modules with a non-object root are unwrapped.
Dev mode now rejects non-ESM output formats.
New APIs and options 4
Adds an option to configure output character encoding.
Adds the experimental.devMode.hotUpdate option.
Passes watch.exclude to notify as its ignore filter.
Experimental support for inlineCommonChunks lets Rolldown inline common chunks containing import() and deduplicate shared code in lazy chunks.
Performance 1
Deduplicates shared code along known loading paths.
Behavior and default changes 3
Routes independent ESM re-exports per consumer during code splitting.
Glob imports now follow file creation and deletion via hotUpdate.
Glob imports now watch the directory each glob reads.
Tooling 2
Development mode records a matcher per glob call.
The dev runtime now ships imported bindings for HMR partial accept.
Fixes and other changes 41
Reports ASSIGN_TO_IMPORT for writes to re-exported namespace members.
Avoids renaming bindings to fixed names that they would capture.
A repeated
close()call is now a no-op.Keeps an external
require()local in a CJS module off the top-level names.Prints a CommonJS module's top-level
thisas a wrapper parameter rolldown names.Avoids renaming entry top-level bindings onto their nested bindings.
Keeps generated top-level names off inner bindings.
Keeps files loaded by the HMR stage watched when the same task rebuilds.
Watches lazily compiled files even when a build starts first.
Handles
output.charset: 'ascii'when minification is disabled.Keeps internal bindings out of entry exports.
Shims deep namespace reads through default imports.
Shims missing static namespace members.
Preserves sourcemap boundaries when tracing has no mapping.
Accounts for init imports during code splitting.
Avoids eager loading through mixed re-exports.
Tree-shakes expression statements that coerce known constants.
Preserves initialization of wrapped ESM re-exports during tree-shaking.
Uses computed access for arbitrary import names.
Chunk syntax errors now fail, and export names are escaped once.
Dependency paths are escaped in CJS and UMD output.
Avoids cycles caused by redundant re-export initialization.
Export names are escaped in defineProperty calls.
Devtools now honors devtools.sessionId.
Re-exports of the same external binding are treated as one export.
Imported exports now honor externalLiveBindings.
A late payload no longer replaces newer module code.
Newly imported modules are shipped even if the client never received them.
Reloads the page when an HMR update fails after merging its edit.
Namespace properties are escaped in IIFE and UMD output.
Code splitting no longer moves init calls in front of unwrapped JSON modules.
Ships dependencies of a module that a patch shipped but never ran.
Chunk names are sanitized after resolving the relative path.
Generates valid bindings for shimmed exports.
HMR patches and lazy chunks now read string-named imports correctly.
HMR patches and lazy chunks now keep this undefined when calling an imported function.
The dev module factory is async when top-level await is used.
Bare external imports now retain their with clause.
Dependencies for import.meta.hot.accept are now aligned with Vite.
The resolver cache is cleared when a file is created or deleted.
Unresolved import diagnostics now name the resolved specifier.