What's Changed
🎉 See Announcing Rspack 2.3 for more details.
New Features 🎉
- feat: rename loader filter.code to codeFilter by @SyMind in #16184
- feat: integrate allocative snapshots and profiling skill into Rspack by @intellild in #16046
- feat: support module.parser.javascript.dynamicUrl by @HashemKhalifa in #15933
- feat(watcher): expose watchpack times API on native and node watch file systems by @stormslowly in #15754
- feat(javascript): migrate parser to SWC Next by @LingyuCoder in #16089
- feat: add loader codeFilter prefilter by @SyMind in #16073
- feat(create-rspack): display version in startup banner by @chenjiahan in #16167
- feat(rstest): add origin-aware import.meta.resolve hook by @9aoy in #16275
- feat(watch): support mixed ignored patterns by @Perfecto23 in #13795
- feat: support es2026 target by @chenjiahan in #16311
- feat(cache): expose newCache statistics in Stats JSON by @ahabhgk in #16282
Performance 🚀
- perf(size): box hot async entry futures to shrink binding size by @stormslowly in #16085
- perf(sources): avoid retaining serialized source maps by @LingyuCoder in #16072
- perf(loader): schedule loader chains as execution units by @intellild in #15401
- perf(loader-runner): read process.env.WASM once by @guru-irl in #16127
- perf: avoid creating untouched loader buildInfo by @guru-irl in #16077
- perf(resolver): prefer package directories in node_modules by @stormslowly in #16154
- perf(watch): lazily convert native watcher time info by @stormslowly in #16187
- perf(watcher): reuse directory analysis for unchanged subscriptions by @stormslowly in #16180
- perf(core): emit ESM export value descriptors when safe by @patrickkunka in #15936
- perf: reuse residual SplitChunks candidates in place by @JSerFeng in #16081
- perf(core): scan inline named exports linearly by @kdy1 in #16224
- perf(core): skip substring search when path has no fragment marker by @kdy1 in #16223
- perf(split-chunks): match built-in cache group conditions once per compilation by @guru-irl in #16129
- perf(sources): use slice iteration when parsing string arrays by @kdy1 in #16283
- perf(sources): read source map fields from the JSON tape by @kdy1 in #16297
- perf: avoid VLQ accumulation for single-sextet mapping values by @kdy1 in #16298
- perf(binding): preserve native source graphs during asset updates by @LingyuCoder in #16207
Bug Fixes 🐞
- fix: skip build dependency collection after fatal compilation errors by @ahabhgk in #16074
- fix(resolver): resolve tsconfig
extendsthrough the real path by @orgads in #15718 - fix(split-chunks): deduplicate remaining copies in named groups by @JSerFeng in #16075
- fix(css): align CSS Modules behavior with webpack css-loader fixtures by @intellild in #15816
- fix(tracing): convert JavaScript trace nanoseconds to microseconds by @LingyuCoder in #16103
- fix: stabilize module rendering order across platforms by @hai-x in #16100
- fix(binding): avoid shared property leak warnings on process exit by @SoonIter in #16117
- fix: use the module exports argument for the AMD exports dependency by @LingyuCoder in #16122
- fix: respect module arguments in AMD code generation by @hai-x in #16148
- fix(mf): make deterministic IDs independent of project paths by @LingyuCoder in #16152
- fix(watch): make node watch time info entries deterministic by @LingyuCoder in #16126
- fix(javascript): reuse parser source type by @CPunisher in #16102
- fix: link import bindings inside define callbacks by @hai-x in #16159
- fix(javascript): respect block function scope by @CPunisher in #16162
- fix(css): localize type-first nested selectors by @intellild in #16011
- fix(javascript): preserve legacy parser behavior by @CPunisher in #16164
- fix(lazy-compilation): avoid barrel reloads on activation by @JSerFeng in #16026
- fix(split-chunks): support minRemainingSize by @JSerFeng in #15594
- fix: release updated allocative crates to resolve napi feature mismatch by @intellild in #16171
- fix(HMR): correct hot updated chunk path resolution in Node.js HMR by @hai-x in #16174
- fix(release): synchronize workspace versions and CLI peer dependencies by @intellild in #16181
- fix: inherit splitChunks request limits in cache groups by @hai-x in #16191
- fix(css): calculate CSS module hashes from graph dependencies by @intellild in #16120
- fix(core): preserve shorthand assignment keys in concatenation by @dajiaohuang in #16205
- fix(cache): unify snapshot path matching and package lookup by @ahabhgk in #16194
- fix(javascript): correct loose equality evaluation for nullish values by @NaamuKim in #16141
- fix(lazy-compilation): avoid reposting active ids on dispose by @dajiaohuang in #16200
- fix: allocative crate package names by @intellild in #16212
- fix(mf): support consumes runtime without chunk loading by @LingyuCoder in #16209
- fix(mf): normalize single-item container share scopes by @chenjiahan in #16251
- fix(css): localize animation names before !important by @dajiaohuang in #16204
- fix(watcher): keep watching when unwatching a stale path fails by @sarankumar1325 in #16199
- fix(sri): generate integrity hashes for chunks that only contain extracted css by @ojj1123 in #15711
- fix: inherit sideEffects through nested package metadata by @JSerFeng in #15336
- fix(types): narrow EvalSourceMapDevToolPlugin options by @chenjiahan in #16265
- fix(css): keep media attribute of hot replaced stylesheets by @CyberAP in #16214
- fix(rsc): collect client components from all entry dependencies by @sarankumar1325 in #16254
- fix(watcher): invalidate on native watcher removals by @guru-irl in #16284
- fix(watcher): report a removed file once when it stays a dependency by @guru-irl in #16305
- fix: raise inherited SWC target cap to ES2024 by @chenjiahan in #16314
- fix(css): preserve stylesheet attributes and state during HMR by @chenjiahan in #16287
- fix: update named chunks when merging or removing chunks by @hai-x in #16312
- fix(watcher): preserve native event delivery while JavaScript is blocked by @ScriptedAlchemy in #16106
- fix: include module_id in chunk hashing by @hai-x in #16168
- fix(ci): update Dylint to 6.3.0 by @intellild in #16332
Refactor 🔨
- refactor(binding): retain DependencyRef in JavaScript wrappers by @SyMind in #16061
- refactor(sources): use a source-wide UTF-16 index and remove object pool by @SyMind in #16083
- refactor(javascript): remove redundant ESTree AST wrappers by @CPunisher in #16098
- refactor: reuse current module in dependency templates by @hai-x in #16149
- refactor(javascript): emit mangled destructuring keys as strings by @CPunisher in #16147
- refactor(cache): reuse persistent cache options for newCache by @ahabhgk in #16160
- refactor(css): share CSS module graph traversal by @intellild in #16119
- refactor(css): query placeholders from compiled templates by @intellild in #16169
- refactor: remove unused __rspack_esm_id export from module chunks by @hai-x in #16193
- refactor(binding): use registered symbols across Rust and JS by @SyMind in #16210
- refactor: remove dead code and unused parameters by @hai-x in #16217
- refactor: reuse modules and connections already in hand by @hai-x in #16197
- refactor: use SIMD UTF-16 length for dependency locations by @SyMind in #15585
- refactor: reuse data already in hand instead of looking it up again by @hai-x in #16218
Document 📖
- docs: update renamed crates in project architecture by @Jarvis636431 in #16087
- docs: add parallel loader section to loader guide by @intellild in #16092
- docs: add memory diagnostics guide by @intellild in #16080
- docs: explain hot update manifest fields by @chenjiahan in #16114
- docs: clarify Rsdoctor capabilities and simplify setup guide by @chenjiahan in #16125
- docs(resolve): explain resolve.tsConfig.references matching rules by @stormslowly in #16099
- docs: clarify Rsbuild and Rspack CLI in quick start by @chenjiahan in #16155
- docs: clarify loader code filters and add examples by @chenjiahan in #16182
- docs: clarify how to check tree shaking inputs by @MuslumYilmaz in #15830
- docs: clarify how loaders affect tree shaking by @chenjiahan in #16213
- docs: clarify project setup with Rsbuild, Rslib, and Rspack CLI by @chenjiahan in #16241
- docs: correct EvalSourceMapDevToolPlugin filters by @chenjiahan in #16243
- docs: clarify fully dynamic import behavior by @chenjiahan in #16245
- docs: clarify optimization defaults in none mode by @chenjiahan in #16244
- docs: correct HMR error callback information by @chenjiahan in #16246
- docs: clarify stats loggingDebug filtering by @chenjiahan in #16250
- docs: correct stats sorting defaults by @chenjiahan in #16247
- docs: correct stats detail defaults by @chenjiahan in #16248
- docs: distinguish stats JSON and text defaults by @chenjiahan in #16249
- docs: invite @hai-x to Rspack core team by @chenjiahan in #16264
- docs: clarify CSS Modules class names for SSR by @chenjiahan in #16257
- docs: clarify how rule conditions combine by @chenjiahan in #16260
- docs: explain HMR update propagation by @chenjiahan in #16261
- docs: explain transpiling modern dependencies by @chenjiahan in #16256
- docs: document compilation module graph queries by @chenjiahan in #16259
- docs: explain passing loader data to plugins by @chenjiahan in #16258
- docs: explain runtime public paths inside workers by @chenjiahan in #16262
- docs: document experiments.newCache by @ahabhgk in #16272
- docs: clarify asset processing before emit by @chenjiahan in #16269
- docs: clarify eager dynamic import behavior by @chenjiahan in #16267
- docs: correct asset module filenames and output conditions by @chenjiahan in #16266
- docs: add runtime issues guide for chunk loading errors by @chenjiahan in #16270
- docs: demonstrate HMR cleanup and state preservation by @chenjiahan in #16271
- docs: improve memory analysis and contribution guides by @chenjiahan in #16285
- docs: group built-in loaders in a dedicated section by @chenjiahan in #16286
- docs: correct publishing step in releasing guide by @hai-x in #16290
- docs: clarify HMR check and automatic application by @chenjiahan in #16299
- docs: clarify HMR invalidation and propagation by @chenjiahan in #16300
- docs: troubleshoot automatic public path failures by @chenjiahan in #16301
- docs: explain chunk load errors after HTTP success by @chenjiahan in #16302
- docs: fix HMR examples and state descriptions by @chenjiahan in #16303
- docs: clarify CSS entries and external resources by @intellild in #16306
- docs: use Tailwind CSS webpack loader for v4 by @intellild in #16309
- docs: add community loaders to the ecosystem page by @chenjiahan in #16319
- docs: add community plugins to the ecosystem page by @chenjiahan in #16320
- docs: add NestJS to the ecosystem page by @chenjiahan in #16321
- docs: add Rstack CLI to toolchain listings by @chenjiahan in #16322
Other Changes
- chore(deps): update patch npm dependencies by @renovate[bot] in #16029
- chore(deps): upgrade swc-next to 0.2.4 by @LingyuCoder in #16094
- chore(deps): upgrade Rspress to 2.1.0-beta.1 by @SoonIter in #16104
- chore(deps): update dependency acorn to ^8.19.0 by @renovate[bot] in #16030
- chore(docs): update Rsdoctor 2.0 usage guides by @yifancong in #16090
- chore(deps): upgrade swc-next to 0.3.0 by @LingyuCoder in #16113
- chore(deps): update dependency playwright to v1.64.1 by @renovate[bot] in #16031
- chore(deps): update swc by @renovate[bot] in #16131
- chore(deps): update patch npm dependencies by @renovate[bot] in #16130
- chore(deps): update dependency ts-checker-rspack-plugin to ^1.7.1 by @renovate[bot] in #16137
- chore(deps): update dependency @swc/plugin-remove-console to v17 by @renovate[bot] in #16139
- chore(deps): update dependency happy-dom to v21 by @renovate[bot] in #16140
- chore(deps): update dependency cac to ^7.1.0 by @renovate[bot] in #16135
- chore(deps): update dependency mermaid to ^12.2.0 by @renovate[bot] in #16136
- chore(deps): update dependency watchpack to v2.6.1 by @renovate[bot] in #16138
- chore(deps): upgrade SWC Next to 0.3.1 by @CPunisher in #16151
- Revert "fix(mf): make deterministic IDs independent of project paths" by @LingyuCoder in #16161
- test: stabilize lazy barrel cache restoration by @JSerFeng in #16173
- chore(deps): update dependency @ast-grep/napi to ^0.51.0 by @renovate[bot] in #16227
- chore(deps): update rust crate either to 1.19.0 by @renovate[bot] in #16234
- chore(deps): update dependency cspell to ^10.4.0 by @renovate[bot] in #16229
- chore(deps): update dependency core-js to v3.51.0 by @renovate[bot] in #16228
- chore(deps): update rust crate wasmtime to v36.0.19 [security] by @renovate[bot] in #16238
- chore(deps): update rust crate hashlink to 0.12.2 by @renovate[bot] in #16235
- chore(deps): update patch npm dependencies by @renovate[bot] in #16226
- chore(deps): update rust crate ctor to 0.13.1 by @renovate[bot] in #16232
- Revert "fix: inherit splitChunks request limits in cache group" by @hai-x in #16273
- chore: mark allocative driver as private by @intellild in #16308
- chore(deps): update patch crates by @renovate[bot] in #16225
- chore: refine webpack gap tracker workflow by @intellild in #15362
New Contributors
- @orgads made their first contribution in #15718
- @Jarvis636431 made their first contribution in #16087
- @dajiaohuang made their first contribution in #16205
- @MuslumYilmaz made their first contribution in #15830
- @NaamuKim made their first contribution in #16141
- @patrickkunka made their first contribution in #15936
- @sarankumar1325 made their first contribution in #16199
- @ojj1123 made their first contribution in #15711
- @CyberAP made their first contribution in #16214
Full Changelog: v2.2.9...v2.3.0