Skip to content

Commit 03440e2

Browse files
authored
fix: compressibility of modules while retaining portability (#20287)
1 parent dc644c4 commit 03440e2

File tree

11 files changed

+74
-44
lines changed

11 files changed

+74
-44
lines changed

.changeset/soft-tools-appear.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"webpack": patch
3+
---
4+
5+
Fix compressibility of modules while retaining portability.

lib/asset/AssetModulesPlugin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const {
1212
ASSET_MODULE_TYPE_RESOURCE,
1313
ASSET_MODULE_TYPE_SOURCE
1414
} = require("../ModuleTypeConstants");
15-
const { compareModulesByIdOrIdentifier } = require("../util/comparators");
15+
const { compareModulesByFullName } = require("../util/comparators");
1616
const createSchemaValidation = require("../util/create-schema-validation");
1717
const memoize = require("../util/memoize");
1818

@@ -202,7 +202,7 @@ class AssetModulesPlugin {
202202
const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
203203
chunk,
204204
ASSET_MODULE_TYPE,
205-
compareModulesByIdOrIdentifier(chunkGraph)
205+
compareModulesByFullName(compilation.compiler)
206206
);
207207
if (modules) {
208208
for (const module of modules) {

lib/css/CssModulesPlugin.js

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const CssImportDependency = require("../dependencies/CssImportDependency");
3535
const CssUrlDependency = require("../dependencies/CssUrlDependency");
3636
const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
3737
const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
38-
const { compareModulesByIdOrIdentifier } = require("../util/comparators");
38+
const { compareModulesByFullName } = require("../util/comparators");
3939
const createSchemaValidation = require("../util/create-schema-validation");
4040
const createHash = require("../util/createHash");
4141
const { getUndoPath } = require("../util/identifier");
@@ -632,8 +632,8 @@ class CssModulesPlugin {
632632
return modulesByChunkGroup[0].list.reverse();
633633
}
634634

635-
const boundCompareModulesByIdOrIdentifier = compareModulesByIdOrIdentifier(
636-
compilation.chunkGraph
635+
const boundCompareModulesByFullName = compareModulesByFullName(
636+
compilation.compiler
637637
);
638638

639639
/**
@@ -646,10 +646,7 @@ class CssModulesPlugin {
646646
return b.length === 0 ? 0 : 1;
647647
}
648648
if (b.length === 0) return -1;
649-
return boundCompareModulesByIdOrIdentifier(
650-
a[a.length - 1],
651-
b[b.length - 1]
652-
);
649+
return boundCompareModulesByFullName(a[a.length - 1], b[b.length - 1]);
653650
};
654651

655652
modulesByChunkGroup.sort(compareModuleLists);
@@ -732,7 +729,7 @@ class CssModulesPlugin {
732729
chunkGraph.getOrderedChunkModulesIterableBySourceType(
733730
chunk,
734731
CSS_IMPORT_TYPE,
735-
compareModulesByIdOrIdentifier(chunkGraph)
732+
compareModulesByFullName(compilation.compiler)
736733
)
737734
),
738735
compilation
@@ -744,7 +741,7 @@ class CssModulesPlugin {
744741
chunkGraph.getOrderedChunkModulesIterableBySourceType(
745742
chunk,
746743
CSS_TYPE,
747-
compareModulesByIdOrIdentifier(chunkGraph)
744+
compareModulesByFullName(compilation.compiler)
748745
)
749746
),
750747
compilation

lib/javascript/JavascriptModulesPlugin.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
3232
const Template = require("../Template");
3333
const { last, someInIterable } = require("../util/IterableHelpers");
3434
const StringXor = require("../util/StringXor");
35-
const { compareModulesByIdOrIdentifier } = require("../util/comparators");
35+
const { compareModulesByFullName } = require("../util/comparators");
3636
const {
3737
RESERVED_NAMES,
3838
addScopeSymbols,
@@ -747,11 +747,11 @@ class JavascriptModulesPlugin {
747747
* @returns {Source} the rendered source
748748
*/
749749
renderChunk(renderContext, hooks) {
750-
const { chunk, chunkGraph } = renderContext;
750+
const { chunk, chunkGraph, runtimeTemplate } = renderContext;
751751
const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
752752
chunk,
753753
JAVASCRIPT_TYPE,
754-
compareModulesByIdOrIdentifier(chunkGraph)
754+
compareModulesByFullName(runtimeTemplate.compilation.compiler)
755755
);
756756
const allModules = modules ? [...modules] : [];
757757
let strictHeader;
@@ -838,7 +838,7 @@ class JavascriptModulesPlugin {
838838
...(chunkGraph.getOrderedChunkModulesIterableBySourceType(
839839
chunk,
840840
JAVASCRIPT_TYPE,
841-
compareModulesByIdOrIdentifier(chunkGraph)
841+
compareModulesByFullName(runtimeTemplate.compilation.compiler)
842842
) || [])
843843
];
844844

lib/util/comparators.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
"use strict";
77

8+
const { getFullModuleName } = require("../ids/IdHelpers");
89
const { compareRuntime } = require("./runtime");
910

1011
/** @typedef {import("../Chunk")} Chunk */
@@ -13,6 +14,7 @@ const { compareRuntime } = require("./runtime");
1314
/** @typedef {import("../ChunkGraph")} ChunkGraph */
1415
/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */
1516
/** @typedef {import("../ChunkGroup")} ChunkGroup */
17+
/** @typedef {import("../Compiler")} Compiler */
1618
/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
1719
/** @typedef {import("../Dependency")} Dependency */
1820
/** @typedef {import("../dependencies/HarmonyImportSideEffectDependency")} HarmonyImportSideEffectDependency */
@@ -316,6 +318,19 @@ const compareModulesByIdOrIdentifier = (chunkGraph, a, b) => {
316318
return compareIds(a.identifier(), b.identifier());
317319
};
318320

321+
/**
322+
* Compare modules by their full name. This differs from comparing by identifier in that the values have been normalized to be relative to the compiler context.
323+
* @param {{ context: string; root: object; }} compiler the compiler, used for context and cache
324+
* @param {Module} a module
325+
* @param {Module} b module
326+
* @returns {-1 | 0 | 1} compare result
327+
*/
328+
const compareModulesByFullName = (compiler, a, b) => {
329+
const aName = getFullModuleName(a, compiler.context, compiler.root);
330+
const bName = getFullModuleName(b, compiler.context, compiler.root);
331+
return compareIds(aName, bName);
332+
};
333+
319334
/**
320335
* @param {ChunkGraph} chunkGraph the chunk graph
321336
* @param {Chunk} a chunk
@@ -590,6 +605,11 @@ module.exports.compareIterables = compareIterables;
590605

591606
module.exports.compareLocations = compareLocations;
592607

608+
/** @type {ParameterizedComparator<Compiler, Module>} */
609+
module.exports.compareModulesByFullName = createCachedParameterizedComparator(
610+
compareModulesByFullName
611+
);
612+
593613
/** @type {ParameterizedComparator<ChunkGraph, Module>} */
594614
module.exports.compareModulesById =
595615
createCachedParameterizedComparator(compareModulesById);

lib/wasm-async/AsyncWebAssemblyModulesPlugin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const Generator = require("../Generator");
1111
const { tryRunOrWebpackError } = require("../HookWebpackError");
1212
const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants");
1313
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
14-
const { compareModulesByIdOrIdentifier } = require("../util/comparators");
14+
const { compareModulesByFullName } = require("../util/comparators");
1515
const memoize = require("../util/memoize");
1616

1717
/** @typedef {import("webpack-sources").Source} Source */
@@ -139,7 +139,7 @@ class AsyncWebAssemblyModulesPlugin {
139139

140140
for (const module of chunkGraph.getOrderedChunkModulesIterable(
141141
chunk,
142-
compareModulesByIdOrIdentifier(chunkGraph)
142+
compareModulesByFullName(compiler)
143143
)) {
144144
if (module.type === WEBASSEMBLY_MODULE_TYPE_ASYNC) {
145145
const filenameTemplate = outputOptions.webassemblyModuleFilename;

lib/wasm-sync/WebAssemblyModulesPlugin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const {
1313
const { WEBASSEMBLY_MODULE_TYPE_SYNC } = require("../ModuleTypeConstants");
1414
const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");
1515
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
16-
const { compareModulesByIdOrIdentifier } = require("../util/comparators");
16+
const { compareModulesByFullName } = require("../util/comparators");
1717
const memoize = require("../util/memoize");
1818
const WebAssemblyInInitialChunkError = require("./WebAssemblyInInitialChunkError");
1919

@@ -89,7 +89,7 @@ class WebAssemblyModulesPlugin {
8989

9090
for (const module of chunkGraph.getOrderedChunkModulesIterable(
9191
chunk,
92-
compareModulesByIdOrIdentifier(chunkGraph)
92+
compareModulesByFullName(compiler)
9393
)) {
9494
if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) {
9595
const filenameTemplate = outputOptions.webassemblyModuleFilename;

test/__snapshots__/ConfigCacheTestCases.longtest.js.snap

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,6 @@ export const __webpack_esm_id__ = \\"foo\\";
5858
export const __webpack_esm_ids__ = [\\"foo\\"];
5959
export const __webpack_esm_modules__ = {
6060

61-
/***/ 125
62-
/*!***********************!*\\\\
63-
!*** css ./style.css ***!
64-
\\\\***********************/
65-
() {
66-
67-
68-
69-
/***/ },
70-
7161
/***/ 353
7262
/*!****************!*\\\\
7363
!*** ./foo.js ***!
@@ -88,6 +78,16 @@ it(\\"The dependOn chunk must be loaded before the common chunk.\\", async () =>
8878
});
8979

9080

81+
/***/ },
82+
83+
/***/ 125
84+
/*!***********************!*\\\\
85+
!*** css ./style.css ***!
86+
\\\\***********************/
87+
() {
88+
89+
90+
9191
/***/ }
9292

9393
};

test/__snapshots__/ConfigTestCases.basictest.js.snap

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,6 @@ export const __webpack_esm_id__ = \\"foo\\";
5858
export const __webpack_esm_ids__ = [\\"foo\\"];
5959
export const __webpack_esm_modules__ = {
6060

61-
/***/ 125
62-
/*!***********************!*\\\\
63-
!*** css ./style.css ***!
64-
\\\\***********************/
65-
() {
66-
67-
68-
69-
/***/ },
70-
7161
/***/ 353
7262
/*!****************!*\\\\
7363
!*** ./foo.js ***!
@@ -88,6 +78,16 @@ it(\\"The dependOn chunk must be loaded before the common chunk.\\", async () =>
8878
});
8979

9080

81+
/***/ },
82+
83+
/***/ 125
84+
/*!***********************!*\\\\
85+
!*** css ./style.css ***!
86+
\\\\***********************/
87+
() {
88+
89+
90+
9191
/***/ }
9292

9393
};
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
it("should have module ids defined in sorted order", function() {
1+
it("should have module ids defined in sorted order", function () {
2+
const ids = [];
23
for (var i = 1; i <= 5; i++) {
3-
var unusedModuleId = require("./files/file" + i + ".js");
4+
var moduleId = require("./files/file" + i + ".js");
5+
ids[i - 1] = moduleId;
46
}
57

6-
const moduleIds = Object.keys(__webpack_modules__);
8+
const expectedIds = new Set(ids);
79

8-
const sortedIds = moduleIds.slice().sort();
9-
expect(moduleIds).toEqual(sortedIds);
10+
const moduleIds = Object.keys(__webpack_modules__).filter((id) =>
11+
expectedIds.has(id)
12+
);
13+
expect(moduleIds).toEqual(ids);
1014
});

0 commit comments

Comments
 (0)