From 5f86eb58da2d2fb8a9dfc63a847173128e65f182 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Fri, 11 Mar 2022 16:34:17 +0300 Subject: [PATCH 1/5] add asset modules concatenation --- lib/asset/AssetGenerator.js | 45 ++++-- lib/asset/AssetParser.js | 1 + lib/asset/AssetSourceGenerator.js | 37 ++++- lib/asset/AssetSourceParser.js | 1 + .../StatsTestCases.basictest.js.snap | 145 +++++++++--------- test/statsCases/asset/a.css | 1 + test/statsCases/asset/a.source.js | 1 + test/statsCases/asset/index.js | 2 + test/statsCases/asset/webpack.config.js | 20 ++- 9 files changed, 165 insertions(+), 88 deletions(-) create mode 100644 test/statsCases/asset/a.css create mode 100644 test/statsCases/asset/a.source.js diff --git a/lib/asset/AssetGenerator.js b/lib/asset/AssetGenerator.js index 0ee074d12e5..7b778e96443 100644 --- a/lib/asset/AssetGenerator.js +++ b/lib/asset/AssetGenerator.js @@ -8,6 +8,7 @@ const mimeTypes = require("mime-types"); const path = require("path"); const { RawSource } = require("webpack-sources"); +const ConcatenationScope = require("../ConcatenationScope"); const Generator = require("../Generator"); const RuntimeGlobals = require("../RuntimeGlobals"); const createHash = require("../util/createHash"); @@ -23,6 +24,7 @@ const nonNumericOnlyHash = require("../util/nonNumericOnlyHash"); /** @typedef {import("../Generator").GenerateContext} GenerateContext */ /** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */ /** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */ /** @typedef {import("../NormalModule")} NormalModule */ /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ /** @typedef {import("../util/Hash")} Hash */ @@ -145,6 +147,15 @@ class AssetGenerator extends Generator { ).replace(/^\.\//, ""); } + /** + * @param {NormalModule} module module for which the bailout reason should be determined + * @param {ConcatenationBailoutReasonContext} context context + * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated + */ + getConcatenationBailoutReason(module, context) { + return undefined; + } + /** * @param {NormalModule} module module * @returns {string} mime type @@ -198,14 +209,21 @@ class AssetGenerator extends Generator { */ generate( module, - { runtime, chunkGraph, runtimeTemplate, runtimeRequirements, type, getData } + { + runtime, + concatenationScope, + chunkGraph, + runtimeTemplate, + runtimeRequirements, + type, + getData + } ) { switch (type) { case "asset": return module.originalSource(); default: { - runtimeRequirements.add(RuntimeGlobals.module); - + let content; const originalSource = module.originalSource(); if (module.buildInfo.dataUrl) { let encodedSource; @@ -255,11 +273,7 @@ class AssetGenerator extends Generator { } const data = getData(); data.set("url", Buffer.from(encodedSource)); - return new RawSource( - `${RuntimeGlobals.module}.exports = ${JSON.stringify( - encodedSource - )};` - ); + content = JSON.stringify(encodedSource); } else { const assetModuleFilename = this.filename || runtimeTemplate.outputOptions.assetModuleFilename; @@ -343,9 +357,22 @@ class AssetGenerator extends Generator { data.set("filename", filename); data.set("assetInfo", assetInfo); } + content = assetPath; + } + if (concatenationScope) { + concatenationScope.registerNamespaceExport( + ConcatenationScope.NAMESPACE_OBJECT_EXPORT + ); + return new RawSource( + `${runtimeTemplate.supportsConst() ? "const" : "var"} ${ + ConcatenationScope.NAMESPACE_OBJECT_EXPORT + } = ${content};` + ); + } else { + runtimeRequirements.add(RuntimeGlobals.module); return new RawSource( - `${RuntimeGlobals.module}.exports = ${assetPath};` + `${RuntimeGlobals.module}.exports = ${content};` ); } } diff --git a/lib/asset/AssetParser.js b/lib/asset/AssetParser.js index 7a0a4e307f8..3848715f2b7 100644 --- a/lib/asset/AssetParser.js +++ b/lib/asset/AssetParser.js @@ -31,6 +31,7 @@ class AssetParser extends Parser { } state.module.buildInfo.strict = true; state.module.buildMeta.exportsType = "default"; + state.module.buildMeta.defaultObject = false; if (typeof this.dataUrlCondition === "function") { state.module.buildInfo.dataUrl = this.dataUrlCondition(source, { diff --git a/lib/asset/AssetSourceGenerator.js b/lib/asset/AssetSourceGenerator.js index f8720a21b3b..6c0e51e98a6 100644 --- a/lib/asset/AssetSourceGenerator.js +++ b/lib/asset/AssetSourceGenerator.js @@ -6,11 +6,13 @@ "use strict"; const { RawSource } = require("webpack-sources"); +const ConcatenationScope = require("../ConcatenationScope"); const Generator = require("../Generator"); const RuntimeGlobals = require("../RuntimeGlobals"); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("../Generator").GenerateContext} GenerateContext */ +/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */ /** @typedef {import("../NormalModule")} NormalModule */ const TYPES = new Set(["javascript"]); @@ -21,9 +23,10 @@ class AssetSourceGenerator extends Generator { * @param {GenerateContext} generateContext context for generate * @returns {Source} generated code */ - generate(module, { chunkGraph, runtimeTemplate, runtimeRequirements }) { - runtimeRequirements.add(RuntimeGlobals.module); - + generate( + module, + { concatenationScope, chunkGraph, runtimeTemplate, runtimeRequirements } + ) { const originalSource = module.originalSource(); if (!originalSource) { @@ -38,9 +41,31 @@ class AssetSourceGenerator extends Generator { } else { encodedSource = content.toString("utf-8"); } - return new RawSource( - `${RuntimeGlobals.module}.exports = ${JSON.stringify(encodedSource)};` - ); + + let sourceContent; + if (concatenationScope) { + concatenationScope.registerNamespaceExport( + ConcatenationScope.NAMESPACE_OBJECT_EXPORT + ); + sourceContent = `${runtimeTemplate.supportsConst() ? "const" : "var"} ${ + ConcatenationScope.NAMESPACE_OBJECT_EXPORT + } = ${JSON.stringify(encodedSource)};`; + } else { + runtimeRequirements.add(RuntimeGlobals.module); + sourceContent = `${RuntimeGlobals.module}.exports = ${JSON.stringify( + encodedSource + )};`; + } + return new RawSource(sourceContent); + } + + /** + * @param {NormalModule} module module for which the bailout reason should be determined + * @param {ConcatenationBailoutReasonContext} context context + * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated + */ + getConcatenationBailoutReason(module, context) { + return undefined; } /** diff --git a/lib/asset/AssetSourceParser.js b/lib/asset/AssetSourceParser.js index 505c363e7fc..11f778c2520 100644 --- a/lib/asset/AssetSourceParser.js +++ b/lib/asset/AssetSourceParser.js @@ -23,6 +23,7 @@ class AssetSourceParser extends Parser { const { module } = state; module.buildInfo.strict = true; module.buildMeta.exportsType = "default"; + state.module.buildMeta.defaultObject = false; return state; } diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index 11b699e32e5..5e8d41dd4bb 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -152,25 +152,34 @@ webpack/runtime/make namespace object 274 bytes {main} [code generated] [no exports] [used exports unknown] -1970-04-20 12:42:42: webpack x.x.x compiled successfully in X ms (d0d97703a88fdf5418be)" +1970-04-20 12:42:42: webpack x.x.x compiled successfully in X ms (64df70d049be415e3e5e)" `; exports[`StatsTestCases should print correct stats for asset 1`] = ` "asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) -asset bundle.js 13.1 KiB [emitted] (name: main) +asset bundle.js 13.5 KiB [emitted] (name: main) asset static/file.html 12 bytes [emitted] [from: static/file.html] (auxiliary name: main) runtime modules 1.06 KiB 2 modules -asset modules 9.07 KiB (javascript) 14.6 KiB (asset) - modules by path ./ 8.9 KiB (javascript) 14.6 KiB (asset) +modules by path ./ 9.36 KiB (javascript) 14.6 KiB (asset) + modules by path ./images/ 8.86 KiB (javascript) 14.6 KiB (asset) ./images/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./images/file.svg 915 bytes [built] [code generated] ./images/file.jpg 7.92 KiB [built] [code generated] - ./static/file.html 42 bytes (javascript) 12 bytes (asset) [built] [code generated] - modules by mime type text/plain 172 bytes - data:text/plain;base64,szsaAAdsadasdfaf.. 72.2 bytes [built] [code generated] - data:text/plain,asd= 41.4 bytes [built] [code generated] - data:text/plain,XXXXXXXXXXXXXXX.. 58.8 bytes [built] [code generated] -./index.js 339 bytes [built] [code generated] + modules by path ./*.js 452 bytes + ./index.js 399 bytes [built] [code generated] + ./a.source.js 53.4 bytes [built] [code generated] + ./static/file.html 42 bytes (javascript) 12 bytes (asset) [built] [code generated] + ./a.css 16 bytes [built] [code generated] +modules by mime type text/plain 172 bytes + data:text/plain;base64,szsaAAdsadasdfaf.. 72.2 bytes [built] [code generated] + data:text/plain,asd= 41.4 bytes [built] [code generated] + data:text/plain,XXXXXXXXXXXXXXX.. 58.8 bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset bundle.js 11.7 KiB [emitted] (name: main) +orphan modules 9.13 KiB (javascript) 14.6 KiB (asset) [orphan] 9 modules +runtime modules 1.06 KiB 2 modules +./index.js + 9 modules 9.52 KiB [built] [code generated] webpack x.x.x compiled successfully in X ms" `; @@ -2565,118 +2574,110 @@ LOG from webpack.FileSystemInfo exports[`StatsTestCases should print correct stats for real-content-hash 1`] = ` "a-normal: - assets by path *.js 3.23 KiB - asset 9690d063d027560c1900-9690d0.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) - asset a6d438a0676f93383d79-a6d438.js 262 bytes [emitted] [immutable] [minimized] (name: lazy) - asset cbb9c74e42f00ada40f7-cbb9c7.js 212 bytes [emitted] [immutable] [minimized] (name: index) + assets by path *.js 3.2 KiB + asset e9785128a82e17f93bc4-e97851.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) + asset f96e917feecf51c4fc5c-f96e91.js 232 bytes [emitted] [immutable] [minimized] (name: lazy) + asset f17033ffbf027f2d71b7-f17033.js 212 bytes [emitted] [immutable] [minimized] (name: index) asset 666f2b8847021ccc7608-666f2b.js 21 bytes [emitted] [immutable] [minimized] (name: a, b) - assets by chunk 20.4 KiB (auxiliary name: lazy) - asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + assets by path *.jpg 11.8 KiB + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 2.96 KiB (5.89 KiB) = 9690d063d027560c1900-9690d0.js 2.75 KiB cbb9c74e42f00ada40f7-cbb9c7.js 212 bytes 1 auxiliary asset + Entrypoint index 2.96 KiB (5.89 KiB) = e9785128a82e17f93bc4-e97851.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset Entrypoint a 21 bytes = 666f2b8847021ccc7608-666f2b.js Entrypoint b 21 bytes = 666f2b8847021ccc7608-666f2b.js runtime modules 7.28 KiB 9 modules - orphan modules 23 bytes [orphan] 1 module - cacheable modules 514 bytes (javascript) 26.3 KiB (asset) - javascript modules 388 bytes + orphan modules 65 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules + cacheable modules 514 bytes (javascript) 11.8 KiB (asset) + javascript modules 430 bytes ./a/index.js 150 bytes [built] [code generated] ./a/a.js 22 bytes [built] [code generated] ./a/b.js 66 bytes [built] [code generated] - ./a/lazy.js + 1 modules 150 bytes [built] [code generated] - asset modules 126 bytes (javascript) 26.3 KiB (asset) + ./a/lazy.js + 2 modules 192 bytes [built] [code generated] + asset modules 84 bytes (javascript) 11.8 KiB (asset) ./a/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] - ./a/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./a/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] a-normal (webpack x.x.x) compiled successfully in X ms b-normal: - assets by path *.js 3.23 KiB - asset 1eb63f19f5ec7a706311-1eb63f.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) - asset a6d438a0676f93383d79-a6d438.js 262 bytes [emitted] [immutable] [minimized] (name: lazy) - asset cbb9c74e42f00ada40f7-cbb9c7.js 212 bytes [emitted] [immutable] [minimized] (name: index) + assets by path *.js 3.2 KiB + asset 032acf9d06089f57085f-032acf.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) + asset f96e917feecf51c4fc5c-f96e91.js 232 bytes [emitted] [immutable] [minimized] (name: lazy) + asset f17033ffbf027f2d71b7-f17033.js 212 bytes [emitted] [immutable] [minimized] (name: index) asset 666f2b8847021ccc7608-666f2b.js 21 bytes [emitted] [immutable] [minimized] (name: a, b) - assets by chunk 20.4 KiB (auxiliary name: lazy) - asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + assets by path *.jpg 11.8 KiB + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 2.96 KiB (5.89 KiB) = 1eb63f19f5ec7a706311-1eb63f.js 2.75 KiB cbb9c74e42f00ada40f7-cbb9c7.js 212 bytes 1 auxiliary asset + Entrypoint index 2.96 KiB (5.89 KiB) = 032acf9d06089f57085f-032acf.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset Entrypoint a 21 bytes = 666f2b8847021ccc7608-666f2b.js Entrypoint b 21 bytes = 666f2b8847021ccc7608-666f2b.js runtime modules 7.28 KiB 9 modules - orphan modules 19 bytes [orphan] 1 module - cacheable modules 469 bytes (javascript) 26.3 KiB (asset) - javascript modules 343 bytes + orphan modules 61 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules + cacheable modules 469 bytes (javascript) 11.8 KiB (asset) + javascript modules 385 bytes ./b/index.js 109 bytes [built] [code generated] ./b/a.js 22 bytes [built] [code generated] ./b/b.js 66 bytes [built] [code generated] - ./b/lazy.js + 1 modules 146 bytes [built] [code generated] - asset modules 126 bytes (javascript) 26.3 KiB (asset) + ./b/lazy.js + 2 modules 188 bytes [built] [code generated] + asset modules 84 bytes (javascript) 11.8 KiB (asset) ./b/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] - ./b/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./b/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] b-normal (webpack x.x.x) compiled successfully in X ms a-source-map: - assets by path *.js 3.45 KiB - asset 3c4c8b6907eb902d46e3-3c4c8b.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) - sourceMap 3c4c8b6907eb902d46e3-3c4c8b.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) - asset da6ceedb86c86e79a49a-da6cee.js 318 bytes [emitted] [immutable] [minimized] (name: lazy) - sourceMap da6ceedb86c86e79a49a-da6cee.js.map 401 bytes [emitted] [dev] (auxiliary name: lazy) - asset 9e0ae6ff74fb2c3c821b-9e0ae6.js 268 bytes [emitted] [immutable] [minimized] (name: index) - sourceMap 9e0ae6ff74fb2c3c821b-9e0ae6.js.map 366 bytes [emitted] [dev] (auxiliary name: index) + assets by path *.js 3.42 KiB + asset 1289a35df2e6455ef167-1289a3.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) + sourceMap 1289a35df2e6455ef167-1289a3.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) + asset 0a8aef384737d9f64f44-0a8aef.js 288 bytes [emitted] [immutable] [minimized] (name: lazy) + sourceMap 0a8aef384737d9f64f44-0a8aef.js.map 409 bytes [emitted] [dev] (auxiliary name: lazy) + asset da629d4acf5998c06668-da629d.js 268 bytes [emitted] [immutable] [minimized] (name: index) + sourceMap da629d4acf5998c06668-da629d.js.map 366 bytes [emitted] [dev] (auxiliary name: index) asset 222c2acc68675174e6b2-222c2a.js 77 bytes [emitted] [immutable] [minimized] (name: a, b) sourceMap 222c2acc68675174e6b2-222c2a.js.map 254 bytes [emitted] [dev] (auxiliary name: a, b) - assets by chunk 20.4 KiB (auxiliary name: lazy) - asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + assets by path *.jpg 11.8 KiB + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 3.06 KiB (20.7 KiB) = 3c4c8b6907eb902d46e3-3c4c8b.js 2.8 KiB 9e0ae6ff74fb2c3c821b-9e0ae6.js 268 bytes 3 auxiliary assets + Entrypoint index 3.06 KiB (20.7 KiB) = 1289a35df2e6455ef167-1289a3.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets Entrypoint a 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset Entrypoint b 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset runtime modules 7.28 KiB 9 modules - orphan modules 23 bytes [orphan] 1 module - cacheable modules 514 bytes (javascript) 26.3 KiB (asset) - javascript modules 388 bytes + orphan modules 65 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules + cacheable modules 514 bytes (javascript) 11.8 KiB (asset) + javascript modules 430 bytes ./a/index.js 150 bytes [built] [code generated] ./a/a.js 22 bytes [built] [code generated] ./a/b.js 66 bytes [built] [code generated] - ./a/lazy.js + 1 modules 150 bytes [built] [code generated] - asset modules 126 bytes (javascript) 26.3 KiB (asset) + ./a/lazy.js + 2 modules 192 bytes [built] [code generated] + asset modules 84 bytes (javascript) 11.8 KiB (asset) ./a/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] - ./a/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./a/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] a-source-map (webpack x.x.x) compiled successfully in X ms b-source-map: - assets by path *.js 3.45 KiB - asset 3c4c8b6907eb902d46e3-3c4c8b.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) - sourceMap 3c4c8b6907eb902d46e3-3c4c8b.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) - asset da6ceedb86c86e79a49a-da6cee.js 318 bytes [emitted] [immutable] [minimized] (name: lazy) - sourceMap da6ceedb86c86e79a49a-da6cee.js.map 397 bytes [emitted] [dev] (auxiliary name: lazy) - asset 9e0ae6ff74fb2c3c821b-9e0ae6.js 268 bytes [emitted] [immutable] [minimized] (name: index) - sourceMap 9e0ae6ff74fb2c3c821b-9e0ae6.js.map 323 bytes [emitted] [dev] (auxiliary name: index) + assets by path *.js 3.42 KiB + asset 1289a35df2e6455ef167-1289a3.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) + sourceMap 1289a35df2e6455ef167-1289a3.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) + asset 0a8aef384737d9f64f44-0a8aef.js 288 bytes [emitted] [immutable] [minimized] (name: lazy) + sourceMap 0a8aef384737d9f64f44-0a8aef.js.map 405 bytes [emitted] [dev] (auxiliary name: lazy) + asset da629d4acf5998c06668-da629d.js 268 bytes [emitted] [immutable] [minimized] (name: index) + sourceMap da629d4acf5998c06668-da629d.js.map 323 bytes [emitted] [dev] (auxiliary name: index) asset 222c2acc68675174e6b2-222c2a.js 77 bytes [emitted] [immutable] [minimized] (name: a, b) sourceMap 222c2acc68675174e6b2-222c2a.js.map 254 bytes [emitted] [dev] (auxiliary name: a, b) - assets by chunk 20.4 KiB (auxiliary name: lazy) - asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + assets by path *.jpg 11.8 KiB + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 3.06 KiB (20.7 KiB) = 3c4c8b6907eb902d46e3-3c4c8b.js 2.8 KiB 9e0ae6ff74fb2c3c821b-9e0ae6.js 268 bytes 3 auxiliary assets + Entrypoint index 3.06 KiB (20.7 KiB) = 1289a35df2e6455ef167-1289a3.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets Entrypoint a 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset Entrypoint b 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset runtime modules 7.28 KiB 9 modules - orphan modules 19 bytes [orphan] 1 module - cacheable modules 469 bytes (javascript) 26.3 KiB (asset) - javascript modules 343 bytes + orphan modules 61 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules + cacheable modules 469 bytes (javascript) 11.8 KiB (asset) + javascript modules 385 bytes ./b/index.js 109 bytes [built] [code generated] ./b/a.js 22 bytes [built] [code generated] ./b/b.js 66 bytes [built] [code generated] - ./b/lazy.js + 1 modules 146 bytes [built] [code generated] - asset modules 126 bytes (javascript) 26.3 KiB (asset) + ./b/lazy.js + 2 modules 188 bytes [built] [code generated] + asset modules 84 bytes (javascript) 11.8 KiB (asset) ./b/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] - ./b/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./b/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] b-source-map (webpack x.x.x) compiled successfully in X ms" `; diff --git a/test/statsCases/asset/a.css b/test/statsCases/asset/a.css new file mode 100644 index 00000000000..3b16b0a1e30 --- /dev/null +++ b/test/statsCases/asset/a.css @@ -0,0 +1 @@ +a{} diff --git a/test/statsCases/asset/a.source.js b/test/statsCases/asset/a.source.js new file mode 100644 index 00000000000..55ba8379a10 --- /dev/null +++ b/test/statsCases/asset/a.source.js @@ -0,0 +1 @@ +const b = 1; diff --git a/test/statsCases/asset/index.js b/test/statsCases/asset/index.js index 85b8ea92e14..d1500102e97 100644 --- a/test/statsCases/asset/index.js +++ b/test/statsCases/asset/index.js @@ -5,3 +5,5 @@ import html from "./static/file.html"; import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd==" import text2 from "data:text/plain,asd=" import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX" // 17 chars +import css from "./a.css"; +import source from "./a.source"; diff --git a/test/statsCases/asset/webpack.config.js b/test/statsCases/asset/webpack.config.js index ad7722fca7c..703e4ea37bb 100644 --- a/test/statsCases/asset/webpack.config.js +++ b/test/statsCases/asset/webpack.config.js @@ -1,5 +1,5 @@ /** @type {import("../../../").Configuration} */ -module.exports = { +const base = { mode: "production", entry: "./index.js", module: { @@ -15,6 +15,14 @@ module.exports = { filename: "static/[name][ext]" } }, + { + test: /\.css$/, + type: "asset/source" + }, + { + test: /\.source\.js$/, + type: "asset/inline" + }, { mimetype: "text/plain", type: "asset" @@ -25,3 +33,13 @@ module.exports = { filename: "bundle.js" } }; + +module.exports = [ + { + ...base, + optimization: { + concatenateModules: false + } + }, + base +]; From 3ec8a60f678db02daac873094aef159899702d28 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Tue, 15 Mar 2022 20:18:21 +0300 Subject: [PATCH 2/5] add ability to set module source types in chunk --- lib/ChunkGraph.js | 31 +++++-- lib/optimize/ModuleConcatenationPlugin.js | 13 ++- .../StatsTestCases.basictest.js.snap | 87 ++++++++++-------- test/statsCases/asset-concat/a.css | 1 + test/statsCases/asset-concat/a.source.js | 1 + test/statsCases/asset-concat/images/file.jpg | Bin 0 -> 6027 bytes test/statsCases/asset-concat/images/file.png | Bin 0 -> 14910 bytes test/statsCases/asset-concat/images/file.svg | 1 + test/statsCases/asset-concat/index.js | 9 ++ test/statsCases/asset-concat/static/file.html | 1 + .../statsCases/asset-concat/webpack.config.js | 35 +++++++ test/statsCases/asset/webpack.config.js | 19 ++-- types.d.ts | 5 + 13 files changed, 147 insertions(+), 56 deletions(-) create mode 100644 test/statsCases/asset-concat/a.css create mode 100644 test/statsCases/asset-concat/a.source.js create mode 100644 test/statsCases/asset-concat/images/file.jpg create mode 100644 test/statsCases/asset-concat/images/file.png create mode 100644 test/statsCases/asset-concat/images/file.svg create mode 100644 test/statsCases/asset-concat/index.js create mode 100644 test/statsCases/asset-concat/static/file.html create mode 100644 test/statsCases/asset-concat/webpack.config.js diff --git a/lib/ChunkGraph.js b/lib/ChunkGraph.js index ba351e17d9f..d42490d423c 100644 --- a/lib/ChunkGraph.js +++ b/lib/ChunkGraph.js @@ -85,14 +85,17 @@ const getModuleRuntimes = chunks => { }; /** - * @param {SortableSet} set the set - * @returns {Map>} modules by source type + * @param {WeakMap> | undefined} sourceTypesByModule sourceTypesByModule + * @returns {function (SortableSet): Map>} modules by source type */ -const modulesBySourceType = set => { +const modulesBySourceType = sourceTypesByModule => set => { /** @type {Map>} */ const map = new Map(); for (const module of set) { - for (const sourceType of module.getSourceTypes()) { + const sourceTypes = + (sourceTypesByModule && sourceTypesByModule.get(module)) || + module.getSourceTypes(); + for (const sourceType of sourceTypes) { let innerSet = map.get(sourceType); if (innerSet === undefined) { innerSet = new SortableSet(); @@ -201,6 +204,8 @@ class ChunkGraphChunk { constructor() { /** @type {SortableSet} */ this.modules = new SortableSet(); + /** @type {WeakMap> | undefined} */ + this.sourceTypesByModule = undefined; /** @type {Map} */ this.entryModules = new Map(); /** @type {SortableSet} */ @@ -315,6 +320,7 @@ class ChunkGraph { const cgm = this._getChunkGraphModule(module); const cgc = this._getChunkGraphChunk(chunk); cgc.modules.delete(module); + if (cgc.sourceTypesByModule) cgc.sourceTypesByModule.delete(module); cgm.chunks.delete(chunk); } @@ -568,11 +574,24 @@ class ChunkGraph { getChunkModulesIterableBySourceType(chunk, sourceType) { const cgc = this._getChunkGraphChunk(chunk); const modulesWithSourceType = cgc.modules - .getFromUnorderedCache(modulesBySourceType) + .getFromUnorderedCache(modulesBySourceType(cgc.sourceTypesByModule)) .get(sourceType); return modulesWithSourceType; } + /** + * @param {Chunk} chunk chunk + * @param {Module} module chunk module + * @param {Set} sourceTypes source types + */ + setChunkModuleSourceTypes(chunk, module, sourceTypes) { + const cgc = this._getChunkGraphChunk(chunk); + if (cgc.sourceTypesByModule === undefined) { + cgc.sourceTypesByModule = new WeakMap(); + } + cgc.sourceTypesByModule.set(module, sourceTypes); + } + /** * @param {Chunk} chunk the chunk * @param {function(Module, Module): -1|0|1} comparator comparator function @@ -593,7 +612,7 @@ class ChunkGraph { getOrderedChunkModulesIterableBySourceType(chunk, sourceType, comparator) { const cgc = this._getChunkGraphChunk(chunk); const modulesWithSourceType = cgc.modules - .getFromUnorderedCache(modulesBySourceType) + .getFromUnorderedCache(modulesBySourceType(cgc.sourceTypesByModule)) .get(sourceType); if (modulesWithSourceType === undefined) return undefined; modulesWithSourceType.sortWith(comparator); diff --git a/lib/optimize/ModuleConcatenationPlugin.js b/lib/optimize/ModuleConcatenationPlugin.js index 62175a64fcd..361f53c1250 100644 --- a/lib/optimize/ModuleConcatenationPlugin.js +++ b/lib/optimize/ModuleConcatenationPlugin.js @@ -425,7 +425,18 @@ class ModuleConcatenationPlugin { for (const chunk of chunkGraph.getModuleChunksIterable( rootModule )) { - chunkGraph.disconnectChunkAndModule(chunk, m); + const sourceTypes = m.getSourceTypes(); + if (sourceTypes.size === 1) { + chunkGraph.disconnectChunkAndModule(chunk, m); + } else { + const newSourceTypes = new Set(sourceTypes); + newSourceTypes.delete("javascript"); + chunkGraph.setChunkModuleSourceTypes( + chunk, + m, + newSourceTypes + ); + } } } } diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index 5e8d41dd4bb..f48063016c8 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -157,29 +157,36 @@ webpack/runtime/make namespace object 274 bytes {main} [code generated] exports[`StatsTestCases should print correct stats for asset 1`] = ` "asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) -asset bundle.js 13.5 KiB [emitted] (name: main) +asset bundle.js 13.4 KiB [emitted] (name: main) asset static/file.html 12 bytes [emitted] [from: static/file.html] (auxiliary name: main) runtime modules 1.06 KiB 2 modules -modules by path ./ 9.36 KiB (javascript) 14.6 KiB (asset) +modules by path ./ 9.35 KiB (javascript) 14.6 KiB (asset) modules by path ./images/ 8.86 KiB (javascript) 14.6 KiB (asset) ./images/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./images/file.svg 915 bytes [built] [code generated] ./images/file.jpg 7.92 KiB [built] [code generated] - modules by path ./*.js 452 bytes + modules by path ./*.js 424 bytes ./index.js 399 bytes [built] [code generated] - ./a.source.js 53.4 bytes [built] [code generated] + ./a.source.js 25 bytes [built] [code generated] ./static/file.html 42 bytes (javascript) 12 bytes (asset) [built] [code generated] - ./a.css 16 bytes [built] [code generated] + ./a.css 41.4 bytes [built] [code generated] modules by mime type text/plain 172 bytes data:text/plain;base64,szsaAAdsadasdfaf.. 72.2 bytes [built] [code generated] data:text/plain,asd= 41.4 bytes [built] [code generated] data:text/plain,XXXXXXXXXXXXXXX.. 58.8 bytes [built] [code generated] -webpack x.x.x compiled successfully in X ms +webpack x.x.x compiled successfully in X ms" +`; -asset bundle.js 11.7 KiB [emitted] (name: main) -orphan modules 9.13 KiB (javascript) 14.6 KiB (asset) [orphan] 9 modules +exports[`StatsTestCases should print correct stats for asset-concat 1`] = ` +"asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) +asset bundle.js 12.5 KiB [emitted] (name: main) +asset static/file.html 12 bytes [emitted] [from: static/file.html] (auxiliary name: main) +orphan modules 9.05 KiB [orphan] 7 modules runtime modules 1.06 KiB 2 modules -./index.js + 9 modules 9.52 KiB [built] [code generated] +cacheable modules 9.6 KiB (javascript) 14.6 KiB (asset) + ./index.js + 9 modules 9.52 KiB [built] [code generated] + ./images/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] + ./static/file.html 42 bytes (javascript) 12 bytes (asset) [built] [code generated] webpack x.x.x compiled successfully in X ms" `; @@ -2575,80 +2582,86 @@ LOG from webpack.FileSystemInfo exports[`StatsTestCases should print correct stats for real-content-hash 1`] = ` "a-normal: assets by path *.js 3.2 KiB - asset e9785128a82e17f93bc4-e97851.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) + asset 47b075da20b490895144-47b075.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) asset f96e917feecf51c4fc5c-f96e91.js 232 bytes [emitted] [immutable] [minimized] (name: lazy) asset f17033ffbf027f2d71b7-f17033.js 212 bytes [emitted] [immutable] [minimized] (name: index) asset 666f2b8847021ccc7608-666f2b.js 21 bytes [emitted] [immutable] [minimized] (name: a, b) - assets by path *.jpg 11.8 KiB - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + assets by chunk 20.4 KiB (auxiliary name: lazy) + asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - Entrypoint index 2.96 KiB (5.89 KiB) = e9785128a82e17f93bc4-e97851.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index 2.96 KiB (5.89 KiB) = 47b075da20b490895144-47b075.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset Entrypoint a 21 bytes = 666f2b8847021ccc7608-666f2b.js Entrypoint b 21 bytes = 666f2b8847021ccc7608-666f2b.js runtime modules 7.28 KiB 9 modules - orphan modules 65 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules - cacheable modules 514 bytes (javascript) 11.8 KiB (asset) + orphan modules 23 bytes [orphan] 1 module + cacheable modules 556 bytes (javascript) 26.3 KiB (asset) javascript modules 430 bytes ./a/index.js 150 bytes [built] [code generated] ./a/a.js 22 bytes [built] [code generated] ./a/b.js 66 bytes [built] [code generated] ./a/lazy.js + 2 modules 192 bytes [built] [code generated] - asset modules 84 bytes (javascript) 11.8 KiB (asset) + asset modules 126 bytes (javascript) 26.3 KiB (asset) ./a/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] + ./a/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./a/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] a-normal (webpack x.x.x) compiled successfully in X ms b-normal: assets by path *.js 3.2 KiB - asset 032acf9d06089f57085f-032acf.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) + asset e9785128a82e17f93bc4-e97851.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) asset f96e917feecf51c4fc5c-f96e91.js 232 bytes [emitted] [immutable] [minimized] (name: lazy) asset f17033ffbf027f2d71b7-f17033.js 212 bytes [emitted] [immutable] [minimized] (name: index) asset 666f2b8847021ccc7608-666f2b.js 21 bytes [emitted] [immutable] [minimized] (name: a, b) - assets by path *.jpg 11.8 KiB - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + assets by chunk 20.4 KiB (auxiliary name: lazy) + asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - Entrypoint index 2.96 KiB (5.89 KiB) = 032acf9d06089f57085f-032acf.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index 2.96 KiB (5.89 KiB) = e9785128a82e17f93bc4-e97851.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset Entrypoint a 21 bytes = 666f2b8847021ccc7608-666f2b.js Entrypoint b 21 bytes = 666f2b8847021ccc7608-666f2b.js runtime modules 7.28 KiB 9 modules - orphan modules 61 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules - cacheable modules 469 bytes (javascript) 11.8 KiB (asset) + orphan modules 19 bytes [orphan] 1 module + cacheable modules 511 bytes (javascript) 26.3 KiB (asset) javascript modules 385 bytes ./b/index.js 109 bytes [built] [code generated] ./b/a.js 22 bytes [built] [code generated] ./b/b.js 66 bytes [built] [code generated] ./b/lazy.js + 2 modules 188 bytes [built] [code generated] - asset modules 84 bytes (javascript) 11.8 KiB (asset) + asset modules 126 bytes (javascript) 26.3 KiB (asset) ./b/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] + ./b/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./b/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] b-normal (webpack x.x.x) compiled successfully in X ms a-source-map: assets by path *.js 3.42 KiB - asset 1289a35df2e6455ef167-1289a3.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) - sourceMap 1289a35df2e6455ef167-1289a3.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) + asset d53ad272b1161b559c05-d53ad2.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) + sourceMap d53ad272b1161b559c05-d53ad2.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) asset 0a8aef384737d9f64f44-0a8aef.js 288 bytes [emitted] [immutable] [minimized] (name: lazy) sourceMap 0a8aef384737d9f64f44-0a8aef.js.map 409 bytes [emitted] [dev] (auxiliary name: lazy) asset da629d4acf5998c06668-da629d.js 268 bytes [emitted] [immutable] [minimized] (name: index) sourceMap da629d4acf5998c06668-da629d.js.map 366 bytes [emitted] [dev] (auxiliary name: index) asset 222c2acc68675174e6b2-222c2a.js 77 bytes [emitted] [immutable] [minimized] (name: a, b) sourceMap 222c2acc68675174e6b2-222c2a.js.map 254 bytes [emitted] [dev] (auxiliary name: a, b) - assets by path *.jpg 11.8 KiB - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + assets by chunk 20.4 KiB (auxiliary name: lazy) + asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) - Entrypoint index 3.06 KiB (20.7 KiB) = 1289a35df2e6455ef167-1289a3.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index 3.06 KiB (20.7 KiB) = d53ad272b1161b559c05-d53ad2.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets Entrypoint a 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset Entrypoint b 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset runtime modules 7.28 KiB 9 modules - orphan modules 65 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules - cacheable modules 514 bytes (javascript) 11.8 KiB (asset) + orphan modules 23 bytes [orphan] 1 module + cacheable modules 556 bytes (javascript) 26.3 KiB (asset) javascript modules 430 bytes ./a/index.js 150 bytes [built] [code generated] ./a/a.js 22 bytes [built] [code generated] ./a/b.js 66 bytes [built] [code generated] ./a/lazy.js + 2 modules 192 bytes [built] [code generated] - asset modules 84 bytes (javascript) 11.8 KiB (asset) + asset modules 126 bytes (javascript) 26.3 KiB (asset) ./a/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] + ./a/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./a/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] a-source-map (webpack x.x.x) compiled successfully in X ms @@ -2662,22 +2675,24 @@ b-source-map: sourceMap da629d4acf5998c06668-da629d.js.map 323 bytes [emitted] [dev] (auxiliary name: index) asset 222c2acc68675174e6b2-222c2a.js 77 bytes [emitted] [immutable] [minimized] (name: a, b) sourceMap 222c2acc68675174e6b2-222c2a.js.map 254 bytes [emitted] [dev] (auxiliary name: a, b) - assets by path *.jpg 11.8 KiB - asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + assets by chunk 20.4 KiB (auxiliary name: lazy) + asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) + asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) Entrypoint index 3.06 KiB (20.7 KiB) = 1289a35df2e6455ef167-1289a3.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets Entrypoint a 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset Entrypoint b 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset runtime modules 7.28 KiB 9 modules - orphan modules 61 bytes (javascript) 14.6 KiB (asset) [orphan] 2 modules - cacheable modules 469 bytes (javascript) 11.8 KiB (asset) + orphan modules 19 bytes [orphan] 1 module + cacheable modules 511 bytes (javascript) 26.3 KiB (asset) javascript modules 385 bytes ./b/index.js 109 bytes [built] [code generated] ./b/a.js 22 bytes [built] [code generated] ./b/b.js 66 bytes [built] [code generated] ./b/lazy.js + 2 modules 188 bytes [built] [code generated] - asset modules 84 bytes (javascript) 11.8 KiB (asset) + asset modules 126 bytes (javascript) 26.3 KiB (asset) ./b/file.jpg 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] + ./b/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./b/file.jpg?query 42 bytes (javascript) 5.89 KiB (asset) [built] [code generated] b-source-map (webpack x.x.x) compiled successfully in X ms" `; diff --git a/test/statsCases/asset-concat/a.css b/test/statsCases/asset-concat/a.css new file mode 100644 index 00000000000..3b16b0a1e30 --- /dev/null +++ b/test/statsCases/asset-concat/a.css @@ -0,0 +1 @@ +a{} diff --git a/test/statsCases/asset-concat/a.source.js b/test/statsCases/asset-concat/a.source.js new file mode 100644 index 00000000000..55ba8379a10 --- /dev/null +++ b/test/statsCases/asset-concat/a.source.js @@ -0,0 +1 @@ +const b = 1; diff --git a/test/statsCases/asset-concat/images/file.jpg b/test/statsCases/asset-concat/images/file.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe5c6eefa791be68586c8eb05cd98a25265f15af GIT binary patch literal 6027 zcmbW5d0b5G+raN>T8U{Y64kUS%hM(bHB*#I+ElW{Ac{yE?KN!-ifN%xObenY5v@#{ z7NMe|O)Jx;W}0cXX6C#nJkRrfe((GK^IrFS=G>o|`?}8g-pjQd=qoe?WOnbe-31T` z0Bqm}pka_?6?)nW0DF6|9snQ-#1OIo3HK0i1Blf?>{lOv-H0{+^!Flk{)`a;fOr~+ z{uy%+zAg%Ec~Se%6`76r*J8HFKcmyLk^lA=)u5li#OajZdB31je*UVPboGJB4qJQC zMeDHq>TCV#%5*9x^^m}G(TNzTThp8!(NG;gOM-Nejzp*f5i|mcMnDY!13!fr;+OnV z0{|%^iVy?h5|UC&mcj$-WdH&R|ArJ57nKkfl@t#`hyWy7R8~#QKu%po+``#V{#by9 zM67Dcjukn3Hy{HY&et9Nl#sW| ze?;5L_~Z+>3-@o!D3E?SP`(-DAq|cC1+>JN{Qo}U1%LzM{6yI1L+EJo?HCaTDhib=YE1GZ`Cgj zV;E$YHH_l6ZxQCiNv}nopz{}k7nx$>6E6PdO1p9MH(K8PKXA`ql>XtXtN)wu^WTUg zqkkah{-NvxJAvpwA}%f_E-onni=?#FqDae0FPDZta%g!Ol#D!DMPbDX1r>GWHOlJi zwY1h785&tydO)xd#6LDf|DQ&Bfi&{h^r7L+#TLBuU2M7eZVG$OZc=D@*eBlS^LP8I zB&=q8F#a0nI(G!UmNA`waHNm?BB0)b7JgTJ2WNrRyWRJYuT5TrT@UrSgL~eXW_oAn zJlpyC}q5f4eKB1L1sMp(fw9nVWlShldnSIhX#u-dwSyr{!F3+`PKv<0`C8z$yqpK`)asS}@glSwnpT%N zcgw_v!i^o&{Bxu6pZd;LZs~m)b?L5dv#`6w`i}$Zk!LCbMH=YztWdc=3DrGHK-Rz!si1aCISJs*7FHl zwREm-?a*e-Ib7~fD{}Y@fkcy;^h;OJs>0KO>IPb$ZnCu@uyR^TeETbTc`V(@CiQ2k z?evXxCk{2qx>WvT=-TbFP;P&z+7x^<>U*Gf;GrUHjjU&B$e|A}pH)ov(0+OwXOdk8h!nW zHokZ7UX$y$#Wv^EwLsm^p1@;v3v1#|Sdl^r1W5ftZf`Vu#%`hMWFwXD{qo*yfX|F> z?yFZ-l!|JzS2+3tdGMdx_Cp|vWonFLkp?{>fT<8LN(Hn18SLw=*96t=9>IV9D$D$K zju8117s1vPZB@>5YY0FDC_S$Fnq0Qgu;xX55Cl%m^nM)qxv$Uc=_9wkrI&_m&z3IU zq)tvI^+L;lY|$1s-{8a#S1qf?*Jhk4{W^NBU>N;i_ujTsMf=ia?g)DR>d;7C(Ztrc z8&IKDr`2469Sd$fbY0V$|33YS%R%}0UIP7GM_q+d@HmNEmz<-Or%J?eo;y9b^-~tt zx%8T>nB`5ibyAo~%CD7&BLWUF&89~|;KKCE(@CQSmEuj&=kioA4Pks@hOv8^9_A7* zIh-&&kDtGG$#&FO%7s{zRNl%Ww{nGOz<4;+v#r2I&S(= z^DrSc!(Cc+bbPop{Jl_}dB3%w&i1*N5(FAsg%HTd7E18tFOWyc9J|iAaBNm=jUi>8 zIZnCwh0y)iHho8zOBV&TZTz#8S#CILh)`>NV6^^obF1;7;aTerftT->#zFd-OZ&sm z<ijah{jXcR3V8NoTyo)ACMLy3wL|_$rmjUIu0Q(ge&Ln1yT;CzhkM+v z5Xs|apzIS-sveY00~z9`^|K_dVE_5l#!U@2Xp?q-=6*T@SBam-{$6%C7l4l!^K)_q_z3at_a9iuFNK)&UGEoCO1E(++ ziNypT(0Y-7i5ndqOKMWQ*27R1W=2|NZM&XHCk0_R9SmWxT+-WyzI!G%)mfOfuH?Ka zVN_K4i3Cex_AXPRX3pMLlCs>IABmq&PEePXuiq>ni=JM$3%s)gW_F!t-<{03->~cB z$z*?}{dvxDFjUX_rs1H^&b-kUfUrc?r7WeE@(c=;QGd7#XaQ- zv4yxUlC5dOi7D->xfs6Mq&dm%7Q)=ToN|#Q5TO2>nLuRWB*HXh_2(x-fx~;jr!-K84W{-+;c!RdWa|ODW zCosh`8vJ|n67IG*1=l+yirZ=l8we=u^@-?Ef70S#V$syRN&LJL!YS9WrCY;!d_1CS z?e)ZVVR5ySqtk^E@{vxY`;CY39k+h&)pW1#!T4pq3)?VmO6>V6x*4sx}EuD9tIzN;lv|V^kIK@hv4mxzCQ6y+@;7BUsVe#FgB}L`#_xXti@8WKT zV=9u+Upl#{+mQ=BvJX(bEbHd55>e+*8(n=u?`)2`OKHIcJN{Jp6m@-6&`aTLda_}H zVZpMK8Bks8s9KC4OLzBWK4S9g7mCvpR_L+JyBK~q^OX=nS?)?n+lM##@!u!8X*RCK zqQ^089?y8-Xrz7xr5EpN zcWTg?zimv`2y&-%$r1@W7m}L%V|O;a$DT}m%#W|1*2^$lvSR#zKLqN`9*bU3@fk{C zm1wod>Wxm5N(8IVbE;i+@?Gaq-4JNOU9j7|J{omIFCLpc;YmD@51CTGV%R?Rs73=p^vFeQkx~>my6%!>^e|Qy(!m+Bz5s z{2mG3-Am?K_wheC=Lj6G%FmGIBAD0A4u=+g;l9&x-PXj}hAy<`>RwrKA&7M1+=|hk1iUc%AhY7d2oFC9fmn6ig98mhhc*c4>GPFe z`7J0wAf8DXmyPZ5h$Z8vA6yy3@qHzg%d(;&(BZajJ7K!MKv~Q17}tj#zwyX`D@s2D zXKy9yKwi*2!~7b{CM4xaMyL&o4!qW*Jk)pCeX=M(c6- zb7Yot<#JivOE1C$LYq|*=iK0AN|e|K5(NUwU13Mn7+J>YtF<3wZ-78;+=Bm8tVG73 zfWqH<75n}*;pN0~ypTRq(^@}A>AHtO3(ELyBnY55BpidOgF)6gp{J;cnFukxp~pM< zNjNM_D4K5dWuwg3v`d0Sxv7fw%iFdHDKrRVL14HE0z|$wnaf)tB)ntqy^FENYwa#f z;f4`{BTUQ0D@*dGFR-noS0`bpUA1K*)-~(C+$dKeT0sCk`M())Y!$ZN-~Jo|(r4c2 z+stVf6e@aoQd=1iAT)$iiupJyjuQai7uKf=qc0ND<{&`H9{eOE3sH2H;whMf+a^>Z za0m@y5FqCq4pz?9#6}SY+x;d8jxfrcM(k3_FUGKABl4;6jN$mI$Dbe=2YOYM1h4cv z>Ggu{7M&Em7V}*L>3G^cm1SWZ#yr7-@<4za;~}NEm3n*?4#vw7Y-%mT<89%jZ=)(TJqEnXM)>}f+=N?uEqXeAF@ z%jAk;;@)jzL*Njyld$`f=9&CR2ypUqCJ7-gs$l|yCjOph3H@UEYY7t85Qx(oJA#iR z_4L9|-E7hLUaydUGGjB3z_%ffnUplMam5fYD3NlK#&j(zWlR0VUD2cMBdHYt}Z@`(1(?f<1vf6zh&{zp%;r`BtVFW!EXTI7amdw zfL1e*flr-k04*gpr=+8HnEpQw-C~v~!(ZNjbBam4_{Oo(@C^M2To~-Zby19e2tufS zbKH;Q_uLoFJl(+&8A*-iyV1++m7U{4D0VX`{H|DuVGp5&j>4BGQNoN`%-D~Gr|0l% zK64G?f_W$^GtpV@nvsMTPp37R6UJ2wczZXYZS-Ud&6qDC2&?%J(^bA&h&&<|tzJ5z z5T8Yf$p1WFTud_BpA~4p;+dnu;ndV_w?P(#CYx?vSTOs6H~WRAJ%v9ov+d~6w>8uW zY+L5=CI5bjSAvi!j+}q06cL~CBQ$B$q+DP)b|pG$(C@zLenv}Q$-pzev`oGXRbq^) zS5Sjlwv;@~IDyh}Fp4@T&LMP_EyM{iw_V~B_SiJE-lpPx?`_`herPFc1wZPndBQIj+T&ONK9QZ|&Lmd@Zq_^R55Qnc@Y{Jf8I! z{t5p{2&R+&R9u)MJYgj#SHf5P@o{*B=iNON38Kw+NOOsptmYL>9geTqep?3>kkcjo z1Q&*OQ6!St6KHOF>n-+8c3&qyE7DlfC=B1<%^r`995)8=P;`Tlp{PV`8qvaj7l_l zj-kY~4{{w}7jw9xV zT-lFAI^W==hX~H41I4>|Ih+?Rw2_fyW~IqtmNt?bbS&Ce9rEO9C<-quc%FxK(`AKuwjJ6cYl2>UG9rCTCp&nld;Ha~aDNBLZJbAG6k} zj%k;w;6TjBH}OZCV>dX(ipHo$A?PRH1?HHpe)FwYTUW2?S=94|H&G0ixB*K?zo9la zj1+Ryc-xgXcI(@}N}{|8ZfMJdhVbl1OP+w;Z=NiKjappVcU|TR`7a32UaD(I)?rs} ztqvGw2v-|muhfv${oBVlI%^tvTf;Y2Wu#$dC@8!TBNXb)*6XLW8A`Ztb;K{-&;J;j zK(d!QpkG3}o_@l9@bLmxPn+Wh7rR6b{;#*2%XGqA*A(>})w>lyZ>u@MsmhMrSzmlK zAC9wL()^D{d0O-P(qmN5tKgTk4sB4d{wOA4_LGU9Q^7F!5@ZM{qG)dpT|P&2D#e~> zV~Owk{Td9^)#^eOCyp)O?XQrBq@y0b3bkLNpOySGCd5&12;H_aOf}-vo9o6@1VJX^ zk<0tFdOOW5;4p)OfEpZKa5ZrFpeI9M>30ZJIayk$Sf)IP3-4433wn&Yx=bUx^Jq}& zH_w98m~~Z}L@nyL!ac$)1jbBpR1OL!G{g)?QiRJWL)8Qh947fhA|C<>c&|0?492v!hvKZ6W`Tt<&@sac|eLboUzOVGBJDnE2iMBI5Jx zjqO$M<0$^)c}1+wuv|@SpCOhMU|W9f-*wEKB|=r5_Jk zU{@q>tC64anaC|F`sl}|!={H4FR^V|V^4IKOJZ$DT82#E@`8^pI!r{-y6ehPa^Mos z8Uo28BAObx`yW!tdh`*_mZcOVoXV=K;SDwkQyU|0!*MuBWTKWi#f1Q4>!TRkK;`#U zLKQ!~21z^KU?aB~-PAHvvhKrjjFBXO(>?;1_F%a*M>eO;f|!es>c};b#0fS*J^uxR Cke5#Y literal 0 HcmV?d00001 diff --git a/test/statsCases/asset-concat/images/file.png b/test/statsCases/asset-concat/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..fb53b9dedd3b409ea93b7db98a2c34454bf95fee GIT binary patch literal 14910 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
ci;+pI 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 ze0mK#?P283A=v(pq&vo>1<6IWGicon-square-small diff --git a/test/statsCases/asset-concat/index.js b/test/statsCases/asset-concat/index.js new file mode 100644 index 00000000000..d1500102e97 --- /dev/null +++ b/test/statsCases/asset-concat/index.js @@ -0,0 +1,9 @@ +import png from "./images/file.png"; +import svg from "./images/file.svg"; +import jpg from "./images/file.jpg"; +import html from "./static/file.html"; +import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd==" +import text2 from "data:text/plain,asd=" +import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX" // 17 chars +import css from "./a.css"; +import source from "./a.source"; diff --git a/test/statsCases/asset-concat/static/file.html b/test/statsCases/asset-concat/static/file.html new file mode 100644 index 00000000000..7c89b545c5a --- /dev/null +++ b/test/statsCases/asset-concat/static/file.html @@ -0,0 +1 @@ +
diff --git a/test/statsCases/asset-concat/webpack.config.js b/test/statsCases/asset-concat/webpack.config.js new file mode 100644 index 00000000000..67951bc27c2 --- /dev/null +++ b/test/statsCases/asset-concat/webpack.config.js @@ -0,0 +1,35 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index.js", + module: { + rules: [ + { + test: /\.(png|jpg|svg)$/, + type: "asset" + }, + { + test: /\.html$/, + type: "asset/resource", + generator: { + filename: "static/[name][ext]" + } + }, + { + test: /\.css$/, + type: "asset/inline" + }, + { + test: /\.source\.js$/, + type: "asset/source" + }, + { + mimetype: "text/plain", + type: "asset" + } + ] + }, + output: { + filename: "bundle.js" + } +}; diff --git a/test/statsCases/asset/webpack.config.js b/test/statsCases/asset/webpack.config.js index 703e4ea37bb..6f5d1756efe 100644 --- a/test/statsCases/asset/webpack.config.js +++ b/test/statsCases/asset/webpack.config.js @@ -1,5 +1,5 @@ /** @type {import("../../../").Configuration} */ -const base = { +module.exports = { mode: "production", entry: "./index.js", module: { @@ -17,11 +17,11 @@ const base = { }, { test: /\.css$/, - type: "asset/source" + type: "asset/inline" }, { test: /\.source\.js$/, - type: "asset/inline" + type: "asset/source" }, { mimetype: "text/plain", @@ -29,17 +29,10 @@ const base = { } ] }, + optimization: { + concatenateModules: false + }, output: { filename: "bundle.js" } }; - -module.exports = [ - { - ...base, - optimization: { - concatenateModules: false - } - }, - base -]; diff --git a/types.d.ts b/types.d.ts index 7ab6cc78bd1..cfaa6d486e8 100644 --- a/types.d.ts +++ b/types.d.ts @@ -809,6 +809,11 @@ declare class ChunkGraph { chunk: Chunk, sourceType: string ): undefined | Iterable; + setChunkModuleSourceTypes( + chunk: Chunk, + module: Module, + sourceTypes: Set + ): void; getOrderedChunkModulesIterable( chunk: Chunk, comparator: (arg0: Module, arg1: Module) => 0 | 1 | -1 From 3f1715f8d89985dc69ccbcbd8b05de6181be4c86 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Thu, 17 Mar 2022 11:44:50 +0300 Subject: [PATCH 3/5] generate only needed source types - in ConcatenatedModule generate only js - in NormalModule generate only used sources --- lib/ChunkGraph.js | 59 ++++++++++++++++++- lib/Module.js | 1 + lib/NormalModule.js | 5 +- lib/optimize/ConcatenatedModule.js | 3 +- lib/optimize/ModuleConcatenationPlugin.js | 5 +- .../StatsTestCases.basictest.js.snap | 2 +- types.d.ts | 7 +++ 7 files changed, 75 insertions(+), 7 deletions(-) diff --git a/lib/ChunkGraph.js b/lib/ChunkGraph.js index d42490d423c..256317328ff 100644 --- a/lib/ChunkGraph.js +++ b/lib/ChunkGraph.js @@ -113,6 +113,7 @@ const modulesBySourceType = sourceTypesByModule => set => { } return map; }; +const defaultModulesBySourceType = modulesBySourceType(undefined); /** @type {WeakMap} */ const createOrderedArrayFunctionMap = new WeakMap(); @@ -218,6 +219,21 @@ class ChunkGraphChunk { this.runtimeRequirements = undefined; /** @type {Set} */ this.runtimeRequirementsInTree = new Set(); + + this._modulesBySourceType = undefined; + } + + get modulesBySourceType() { + if (!this._modulesBySourceType) { + if (this.sourceTypesByModule) { + this._modulesBySourceType = modulesBySourceType( + this.sourceTypesByModule + ); + } else { + return defaultModulesBySourceType; + } + } + return this._modulesBySourceType; } } @@ -574,7 +590,7 @@ class ChunkGraph { getChunkModulesIterableBySourceType(chunk, sourceType) { const cgc = this._getChunkGraphChunk(chunk); const modulesWithSourceType = cgc.modules - .getFromUnorderedCache(modulesBySourceType(cgc.sourceTypesByModule)) + .getFromUnorderedCache(cgc.modulesBySourceType) .get(sourceType); return modulesWithSourceType; } @@ -592,6 +608,45 @@ class ChunkGraph { cgc.sourceTypesByModule.set(module, sourceTypes); } + /** + * @param {Chunk} chunk chunk + * @param {Module} module chunk module + * @returns {Set} source types + */ + getChunkModuleSourceTypes(chunk, module) { + const cgc = this._getChunkGraphChunk(chunk); + if (cgc.sourceTypesByModule === undefined) { + return module.getSourceTypes(); + } + return cgc.sourceTypesByModule.get(module) || module.getSourceTypes(); + } + + /** + * @param {Module} module module + * @returns {Set} source types + */ + getModuleSourceTypes(module) { + let newSet = false; + let sourceTypes; + for (const chunk of this.getModuleChunksIterable(module)) { + const cgc = this._getChunkGraphChunk(chunk); + if (cgc.sourceTypesByModule === undefined) continue; + const st = cgc.sourceTypesByModule.get(module); + if (st) { + if (!sourceTypes) { + sourceTypes = st; + continue; + } else if (!newSet) { + newSet = true; + sourceTypes = new Set(sourceTypes); + } + for (const type of st) sourceTypes.add(type); + } + } + + return sourceTypes || module.getSourceTypes(); + } + /** * @param {Chunk} chunk the chunk * @param {function(Module, Module): -1|0|1} comparator comparator function @@ -612,7 +667,7 @@ class ChunkGraph { getOrderedChunkModulesIterableBySourceType(chunk, sourceType, comparator) { const cgc = this._getChunkGraphChunk(chunk); const modulesWithSourceType = cgc.modules - .getFromUnorderedCache(modulesBySourceType(cgc.sourceTypesByModule)) + .getFromUnorderedCache(cgc.modulesBySourceType) .get(sourceType); if (modulesWithSourceType === undefined) return undefined; modulesWithSourceType.sortWith(comparator); diff --git a/lib/Module.js b/lib/Module.js index 4e0410ff0e3..781fdc17aeb 100644 --- a/lib/Module.js +++ b/lib/Module.js @@ -60,6 +60,7 @@ const makeSerializable = require("./util/makeSerializable"); * @property {ConcatenationScope=} concatenationScope when in concatenated module, information about other concatenated modules * @property {CodeGenerationResults} codeGenerationResults code generation results of other modules (need to have a codeGenerationDependency to use that) * @property {Compilation=} compilation the compilation + * @property {Omit, "delete"|"add">=} sourceTypes source types */ /** diff --git a/lib/NormalModule.js b/lib/NormalModule.js index 5484e195703..e90acd0b9ec 100644 --- a/lib/NormalModule.js +++ b/lib/NormalModule.js @@ -1176,7 +1176,8 @@ class NormalModule extends Module { chunkGraph, runtime, concatenationScope, - codeGenerationResults + codeGenerationResults, + sourceTypes }) { /** @type {Set} */ const runtimeRequirements = new Set(); @@ -1195,7 +1196,7 @@ class NormalModule extends Module { }; const sources = new Map(); - for (const type of this.generator.getTypes(this)) { + for (const type of sourceTypes || chunkGraph.getModuleSourceTypes(this)) { const source = this.error ? new RawSource( "throw new Error(" + JSON.stringify(this.error.message) + ");" diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js index cfe6c1ca417..fd88ecaea9f 100644 --- a/lib/optimize/ConcatenatedModule.js +++ b/lib/optimize/ConcatenatedModule.js @@ -1669,7 +1669,8 @@ ${defineGetters}` chunkGraph, runtime, concatenationScope, - codeGenerationResults + codeGenerationResults, + sourceTypes: TYPES }); const source = codeGenResult.sources.get("javascript"); const data = codeGenResult.data; diff --git a/lib/optimize/ModuleConcatenationPlugin.js b/lib/optimize/ModuleConcatenationPlugin.js index 361f53c1250..68b9404a7e5 100644 --- a/lib/optimize/ModuleConcatenationPlugin.js +++ b/lib/optimize/ModuleConcatenationPlugin.js @@ -425,7 +425,10 @@ class ModuleConcatenationPlugin { for (const chunk of chunkGraph.getModuleChunksIterable( rootModule )) { - const sourceTypes = m.getSourceTypes(); + const sourceTypes = chunkGraph.getChunkModuleSourceTypes( + chunk, + m + ); if (sourceTypes.size === 1) { chunkGraph.disconnectChunkAndModule(chunk, m); } else { diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index f48063016c8..90f8b8876ff 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -179,7 +179,7 @@ webpack x.x.x compiled successfully in X ms" exports[`StatsTestCases should print correct stats for asset-concat 1`] = ` "asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) -asset bundle.js 12.5 KiB [emitted] (name: main) +asset bundle.js 11.7 KiB [emitted] (name: main) asset static/file.html 12 bytes [emitted] [from: static/file.html] (auxiliary name: main) orphan modules 9.05 KiB [orphan] 7 modules runtime modules 1.06 KiB 2 modules diff --git a/types.d.ts b/types.d.ts index cfaa6d486e8..504db1793e4 100644 --- a/types.d.ts +++ b/types.d.ts @@ -814,6 +814,8 @@ declare class ChunkGraph { module: Module, sourceTypes: Set ): void; + getChunkModuleSourceTypes(chunk: Chunk, module: Module): Set; + getModuleSourceTypes(module: Module): Set; getOrderedChunkModulesIterable( chunk: Chunk, comparator: (arg0: Module, arg1: Module) => 0 | 1 | -1 @@ -1249,6 +1251,11 @@ declare interface CodeGenerationContext { * the compilation */ compilation?: Compilation; + + /** + * source types + */ + sourceTypes?: Omit, "delete" | "add">; } declare interface CodeGenerationResult { /** From ba755330c756a25ae7e3bd894fa1b0f88db5ae9f Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 28 Mar 2022 11:31:46 +0200 Subject: [PATCH 4/5] hash source types correctly for caching nitpicks --- lib/ChunkGraph.js | 63 +++++++++++------- lib/Module.js | 2 +- .../StatsTestCases.basictest.js.snap | 20 +++--- test/statsCases/asset/index.js | 6 +- .../cache/asset-concat/0/images/file.jpg | Bin 0 -> 6027 bytes .../cache/asset-concat/0/images/file.png | Bin 0 -> 14910 bytes .../cache/asset-concat/0/images/file.svg | 1 + test/watchCases/cache/asset-concat/0/index.js | 9 +++ test/watchCases/cache/asset-concat/1/index.js | 9 +++ .../cache/asset-concat/webpack.config.js | 26 ++++++++ 10 files changed, 97 insertions(+), 39 deletions(-) create mode 100644 test/watchCases/cache/asset-concat/0/images/file.jpg create mode 100644 test/watchCases/cache/asset-concat/0/images/file.png create mode 100644 test/watchCases/cache/asset-concat/0/images/file.svg create mode 100644 test/watchCases/cache/asset-concat/0/index.js create mode 100644 test/watchCases/cache/asset-concat/1/index.js create mode 100644 test/watchCases/cache/asset-concat/webpack.config.js diff --git a/lib/ChunkGraph.js b/lib/ChunkGraph.js index 256317328ff..853a09d9d60 100644 --- a/lib/ChunkGraph.js +++ b/lib/ChunkGraph.js @@ -220,20 +220,7 @@ class ChunkGraphChunk { /** @type {Set} */ this.runtimeRequirementsInTree = new Set(); - this._modulesBySourceType = undefined; - } - - get modulesBySourceType() { - if (!this._modulesBySourceType) { - if (this.sourceTypesByModule) { - this._modulesBySourceType = modulesBySourceType( - this.sourceTypesByModule - ); - } else { - return defaultModulesBySourceType; - } - } - return this._modulesBySourceType; + this._modulesBySourceType = defaultModulesBySourceType; } } @@ -336,6 +323,7 @@ class ChunkGraph { const cgm = this._getChunkGraphModule(module); const cgc = this._getChunkGraphChunk(chunk); cgc.modules.delete(module); + // No need to invalidate cgc._modulesBySourceType because we modified cgc.modules anyway if (cgc.sourceTypesByModule) cgc.sourceTypesByModule.delete(module); cgm.chunks.delete(chunk); } @@ -590,7 +578,7 @@ class ChunkGraph { getChunkModulesIterableBySourceType(chunk, sourceType) { const cgc = this._getChunkGraphChunk(chunk); const modulesWithSourceType = cgc.modules - .getFromUnorderedCache(cgc.modulesBySourceType) + .getFromUnorderedCache(cgc._modulesBySourceType) .get(sourceType); return modulesWithSourceType; } @@ -606,6 +594,8 @@ class ChunkGraph { cgc.sourceTypesByModule = new WeakMap(); } cgc.sourceTypesByModule.set(module, sourceTypes); + // Update cgc._modulesBySourceType to invalidate the cache + cgc._modulesBySourceType = modulesBySourceType(cgc.sourceTypesByModule); } /** @@ -626,25 +616,44 @@ class ChunkGraph { * @returns {Set} source types */ getModuleSourceTypes(module) { + return ( + this._getOverwrittenModuleSourceTypes(module) || module.getSourceTypes() + ); + } + + /** + * @param {Module} module module + * @returns {Set | undefined} source types + */ + _getOverwrittenModuleSourceTypes(module) { let newSet = false; let sourceTypes; for (const chunk of this.getModuleChunksIterable(module)) { const cgc = this._getChunkGraphChunk(chunk); - if (cgc.sourceTypesByModule === undefined) continue; + if (cgc.sourceTypesByModule === undefined) return; const st = cgc.sourceTypesByModule.get(module); - if (st) { - if (!sourceTypes) { - sourceTypes = st; - continue; - } else if (!newSet) { - newSet = true; - sourceTypes = new Set(sourceTypes); + if (st === undefined) return; + if (!sourceTypes) { + sourceTypes = st; + continue; + } else if (!newSet) { + for (const type of st) { + if (!newSet) { + if (!sourceTypes.has(type)) { + newSet = true; + sourceTypes = new Set(sourceTypes); + sourceTypes.add(type); + } + } else { + sourceTypes.add(type); + } } + } else { for (const type of st) sourceTypes.add(type); } } - return sourceTypes || module.getSourceTypes(); + return sourceTypes; } /** @@ -667,7 +676,7 @@ class ChunkGraph { getOrderedChunkModulesIterableBySourceType(chunk, sourceType, comparator) { const cgc = this._getChunkGraphChunk(chunk); const modulesWithSourceType = cgc.modules - .getFromUnorderedCache(cgc.modulesBySourceType) + .getFromUnorderedCache(cgc._modulesBySourceType) .get(sourceType); if (modulesWithSourceType === undefined) return undefined; modulesWithSourceType.sortWith(comparator); @@ -1547,6 +1556,10 @@ Caller might not support runtime-dependent code generation (opt-out via optimiza const graphHash = cgm.graphHashes.provide(runtime, () => { const hash = createHash(this._hashFunction); hash.update(`${cgm.id}${this.moduleGraph.isAsync(module)}`); + const sourceTypes = this._getOverwrittenModuleSourceTypes(module); + if (sourceTypes !== undefined) { + for (const type of sourceTypes) hash.update(type); + } this.moduleGraph.getExportsInfo(module).updateHash(hash, runtime); return BigInt(`0x${/** @type {string} */ (hash.digest("hex"))}`); }); diff --git a/lib/Module.js b/lib/Module.js index 781fdc17aeb..aede5945566 100644 --- a/lib/Module.js +++ b/lib/Module.js @@ -60,7 +60,7 @@ const makeSerializable = require("./util/makeSerializable"); * @property {ConcatenationScope=} concatenationScope when in concatenated module, information about other concatenated modules * @property {CodeGenerationResults} codeGenerationResults code generation results of other modules (need to have a codeGenerationDependency to use that) * @property {Compilation=} compilation the compilation - * @property {Omit, "delete"|"add">=} sourceTypes source types + * @property {ReadonlySet=} sourceTypes source types */ /** diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap index 90f8b8876ff..c7bb869e6b0 100644 --- a/test/__snapshots__/StatsTestCases.basictest.js.snap +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -160,13 +160,13 @@ exports[`StatsTestCases should print correct stats for asset 1`] = ` asset bundle.js 13.4 KiB [emitted] (name: main) asset static/file.html 12 bytes [emitted] [from: static/file.html] (auxiliary name: main) runtime modules 1.06 KiB 2 modules -modules by path ./ 9.35 KiB (javascript) 14.6 KiB (asset) +modules by path ./ 9.36 KiB (javascript) 14.6 KiB (asset) modules by path ./images/ 8.86 KiB (javascript) 14.6 KiB (asset) ./images/file.png 42 bytes (javascript) 14.6 KiB (asset) [built] [code generated] ./images/file.svg 915 bytes [built] [code generated] ./images/file.jpg 7.92 KiB [built] [code generated] - modules by path ./*.js 424 bytes - ./index.js 399 bytes [built] [code generated] + modules by path ./*.js 427 bytes + ./index.js 402 bytes [built] [code generated] ./a.source.js 25 bytes [built] [code generated] ./static/file.html 42 bytes (javascript) 12 bytes (asset) [built] [code generated] ./a.css 41.4 bytes [built] [code generated] @@ -2582,7 +2582,7 @@ LOG from webpack.FileSystemInfo exports[`StatsTestCases should print correct stats for real-content-hash 1`] = ` "a-normal: assets by path *.js 3.2 KiB - asset 47b075da20b490895144-47b075.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) + asset e9785128a82e17f93bc4-e97851.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) asset f96e917feecf51c4fc5c-f96e91.js 232 bytes [emitted] [immutable] [minimized] (name: lazy) asset f17033ffbf027f2d71b7-f17033.js 212 bytes [emitted] [immutable] [minimized] (name: index) asset 666f2b8847021ccc7608-666f2b.js 21 bytes [emitted] [immutable] [minimized] (name: a, b) @@ -2590,7 +2590,7 @@ exports[`StatsTestCases should print correct stats for real-content-hash 1`] = ` asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 2.96 KiB (5.89 KiB) = 47b075da20b490895144-47b075.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset + Entrypoint index 2.96 KiB (5.89 KiB) = e9785128a82e17f93bc4-e97851.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset Entrypoint a 21 bytes = 666f2b8847021ccc7608-666f2b.js Entrypoint b 21 bytes = 666f2b8847021ccc7608-666f2b.js runtime modules 7.28 KiB 9 modules @@ -2609,7 +2609,7 @@ exports[`StatsTestCases should print correct stats for real-content-hash 1`] = ` b-normal: assets by path *.js 3.2 KiB - asset e9785128a82e17f93bc4-e97851.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) + asset 165a2ea225896183fda9-165a2e.js 2.75 KiB [emitted] [immutable] [minimized] (name: runtime) asset f96e917feecf51c4fc5c-f96e91.js 232 bytes [emitted] [immutable] [minimized] (name: lazy) asset f17033ffbf027f2d71b7-f17033.js 212 bytes [emitted] [immutable] [minimized] (name: index) asset 666f2b8847021ccc7608-666f2b.js 21 bytes [emitted] [immutable] [minimized] (name: a, b) @@ -2617,7 +2617,7 @@ b-normal: asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 2.96 KiB (5.89 KiB) = e9785128a82e17f93bc4-e97851.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset + Entrypoint index 2.96 KiB (5.89 KiB) = 165a2ea225896183fda9-165a2e.js 2.75 KiB f17033ffbf027f2d71b7-f17033.js 212 bytes 1 auxiliary asset Entrypoint a 21 bytes = 666f2b8847021ccc7608-666f2b.js Entrypoint b 21 bytes = 666f2b8847021ccc7608-666f2b.js runtime modules 7.28 KiB 9 modules @@ -2636,8 +2636,8 @@ b-normal: a-source-map: assets by path *.js 3.42 KiB - asset d53ad272b1161b559c05-d53ad2.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) - sourceMap d53ad272b1161b559c05-d53ad2.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) + asset 1289a35df2e6455ef167-1289a3.js 2.8 KiB [emitted] [immutable] [minimized] (name: runtime) + sourceMap 1289a35df2e6455ef167-1289a3.js.map 14.5 KiB [emitted] [dev] (auxiliary name: runtime) asset 0a8aef384737d9f64f44-0a8aef.js 288 bytes [emitted] [immutable] [minimized] (name: lazy) sourceMap 0a8aef384737d9f64f44-0a8aef.js.map 409 bytes [emitted] [dev] (auxiliary name: lazy) asset da629d4acf5998c06668-da629d.js 268 bytes [emitted] [immutable] [minimized] (name: index) @@ -2648,7 +2648,7 @@ a-source-map: asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg?query 5.89 KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) asset 7382fad5b015914e0811.jpg 5.89 KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) - Entrypoint index 3.06 KiB (20.7 KiB) = d53ad272b1161b559c05-d53ad2.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets + Entrypoint index 3.06 KiB (20.7 KiB) = 1289a35df2e6455ef167-1289a3.js 2.8 KiB da629d4acf5998c06668-da629d.js 268 bytes 3 auxiliary assets Entrypoint a 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset Entrypoint b 77 bytes (254 bytes) = 222c2acc68675174e6b2-222c2a.js 1 auxiliary asset runtime modules 7.28 KiB 9 modules diff --git a/test/statsCases/asset/index.js b/test/statsCases/asset/index.js index d1500102e97..467ff94c57e 100644 --- a/test/statsCases/asset/index.js +++ b/test/statsCases/asset/index.js @@ -2,8 +2,8 @@ import png from "./images/file.png"; import svg from "./images/file.svg"; import jpg from "./images/file.jpg"; import html from "./static/file.html"; -import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd==" -import text2 from "data:text/plain,asd=" -import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX" // 17 chars +import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd=="; +import text2 from "data:text/plain,asd="; +import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX"; // 17 chars import css from "./a.css"; import source from "./a.source"; diff --git a/test/watchCases/cache/asset-concat/0/images/file.jpg b/test/watchCases/cache/asset-concat/0/images/file.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe5c6eefa791be68586c8eb05cd98a25265f15af GIT binary patch literal 6027 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 Cke5#Y literal 0 HcmV?d00001 diff --git a/test/watchCases/cache/asset-concat/0/images/file.png b/test/watchCases/cache/asset-concat/0/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..fb53b9dedd3b409ea93b7db98a2c34454bf95fee GIT binary patch literal 14910 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
ci;+pI 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 ze0mK#?P283A=v(pq&vo>1<6IWGicon-square-small diff --git a/test/watchCases/cache/asset-concat/0/index.js b/test/watchCases/cache/asset-concat/0/index.js new file mode 100644 index 00000000000..e753a8de9d0 --- /dev/null +++ b/test/watchCases/cache/asset-concat/0/index.js @@ -0,0 +1,9 @@ +import png from "./images/file.png"; +import svg from "./images/file.svg"; +import jpg from "./images/file.jpg"; + +it("should generate assets correctly", () => { + expect(png).toMatch(/^data:image\/png;base64,/); + expect(svg).toMatch(/^data:image\/svg\+xml;base64,/); + expect(jpg).toMatch(/\.jpg$/); +}); diff --git a/test/watchCases/cache/asset-concat/1/index.js b/test/watchCases/cache/asset-concat/1/index.js new file mode 100644 index 00000000000..afa409e3820 --- /dev/null +++ b/test/watchCases/cache/asset-concat/1/index.js @@ -0,0 +1,9 @@ +it("should generate assets correctly", () => { + const png = require("./images/file.png"); + const svg = require("./images/file.svg"); + const jpg = require("./images/file.jpg"); + + expect(png).toMatch(/^data:image\/png;base64,/); + expect(svg).toMatch(/^data:image\/svg\+xml;base64,/); + expect(jpg).toMatch(/\.jpg$/); +}); diff --git a/test/watchCases/cache/asset-concat/webpack.config.js b/test/watchCases/cache/asset-concat/webpack.config.js new file mode 100644 index 00000000000..b2a5d4c00bc --- /dev/null +++ b/test/watchCases/cache/asset-concat/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + cache: { + type: "memory" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset/inline" + }, + { + test: /\.jpg$/, + type: "asset/resource" + }, + { + test: /\.svg$/, + type: "asset" + } + ] + }, + optimization: { + concatenateModules: true + } +}; From 19d1a9384e7637d07f4f25094fc5bb1db2959787 Mon Sep 17 00:00:00 2001 From: Ivan Kopeykin Date: Mon, 4 Apr 2022 12:50:48 +0300 Subject: [PATCH 5/5] fix lint and tests --- test/watchCases/cache/asset-concat/test.filter.js | 3 +++ types.d.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 test/watchCases/cache/asset-concat/test.filter.js diff --git a/test/watchCases/cache/asset-concat/test.filter.js b/test/watchCases/cache/asset-concat/test.filter.js new file mode 100644 index 00000000000..87860f28c19 --- /dev/null +++ b/test/watchCases/cache/asset-concat/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !(config.experiments && config.experiments.cacheUnaffected); +}; diff --git a/types.d.ts b/types.d.ts index 504db1793e4..7ae1703ead4 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1255,7 +1255,7 @@ declare interface CodeGenerationContext { /** * source types */ - sourceTypes?: Omit, "delete" | "add">; + sourceTypes?: ReadonlySet; } declare interface CodeGenerationResult { /**