From 0997a133daa831cf3a89550d3c74b315ebebe956 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Wed, 17 Feb 2021 15:37:08 +0300 Subject: [PATCH 1/7] fix: issue 701 --- package-lock.json | 2 +- src/index.js | 6 +++++- .../expected/1.a2e2caac15fbc316194f.css | 8 +++++++ .../expected/2.a2e2caac15fbc316194f.css | 8 +++++++ .../content-entries-with-same-import/index.js | 7 +++++++ .../content-entries-with-same-import/one.js | 4 ++++ .../style1.css | 3 +++ .../style2.css | 3 +++ .../content-entries-with-same-import/two.js | 4 ++++ .../webpack.config.js | 21 +++++++++++++++++++ 10 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 test/cases/content-entries-with-same-import/expected/1.a2e2caac15fbc316194f.css create mode 100644 test/cases/content-entries-with-same-import/expected/2.a2e2caac15fbc316194f.css create mode 100644 test/cases/content-entries-with-same-import/index.js create mode 100644 test/cases/content-entries-with-same-import/one.js create mode 100644 test/cases/content-entries-with-same-import/style1.css create mode 100644 test/cases/content-entries-with-same-import/style2.css create mode 100644 test/cases/content-entries-with-same-import/two.js create mode 100644 test/cases/content-entries-with-same-import/webpack.config.js diff --git a/package-lock.json b/package-lock.json index 734f5f26..46110843 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "1.3.6", + "version": "1.3.7", "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", diff --git a/src/index.js b/src/index.js index a30914fb..526da124 100644 --- a/src/index.js +++ b/src/index.js @@ -535,7 +535,11 @@ class MiniCssExtractPlugin { ? Array.from(this.getChunkModules(chunk, chunkGraph)).filter( (module) => module.type === MODULE_TYPE ) - : chunkGraph.getChunkModulesIterableBySourceType(chunk, MODULE_TYPE); + : chunkGraph.getOrderedChunkModulesIterableBySourceType( + chunk, + MODULE_TYPE, + webpack.util.comparators.compareModulesByIdentifier + ); if (modules) { const { hashFunction, hashDigest, hashDigestLength } = outputOptions; diff --git a/test/cases/content-entries-with-same-import/expected/1.a2e2caac15fbc316194f.css b/test/cases/content-entries-with-same-import/expected/1.a2e2caac15fbc316194f.css new file mode 100644 index 00000000..f6a43c7e --- /dev/null +++ b/test/cases/content-entries-with-same-import/expected/1.a2e2caac15fbc316194f.css @@ -0,0 +1,8 @@ +.a { + width: 100px; +} + +.b { + width: 100px; +} + diff --git a/test/cases/content-entries-with-same-import/expected/2.a2e2caac15fbc316194f.css b/test/cases/content-entries-with-same-import/expected/2.a2e2caac15fbc316194f.css new file mode 100644 index 00000000..c40231b8 --- /dev/null +++ b/test/cases/content-entries-with-same-import/expected/2.a2e2caac15fbc316194f.css @@ -0,0 +1,8 @@ +.b { + width: 100px; +} + +.a { + width: 100px; +} + diff --git a/test/cases/content-entries-with-same-import/index.js b/test/cases/content-entries-with-same-import/index.js new file mode 100644 index 00000000..f3b5f43e --- /dev/null +++ b/test/cases/content-entries-with-same-import/index.js @@ -0,0 +1,7 @@ +const app1 = import('./one'); +const app2 = import('./two'); + +// eslint-disable-next-line no-console +console.log(app1); +// eslint-disable-next-line no-console +console.log(app2); diff --git a/test/cases/content-entries-with-same-import/one.js b/test/cases/content-entries-with-same-import/one.js new file mode 100644 index 00000000..f9f16b34 --- /dev/null +++ b/test/cases/content-entries-with-same-import/one.js @@ -0,0 +1,4 @@ +import './style1.css'; +import './style2.css'; + +export default 'one'; diff --git a/test/cases/content-entries-with-same-import/style1.css b/test/cases/content-entries-with-same-import/style1.css new file mode 100644 index 00000000..6e0b4761 --- /dev/null +++ b/test/cases/content-entries-with-same-import/style1.css @@ -0,0 +1,3 @@ +.a { + width: 100px; +} diff --git a/test/cases/content-entries-with-same-import/style2.css b/test/cases/content-entries-with-same-import/style2.css new file mode 100644 index 00000000..16518354 --- /dev/null +++ b/test/cases/content-entries-with-same-import/style2.css @@ -0,0 +1,3 @@ +.b { + width: 100px; +} diff --git a/test/cases/content-entries-with-same-import/two.js b/test/cases/content-entries-with-same-import/two.js new file mode 100644 index 00000000..ea6f0b50 --- /dev/null +++ b/test/cases/content-entries-with-same-import/two.js @@ -0,0 +1,4 @@ +import './style2.css'; +import './style1.css'; + +export default 'two'; diff --git a/test/cases/content-entries-with-same-import/webpack.config.js b/test/cases/content-entries-with-same-import/webpack.config.js new file mode 100644 index 00000000..b317ec1c --- /dev/null +++ b/test/cases/content-entries-with-same-import/webpack.config.js @@ -0,0 +1,21 @@ +import Self from '../../../src'; + +module.exports = { + entry: './index.js', + module: { + rules: [ + { + test: /\.css$/, + use: [Self.loader, 'css-loader'], + }, + ], + }, + output: { + filename: '[name].[contenthash].js', + }, + plugins: [ + new Self({ + filename: '[name].[contenthash].css', + }), + ], +}; From 013360dd690692665b227f427d86139f290a7112 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Wed, 17 Feb 2021 15:44:38 +0300 Subject: [PATCH 2/7] fix: issue 701 --- test/cases/content-entries-with-same-import/test.filter.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test/cases/content-entries-with-same-import/test.filter.js diff --git a/test/cases/content-entries-with-same-import/test.filter.js b/test/cases/content-entries-with-same-import/test.filter.js new file mode 100644 index 00000000..042a0256 --- /dev/null +++ b/test/cases/content-entries-with-same-import/test.filter.js @@ -0,0 +1,3 @@ +const webpack = require('webpack'); + +module.exports = () => webpack.version[0] !== '4'; From f76c0a694e0712b9f7f37142b664558187ed5b62 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Thu, 18 Feb 2021 15:38:40 +0300 Subject: [PATCH 3/7] fix: improves sorting of modules --- src/index.js | 27 ++++++++++++++----- ...316194f.css => 2.b93278edf8733a516ab1.css} | 0 2 files changed, 20 insertions(+), 7 deletions(-) rename test/cases/content-entries-with-same-import/expected/{2.a2e2caac15fbc316194f.css => 2.b93278edf8733a516ab1.css} (100%) diff --git a/src/index.js b/src/index.js index 526da124..e05fbf50 100644 --- a/src/index.js +++ b/src/index.js @@ -280,6 +280,8 @@ class MiniCssExtractPlugin { baseDataPath: 'options', }); + this.sortedModulesWeakCache = new WeakMap(); + this.options = Object.assign( { filename: DEFAULT_FILENAME, ignoreOrder: false }, options @@ -531,17 +533,22 @@ class MiniCssExtractPlugin { compilation.hooks.contentHash.tap(pluginName, (chunk) => { const { outputOptions, chunkGraph } = compilation; - const modules = isWebpack4 + let modules = isWebpack4 ? Array.from(this.getChunkModules(chunk, chunkGraph)).filter( (module) => module.type === MODULE_TYPE ) - : chunkGraph.getOrderedChunkModulesIterableBySourceType( - chunk, - MODULE_TYPE, - webpack.util.comparators.compareModulesByIdentifier - ); + : chunkGraph.getChunkModulesIterableBySourceType(chunk, MODULE_TYPE); if (modules) { + modules = this.sortModules( + compilation, + chunk, + [...modules], + compilation.runtimeTemplate.requestShortener + ); + + this.sortedModulesWeakCache.set(chunk, modules); + const { hashFunction, hashDigest, hashDigestLength } = outputOptions; const createHash = compiler.webpack ? compiler.webpack.util.createHash @@ -1080,7 +1087,7 @@ class MiniCssExtractPlugin { return obj; } - renderContentAsset(compiler, compilation, chunk, modules, requestShortener) { + sortModules(compilation, chunk, modules, requestShortener) { let usedModules; const [chunkGroup] = chunk.groupsIterable; @@ -1219,6 +1226,12 @@ class MiniCssExtractPlugin { usedModules = modules; } + return usedModules; + } + + renderContentAsset(compiler, compilation, chunk, modules, requestShortener) { + const usedModules = this.sortedModulesWeakCache.get(chunk); + // TODO remove after drop webpack v4 const { ConcatSource, SourceMapSource, RawSource } = compiler.webpack ? compiler.webpack.sources diff --git a/test/cases/content-entries-with-same-import/expected/2.a2e2caac15fbc316194f.css b/test/cases/content-entries-with-same-import/expected/2.b93278edf8733a516ab1.css similarity index 100% rename from test/cases/content-entries-with-same-import/expected/2.a2e2caac15fbc316194f.css rename to test/cases/content-entries-with-same-import/expected/2.b93278edf8733a516ab1.css From 1882c24fa3f043f2725b127fb49cfa322bb0e879 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Thu, 18 Feb 2021 16:21:44 +0300 Subject: [PATCH 4/7] fix: improves sorting of modules --- src/index.js | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index e05fbf50..1e2bd0cf 100644 --- a/src/index.js +++ b/src/index.js @@ -280,7 +280,7 @@ class MiniCssExtractPlugin { baseDataPath: 'options', }); - this.sortedModulesWeakCache = new WeakMap(); + this._sortedModulesCache = new WeakMap(); this.options = Object.assign( { filename: DEFAULT_FILENAME, ignoreOrder: false }, @@ -322,6 +322,17 @@ class MiniCssExtractPlugin { } } + sortedModules(compilation, chunk, modules, requestShortener) { + let cache = this._sortedModulesCache.get(chunk); + + if (!cache) { + cache = this.sortModules(compilation, chunk, modules, requestShortener); + this._sortedModulesCache.set(chunk, cache); + } + + return cache; + } + /** @param {import("webpack").Compiler} compiler */ apply(compiler) { const webpack = compiler.webpack @@ -540,15 +551,13 @@ class MiniCssExtractPlugin { : chunkGraph.getChunkModulesIterableBySourceType(chunk, MODULE_TYPE); if (modules) { - modules = this.sortModules( + modules = this.sortedModules( compilation, chunk, [...modules], compilation.runtimeTemplate.requestShortener ); - this.sortedModulesWeakCache.set(chunk, modules); - const { hashFunction, hashDigest, hashDigestLength } = outputOptions; const createHash = compiler.webpack ? compiler.webpack.util.createHash @@ -1230,7 +1239,12 @@ class MiniCssExtractPlugin { } renderContentAsset(compiler, compilation, chunk, modules, requestShortener) { - const usedModules = this.sortedModulesWeakCache.get(chunk); + const usedModules = this.sortedModules( + compilation, + chunk, + modules, + requestShortener + ); // TODO remove after drop webpack v4 const { ConcatSource, SourceMapSource, RawSource } = compiler.webpack From acd68250399a77aebc65a14266fec0849e15e784 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Thu, 18 Feb 2021 16:34:51 +0300 Subject: [PATCH 5/7] fix: improves sorting of modules --- src/index.js | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/index.js b/src/index.js index 1e2bd0cf..9a3f17a2 100644 --- a/src/index.js +++ b/src/index.js @@ -325,8 +325,13 @@ class MiniCssExtractPlugin { sortedModules(compilation, chunk, modules, requestShortener) { let cache = this._sortedModulesCache.get(chunk); - if (!cache) { - cache = this.sortModules(compilation, chunk, modules, requestShortener); + if (!cache && modules) { + cache = this.sortModules( + compilation, + chunk, + [...modules], + requestShortener + ); this._sortedModulesCache.set(chunk, cache); } @@ -544,20 +549,21 @@ class MiniCssExtractPlugin { compilation.hooks.contentHash.tap(pluginName, (chunk) => { const { outputOptions, chunkGraph } = compilation; - let modules = isWebpack4 + const modules = isWebpack4 ? Array.from(this.getChunkModules(chunk, chunkGraph)).filter( (module) => module.type === MODULE_TYPE ) - : chunkGraph.getChunkModulesIterableBySourceType(chunk, MODULE_TYPE); + : this.sortedModules( + compilation, + chunk, + chunkGraph.getChunkModulesIterableBySourceType( + chunk, + MODULE_TYPE + ), + compilation.runtimeTemplate.requestShortener + ); if (modules) { - modules = this.sortedModules( - compilation, - chunk, - [...modules], - compilation.runtimeTemplate.requestShortener - ); - const { hashFunction, hashDigest, hashDigestLength } = outputOptions; const createHash = compiler.webpack ? compiler.webpack.util.createHash From c5ba6d7883762486b3273523ab7f2fa684f026a8 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Thu, 18 Feb 2021 16:57:16 +0300 Subject: [PATCH 6/7] fix: improves sorting of modules --- test/TestCache.test.js | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/test/TestCache.test.js b/test/TestCache.test.js index d488b5e0..ed192cfe 100644 --- a/test/TestCache.test.js +++ b/test/TestCache.test.js @@ -167,7 +167,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler1.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -207,7 +209,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler2.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -274,7 +278,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler1.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -316,7 +322,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler2.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -385,7 +393,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler1.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -428,7 +438,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler2.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -497,7 +509,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler1.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); @@ -540,7 +554,9 @@ describe('TestCache', () => { expect(stats.compilation.errors).toHaveLength(0); compiler2.close(() => { - resolve(); + process.nextTick(() => { + resolve(); + }); }); }); }); From c3eb08b29e9fad8f25b0fb8e374df96c7e22bdb4 Mon Sep 17 00:00:00 2001 From: cap-Bernardito Date: Thu, 18 Feb 2021 17:33:01 +0300 Subject: [PATCH 7/7] fix: improves sorting of modules --- src/index.js | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/index.js b/src/index.js index 9a3f17a2..73c34458 100644 --- a/src/index.js +++ b/src/index.js @@ -322,22 +322,6 @@ class MiniCssExtractPlugin { } } - sortedModules(compilation, chunk, modules, requestShortener) { - let cache = this._sortedModulesCache.get(chunk); - - if (!cache && modules) { - cache = this.sortModules( - compilation, - chunk, - [...modules], - requestShortener - ); - this._sortedModulesCache.set(chunk, cache); - } - - return cache; - } - /** @param {import("webpack").Compiler} compiler */ apply(compiler) { const webpack = compiler.webpack @@ -553,7 +537,7 @@ class MiniCssExtractPlugin { ? Array.from(this.getChunkModules(chunk, chunkGraph)).filter( (module) => module.type === MODULE_TYPE ) - : this.sortedModules( + : this.sortModules( compilation, chunk, chunkGraph.getChunkModulesIterableBySourceType( @@ -1103,7 +1087,13 @@ class MiniCssExtractPlugin { } sortModules(compilation, chunk, modules, requestShortener) { - let usedModules; + let usedModules = this._sortedModulesCache.get(chunk); + + if (usedModules || !modules) { + return usedModules; + } + + modules = [...modules]; const [chunkGroup] = chunk.groupsIterable; const moduleIndexFunctionName = @@ -1241,11 +1231,13 @@ class MiniCssExtractPlugin { usedModules = modules; } + this._sortedModulesCache.set(chunk, usedModules); + return usedModules; } renderContentAsset(compiler, compilation, chunk, modules, requestShortener) { - const usedModules = this.sortedModules( + const usedModules = this.sortModules( compilation, chunk, modules,