Repository navigation
perf: avoid duplicate scans in module concatenation - #22865
Conversation
🦋 Changeset detectedLatest commit: b493986 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
This PR is packaged and the instant preview of its latest commit is available. Install it locally:
npm i -D webpack@https://pkg.pr.new/webpack@22865
yarn add -D webpack@https://pkg.pr.new/webpack@22865
pnpm add -D webpack@https://pkg.pr.new/webpack@22865 |
Types CoverageCoverage after merging perf/concatenated-import-dedup into main will be
Coverage Report |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Priority: ⬇️ Low Change: Refactor Merge Risk: ⚪ Minimal · up to
|
Generated code sizeComparing base (
Read No asset changed size. No runtime gained or lost a runtime module. Built |
Merging this PR will not alter performance1 warning, 1 note
Comparing |
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [webpack](https://github.com/webpack/webpack) | [`5.112.0` → `5.112.2`](https://renovatebot.com/diffs/npm/webpack/5.112.0/5.112.2) |  |  | --- >⚠️ **Warning** > > Some dependencies could not be looked up. Check the [Dependency Dashboard](issues/99) for more information. --- ### Release Notes <details> <summary>webpack/webpack (webpack)</summary> ### [`v5.112.2`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51122) [Compare Source](webpack/webpack@v5.112.1...v5.112.2) ##### Patch Changes - Reduce repeated scans when concatenating imported modules. (by [@​xiaoxiaojx](https://github.com/xiaoxiaojx) in [#​22865](webpack/webpack#22865)) - Avoid allocating CSS module sets for single-group chunks. (by [@​xiaoxiaojx](https://github.com/xiaoxiaojx) in [#​22866](webpack/webpack#22866)) - Return the value of every module type loaded with `importModule()`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22869](webpack/webpack#22869)) ### [`v5.112.1`](https://github.com/webpack/webpack/blob/HEAD/CHANGELOG.md#51121) [Compare Source](webpack/webpack@v5.112.0...v5.112.1) ##### Patch Changes - Rebuild a lazy barrel in watch when what it defers changes, and keep the imports and re-exports it still runs. (by [@​aryanraj45](https://github.com/aryanraj45) in [#​22699](webpack/webpack#22699)) - Rebuild under `cacheUnaffected` a module whose re-export target goes or returns. (by [@​aryanraj45](https://github.com/aryanraj45) in [#​22749](webpack/webpack#22749)) - Fix "Self-reference dependency has unused export name" for CommonJS namespace re-exports. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22791](webpack/webpack#22791)) - Fix `exportType: "style"` CSS modules throwing outside the runtime chunk. (by [@​lazerg](https://github.com/lazerg) in [#​22833](webpack/webpack#22833)) - Fix crash when a CSS module with `exportType: "style"` imports an ignored stylesheet. (by [@​codeXsidd](https://github.com/codeXsidd) in [#​22846](webpack/webpack#22846)) - Keep empty process environment variables that `.env` files don't define in `DotenvPlugin`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22794](webpack/webpack#22794)) - Rehash an ESM entry chunk when a chunk it imports by file name changes. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22804](webpack/webpack#22804)) - Handle a NUL inside an HTML CDATA section the way the parsing spec does. (by [@​dependabot](https://github.com/apps/dependabot) in [#​22811](webpack/webpack#22811)) - Keep module exports live across chunks, runtimes, HMR and eval, sparing globals. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22733](webpack/webpack#22733)) - Await asynchronous modules that `ProvidePlugin` injects into ES modules. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22728](webpack/webpack#22728)) - Keep a resolve that ends after the compiler closed from throwing. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22795](webpack/webpack#22795)) - Preserve string names passed to SharedWorker constructors. (by [@​bjohansebas](https://github.com/bjohansebas) in [#​22770](webpack/webpack#22770)) - Preserve string contents when extracting source map comments. (by [@​bjohansebas](https://github.com/bjohansebas) in [#​22768](webpack/webpack#22768)) - Scope strict-mode, async and generator block function declarations to their block. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22800](webpack/webpack#22800)) - Preserve raw dotenv values when reusing cached environment files. (by [@​Eshiv-Pandey](https://github.com/Eshiv-Pandey) in [#​22787](webpack/webpack#22787)) - Preserve assigned or patched built-ins, conversions and pattern targets. (by [@​aryanraj45](https://github.com/aryanraj45) in [#​22761](webpack/webpack#22761)) - Keep globals a `globalThis` write replaces, and `slice` on a patched array. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22862](webpack/webpack#22862)) - Skip HTML script tags for shared chunks that emit no JavaScript. (by [@​bjohansebas](https://github.com/bjohansebas) in [#​22779](webpack/webpack#22779)) - Keep the digits Firefox lays out a minified CSS percentage with. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22718](webpack/webpack#22718)) - Reject a second `srcset` descriptor after a `0x` density descriptor. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22741](webpack/webpack#22741)) - Minify JavaScript faster, folding string methods on constants and `x -= 1`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22823](webpack/webpack#22823)) - Shorten minified JavaScript, and keep it running like its source. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22717](webpack/webpack#22717)) - Drop more unused functions, arguments, calls, global reads and variable copies when minifying JavaScript. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22789](webpack/webpack#22789)) - Minify JavaScript smaller where swc does, and fold a function's `length` right. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22826](webpack/webpack#22826)) - Reduce JavaScript output size where oxc or swc produce smaller output. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22829](webpack/webpack#22829)) - Update watchpack to 2.6.3 and rebuild on a `node_modules` created mid-build. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22743](webpack/webpack#22743)) - Support `concatenateModules` with `cacheUnaffected`. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22746](webpack/webpack#22746)) - Update schema-utils to 4.8.1. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22774](webpack/webpack#22774)) - Keep CSS fallbacks, vendor overrides, `oklch()` hues and HTML elements. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22753](webpack/webpack#22753)) - Validate `CleanPlugin` and `DotenvPlugin` options with a precompiled check, so valid options no longer compile their schema at startup. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22758](webpack/webpack#22758)) - Speed up startup and CSS minification, sharing the compile cache with workers. (by [@​xiaoxiaojx](https://github.com/xiaoxiaojx) in [#​22706](webpack/webpack#22706)) - Use precise, generic types for modules, parsers, generators, stats and loaders. (by [@​alexander-akait](https://github.com/alexander-akait) in [#​22731](webpack/webpack#22731)) </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - "before 9am on tuesday" - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNzUuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE3NS4xIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6WyJkZXBlbmRlbmNpZXMiLCJyZW5vdmF0ZSJdfQ==--> Reviewed-on: https://code.futo.org/harbor/harbor/pulls/2035
Summary
Module concatenation checks
targets.includes(module)for every import, then performs areferencesMap.get(module)lookup for the same module. Reuse the existing map to append each target only on its first reference.Before:
After:
Measured scan work in production builds with concatenation enabled:
The output was byte-for-byte identical for both cases.
What kind of change does this PR introduce?
perf
Did you add tests for your changes?
No new tests. Existing concatenation, deferred import, CommonJS wrapping, cache, and snapshot tests passed: 148 tests and 10 snapshots in the targeted configuration suite, plus the persistent caching concatenation test.
Does this PR introduce a breaking change?
No.
If relevant, what needs to be documented once your changes are merged or what have you already documented?
n/a
Use of AI
AI was used to inspect the module concatenation implementation, identify the repeated scan, draft the change, and review the resulting diff. The change and tests were verified locally.
Summary by CodeRabbit