Skip to content

feat(minify): write strings as templates where every one can be, split the gzip-noise gaps by cause - #22923

Merged
alexander-akait merged 5 commits into
mainfrom
feat/minify-gzip-gaps
Oct 26, 2026
Merged

alexander-akait merged 5 commits into
mainfrom
feat/minify-gzip-gaps

Conversation

@alexander-akait

@alexander-akait alexander-akait commented Oct 26, 2026 •

Copy link
Copy Markdown
Member

Summary

The ~260 gap-list entries filed as "gzips a few bytes smaller" were treated as noise. This PR measures them and closes what is real.

First, it measures every spelling rule across all 35k corpus outputs by flipping each one. None loses on real code:

  • literal-last == is 4.9 KB gzip better than literal-first
  • const→let is 3.1 KB better
  • "function"==typeof x is 1.2 KB better than the reverse
  • numbers-last is 0.8 KB better

The one consistent loss is the quote character. In deflate's Huffman header ` costs less than ".

Changes (all in the improve phase):

  • Backticks, file-wide. Where every string a program prints can be a template, all of them print with backticks. This is −1.4 KB gzip corpus-wide. Only the two delimiter characters are swapped, so lengths and source maps are unchanged. Mixing quote styles measured +2.9 KB, so any string that can't take a backtick keeps the whole program quoted: directives, quoted keys, module names, tags, require()/Object.defineProperty() arguments (read by cjs-module-lexer), or ecma < 2015. The rule can be switched off with improvements.backticks.enabled.
  • A function's tail. A last return c?void a:void b falls off as c?a:b, and a last if(c)e becomes c&&e. Corpus-wide: −61 raw, −33 gzip.
  • for…of heads. A statement before a for…of stays out of its head, where it needs parentheses: −195 raw, −191 gzip on test262.

Measured and rejected:

Rule Raw Gzip
arrow → method +3980 +757
if…return chains +1455 −215
"…"+void 0 folded +10 +2

Gap lists:

  • oxcSmaller.js: 424 → 361 entries.
  • swcSmaller.js: unchanged in size; its noise group is split by cause.
  • The deflate-header noise groups shrink from 47 to 15 (swc) and from 154 to 1 (oxc). The rest are now named groups: mangled-name choice, inlining, , vs ;, method vs arrow, and so on.
  • Six test262 files are 1–2 bytes bigger gzipped but smaller raw. They are listed in IMPROVED_YET_BIGGER.

Before/after (compress: { passes: 2 }, mangle: true, ecma: 2020; raw/gzip bytes):

// main: 95/104
class Foo{bar="bar";static zzz="zzz";get baz(){return"baz"}}console.log((new Foo).bar,Foo.zzz);
// this PR: 95/103
class Foo{bar=`bar`;static zzz=`zzz`;get baz(){return`baz`}}console.log((new Foo).bar,Foo.zzz);

What kind of change does this PR introduce?

feat

Did you add tests for your changes?

Yes. test/unitCases/javascript/printer.unittest.js covers the rewrites and every excluded place and option. Snapshots now show backticks: the printer suites and configCases/optimization/minify-object-enumeration. The test that compares option reading against terser turns backticks off. The gap lists and IMPROVED_YET_BIGGER live in test/specCases/minify-corpora.spectest.js.

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?

docs/syntax.md (the syntax-printer.js bullet) describes the new rewrites.

Use of AI

Claude Code wrote the changes and tests. An analysis agent measured each spelling rule across the corpora. Two agents then implemented the backtick rule and the regrouping, and the shape rewrites. The results were merged and checked with the printer unit tests, the full corpus suite, the minifier config cases, the fuzz seeds and yarn lint.


Generated by Claude Code

Summary by CodeRabbit

  • New Features
    • Minified JavaScript can now use template strings in place of eligible quoted strings when the full output can be converted safely.
    • Minification can produce shorter output by simplifying certain final returns and conditional statements.
  • Documentation
    • Expanded the JavaScript syntax guide with details about available optimizations and corpus testing.

@changeset-bot

changeset-bot Bot commented Oct 26, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 03cd53b

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
webpack Minor

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

@github-actions github-actions Bot added area: parser JavaScript parsing and dependency analysis (lib/javascript, lib/dependencies) area: types types.d.ts, JSDoc annotations, hand-maintained declarations labels Oct 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

This PR is packaged and the instant preview of its latest commit is available.

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@22923
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@22923
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@22923

@github-actions

Copy link
Copy Markdown
Contributor

Types Coverage

Coverage after merging feat/minify-gzip-gaps into main will be
99.27%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.84%100%100%98.84%113
declarations
   WebpackOptions.ts99.94%100%100%99.94%4266
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js100%100%100%100%
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/module-federation
   test.filter.js100%100%100%100%
examples/reexport-components
   test.filter.js100%100%100%100%
examples/ssr
   test.filter.js100%100%100%100%
examples/typescript
   test.filter.js100%100%100%100%
examples/typescript-non-erasable
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-emscripten
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   Chunk.js100%100%100%100%
   Compilation.js98.74%100%100%98.74%1823, 2135, 2142, 2150, 2172, 2175, 3161, 3720, 3763, 4358, 4362, 4488, 4509, 4634, 4671, 4678, 4731–4732, 4736, 4741, 4757–4758, 4772–4773, 4778–4779, 5307, 5333, 6254, 6271, 6289, 6305, 6320, 6345, 6348, 6760, 6763–6764, 6769, 6784, 6867, 6891, 883–884
   Compiler.js98.81%100%100%98.81%1107, 1144, 1147, 1323–1324, 1332, 848, 932, 972
   Dependency.js100%100%100%100%
   DependencyTemplate.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js100%100%100%100%
   InitFragment.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   ModuleFilenameHelpers.js100%100%100%100%
   ModuleNotFoundError.js100%100%100%100%
   MultiCompiler.js98.91%100%100%98.91%489, 561, 748, 813
   NormalModule.js100%100%100%100%
   NullFactory.js100%100%100%100%
   ProgressPlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   WebpackError.js100%100%100%100%
   index.js100%100%100%100%
   webpack.js98.59%100%100%98.59%306, 308
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js91.67%100%100%91.67%27
   AssetGenerator.js100%100%100%100%
   AssetModule.js100%100%100%100%
   AssetModulesPlugin.js98.45%100%100%98.45%334, 360, 363, 493, 58
   AssetParser.js96.15%100%100%96.15%47
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js91.67%100%100%91.67%27
   RawDataUrlModule.js100%100%100%100%
   WebManifestGenerator.js100%100%100%100%
   WebManifestParser.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
   isGeneratorLowered.js100%100%100%100%
lib/bun
   BunTargetPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   Cache.js98.25%100%100%98.25%104
   CacheFacade.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%75, 87, 95
   MemoryCachePlugin.js92%100%100%92%33, 42
   MemoryWithGcCachePlugin.js93.42%100%100%93.42%106, 120–121, 130, 88
   PackFileCacheStrategy.js96.54%100%100%96.54%1304, 1404, 1408, 1470, 1716, 1796, 1819, 1849, 684, 703, 713–715, 717, 733–734, 739, 742, 744, 749, 754, 779, 785, 819, 825, 831, 836, 847, 856, 861–862, 864, 881, 887–888, 890
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   OptionsApply.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   browserslistTargetHandler.js100%100%100%100%
   cli.js98.89%100%100%98.89%114, 549, 581, 631
   defaults.js99.59%100%100%99.59%1633–1635, 1643, 288, 548
   defineConfig.js100%100%100%100%
   getClaimedAssetTypes.js100%100%100%100%
   normalization.js99.14%100%100%99.14%285–286, 356, 371
   target.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   RemoteRuntimeModule.js100%100%100%100%
   RemoteToExternalDependency.js100%100%100%100%
   declaredRemotes.js100%100%100%100%
   moduleFederationHooks.js100%100%100%100%
   options.js100%100%100%100%
lib/context
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js99.88%100%100%99.88%1495
   ContextModuleFactory.js95.70%100%100%95.70%230, 257, 276, 280–281, 289, 466, 487, 492, 534, 543, 545, 549, 552, 558–559
   ContextReplacementPlugin.js100%100%100%100%
lib/css
   CssGenerator.js99.29%100%100%99.29%1085, 129, 305, 837
   CssInjectStyleRuntimeModule.js100%100%100%100%
   CssLoadingRuntimeModule.js100%100%100%100%
   CssModule.js100%100%100%100%
   CssModulesPlugin.js98.72%100%100%98.72%217, 418, 432, 445, 458, 481, 494, 507, 520
   CssParser.js99.76%100%100%99.76%1122, 2457, 3104, 3107, 3113, 3545, 975
   CssServerStylesRuntimeModule.js100%100%100%100%
   conventions.js100%100%100%100%
   cssMinify.js100%100%100%100%
   data.js99.84%100%100%99.84%229, 5605
   syntax-parser.js99.71%100%100%99.71%11159–11160, 11716–11717, 11754, 11964, 12013, 14534, 14595–14598, 14703–14704, 14802–14803, 15576, 15871, 15873, 16428, 16821, 16863, 19289, 3066, 3068, 3073, 3086, 3843, 3849
   syntax-printer.js99.33%100%100%99.33%2619–2620, 2622–2623, 2625–2626, 2631, 2895–2898, 2991, 355, 3692, 4117, 4253, 4931, 5246, 6139, 723
   syntax.js100%100%100%100%
   topologicalSort.js100%100%100%100%
lib/debug
   ProfilingPlugin.js100%100%100%100%
lib/define
   DefinePlugin.js99.42%100%100%99.42%1488, 936, 938, 943, 967
   DotenvPlugin.js97.61%100%100%97.61%276, 395, 443, 456–457
   EnvironmentPlugin.js100%100%100%100%
lib/deno
   DenoTargetPlugin.js100%100%100%100%
lib/dependencies
   ConstDependency.js100%100%100%100%
   ContextElementDependency.js100%100%100%100%
   NullDependency.js100%100%100%100%
lib/dependencies/amd
   AMDDefineDependency.js100%100%100%100%
   AMDDefineDependencyParserPlugin.js100%100%100%100%
   AMDPlugin.js99.31%100%100%99.31%54
   AMDRequireArrayDependency.js100%100%100%100%
   AMDRequireContextDependency.js100%100%100%100%
   AMDRequireDependenciesBlock.js100%100%100%100%
   AMDRequireDependenciesBlockParserPlugin.js100%100%100%100%
   AMDRequireDependency.js100%100%100%100%
   AMDRequireItemDependency.js100%100%100%100%
   AMDRuntimeModules.js95.45%100%100%95.45%65
   LocalModule.js100%100%100%100%
   LocalModuleDependency.js100%100%100%100%
   LocalModulesHelpers.js100%100%100%100%
   RequireJsStuffPlugin.js100%100%100%100%
   UnsupportedDependency.js100%100%100%100%
lib/dependencies/commonjs
   CommonJsDependencyHelpers.js98.63%100%100%98.63%43
   CommonJsExportRequireDependency.js99.21%100%100%99.21%413, 415, 417
   

@coderabbitai

coderabbitai Bot commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 4b2d644 and 03cd53b.

Files ignored due to path filters: 4
  • test/configCases/optimization/minify-object-enumeration/__snapshots__/ConfigCacheTest.snap is excluded by !**/*.snap, !test/**/__snapshots__/**
  • test/configCases/optimization/minify-object-enumeration/__snapshots__/ConfigTest.snap is excluded by !**/*.snap, !test/**/__snapshots__/**
  • test/unitCases/javascript/__snapshots__/printer.unittest.js.snap is excluded by !**/*.snap, !test/**/__snapshots__/**
  • types.d.ts is excluded by !types.d.ts
Files selected for processing: 8
  • .changeset/068-minify-gzip-gaps.md
  • cspell.json
  • docs/syntax.md
  • lib/javascript/syntax-printer.js
  • test/helpers/oxcSmaller.js
  • test/helpers/swcSmaller.js
  • test/specCases/minify-corpora.spectest.js
  • test/unitCases/javascript/printer.unittest.js

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Walkthrough

The printer adds conditional conversion of eligible strings to template literals and adjusts tail-return and for-of simplification. Tests and corpus comparisons are updated to cover these changes and categorize output-size differences.

Changes: JavaScript minifier changes

Layer / File(s) Summary
Backtick rewriting
lib/javascript/syntax-printer.js, test/unitCases/javascript/printer.unittest.js, .changeset/068-minify-gzip-gaps.md
The printer records eligible string literals and rewrites them as template literals when the improvement is enabled and its conditions are met. Tests cover output equivalence, source maps, and contexts or settings that retain quotes.
Tail-return and loop simplification
lib/javascript/syntax-printer.js, test/unitCases/javascript/printer.unittest.js
Tail-return shortening preserves conditional effects and can convert a final if statement to a logical expression. The for-of improvement keeps a preceding expression outside the iterable unless it assigns the value read there. Tests cover both changes.
Corpus size comparisons
test/helpers/oxcSmaller.js, test/helpers/swcSmaller.js, test/specCases/minify-corpora.spectest.js, docs/syntax.md, cspell.json
The size-comparison helpers split broad gzip-difference categories into reason-specific groups. Corpus exceptions and documentation change, and the spell-check dictionary adds dangi.

Possibly related PRs

  • webpack/webpack#22919: Adds function inlining and value substitution in the improve phase, which the syntax documentation also describes.
  • webpack/webpack#22887: Changes execution of the minify-corpora tests; this PR also updates their corpus exception table.
  • webpack/webpack#22909: Implements improve-phase transformations that the syntax documentation describes alongside other minifier changes.

Suggested labels: area: parser, area: types

Suggested reviewers: aryanraj45, bjohansebas

Priority: Normal

Change: Feature

Merge Risk: Minimal · up to 03cd5

No actionable merge blocker is established by the supplied evidence; normal validation remains appropriate.

Pre-merge checks: Passed 3 · Inconclusive 1

Failed Failed checks: 1 inconclusive

Check name Status Explanation Resolution
Title check Inconclusive The title uses valid Conventional Commit syntax with the allowed type feat and the scope minify. It accurately describes the main changes. The branch prefix is not provided, so the required type-p… Provide the branch name or branch prefix. Confirm that it uses the feat prefix, or update the title type to match the branch prefix.
Passed Passed checks: 3 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title uses valid Conventional Commit syntax with the allowed type feat and the scope minify. It accurately describes the main changes. The branch prefix is not provided, so the required type-prefix match cannot be verified.

Resolution

Provide the branch name or branch prefix. Confirm that it uses the feat prefix, or update the title type to match the branch prefix.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Warning

Some tools did not complete. Review the errors below.

🔧 ast-grep (0.45.3)
test/unitCases/javascript/printer.unittest.js

ast-grep timed out on this file

lib/javascript/syntax-printer.js

ast-grep timed out on this file

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

Generated code size

Comparing base (4b2d644) to head (03cd53b). Merging this pull request changes the size of 23 asset(s) whose tests it leaves untouched.

What moved Tests Assets Gzip Raw Test edit
Changed, test untouched 15 23 🟢 ↓ -3 B 🟢 ↓ -4 B —
Changed, test edited 0 0 — — —
New 0 0 — — —
Deleted 0 0 — — —
Unchanged — 9330 — — —

Read Changed, test untouched first: the test is byte-identical on both sides, so webpack generated the difference. Changed, test edited moved partly because the test did — Test edit is how many bytes the test gained, and a bundle that grew by less is not a regression. New and Deleted are whole files, not deltas — a new asset was created, not grown, so it reads gray (⚪ added) — and adding tests cannot bury a real change. Gzip decides, because that is what users download; raw is the tiebreak, and brotli and zstd are per asset below.

23 asset(s) changed size, test untouched, biggest 20 by raw or gzip change
Asset Before After Change Gzip (9) Brotli (11) Zstd (19)
🟢 ↓ optimization/minify-assignment-targets 0/bundle0.js 1.14 KiB 1.13 KiB -4 B (-0.34%) -4 B (-1.01%) -3 B (-0.88%) -3 B (-0.75%)
🔴 ↑ optimization/minify-optional-call-semantics 1/bundle1.js 609 B 609 B 0 B (—) +4 B (+1.48%) -11 B (-4.72%) +2 B (+0.76%)
🔴 ↑ module-classes/asset-side-effect-free bundle0.js 163 B 163 B 0 B (—) +1 B (+0.61%) — —
🟢 ↓ optimization/minify-string-conversions bundle0.js 1.19 KiB 1.19 KiB 0 B (—) -1 B (-0.21%) -2 B (-0.52%) —
🟢 ↓ optimization/minimize-arguments-parameter 2/bundle2.js 455 B 455 B 0 B (—) -1 B (-0.45%) -1 B (-0.58%) —
🟢 ↓ optimization/minimize-arguments-parameter 1/bundle1.js 457 B 457 B 0 B (—) -1 B (-0.45%) -3 B (-1.69%) —
🔴 ↑ optimization/minimize-json 5/bundle5.js 267 B 267 B 0 B (—) +1 B (+0.65%) — —
🔴 ↑ optimization/minimize-json 0/bundle0.js 243 B 243 B 0 B (—) +1 B (+0.66%) -1 B (-0.74%) —
🟢 ↓ optimization/minimize-module-name-cache 1/bundle1.js 121 B 121 B 0 B (—) -1 B (-0.81%) -9 B (-10.11%) —
🟢 ↓ optimization/minimize-new-target 1/bundle1.mjs 1.13 KiB 1.13 KiB 0 B (—) -1 B (-0.24%) +1 B (+0.29%) —
🟢 ↓ validate/multi-compiler compiler4/bundle3.js 112 B 112 B 0 B (—) -1 B (-0.85%) +1 B (+1.19%) —
🟢 ↓ library/module-live-bindings-hoisted 2/library-2.mjs 1.80 KiB 1.80 KiB 0 B (—) — -1 B (-0.12%) —
🟢 ↓ optimization/minify-iife-arguments 3/names.js 544 B 544 B 0 B (—) — -5 B (-3.94%) —
🟢 ↓ optimization/minify-iife-arguments 2/let.js 154 B 154 B 0 B (—) — -1 B (-1.02%) —
🔴 ↑ optimization/minify-iife-arguments 1/eval.js 167 B 167 B 0 B (—) — +16 B (+16.16%) —
🟢 ↓ optimization/minify-object-enumeration 2/bundle2.js 564 B 564 B 0 B (—) — -1 B (-0.51%) —
🟢 ↓ optimization/minify-object-enumeration 0/bundle0.js 985 B 985 B 0 B (—) — -6 B (-1.85%) —
🟢 ↓ optimization/minify-object-enumeration 1/bundle1.js 1.69 KiB 1.69 KiB 0 B (—) — -2 B (-0.41%) —
🟢 ↓ optimization/minimize-bigint-errors 0/bundle0.js 474 B 474 B 0 B (—) — -1 B (-0.54%) —
🔴 ↑ optimization/minimize-bigint-errors 1/bundle1.js 612 B 612 B 0 B (—) — +3 B (+1.28%) —
… 3 more, see the uploaded report

No runtime gained or lost a runtime module.

Built test/configCases with the defaults a user gets: 2302 test(s), 9353 asset(s), 102 emitted nothing.

@alexander-akait
alexander-akait merged commit 9831760 into main Oct 26, 2026
69 checks passed
@alexander-akait
alexander-akait deleted the feat/minify-gzip-gaps branch October 26, 2026 12:53
@codspeed

codspeed Bot commented Oct 26, 2026

Copy link
Copy Markdown

Merging this PR will improve performance by 37.56%

2 warnings, 1 note

⚠️ 117 benchmarks are dominated by system calls

System calls cannot be simulated consistently and are left out of the measure. The reported value understates the real cost. Switch to the Walltime instrument to measure them.

Learn more about system calls

See affected benchmarks

⚠️ Base and head ran on different runner types

Some benchmarks with significant performance changes were compared across different runner types, so the changes might not come from the code. Run base and head on the same runner type, or use CodSpeed Macro Runners for more stable results.

Learn more about Macro Runners

Open the report in CodSpeed to investigate

ℹ️ 45 benchmarks have no flamegraph

The flamegraph wasn't generated: most of the time was spent in runtime internals, which would leave nothing useful to analyze.

See affected benchmarks

⚡ 2 improved benchmarks
✅ 349 untouched benchmarks

Performance Changes

Mode Benchmark BASE HEAD Efficiency
⚡ Memory benchmark "extract-source-map", scenario '{"name":"mode-development","mode":"development"}' 560.3 KB 359.2 KB +55.98%
⚡ Memory benchmark "cache-filesystem-cold", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 145.5 KB 120 KB +21.32%

Tip

Curious why performance improved? Comment @codspeedbot explain why performance improved on this PR, or directly use the CodSpeed MCP with your agent.


Comparing feat/minify-gzip-gaps (03cd53b) with main (4b2d644)

Open in CodSpeed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: parser JavaScript parsing and dependency analysis (lib/javascript, lib/dependencies) area: types types.d.ts, JSDoc annotations, hand-maintained declarations

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant