From 916bf69cae1971227645d8c388edfd637ef7dff3 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Mon, 11 Jan 2021 17:20:51 +0100 Subject: [PATCH] compute chunk roots correctly when using transitive connections also use module.nameForCondition() to compute module ids fixes https://github.com/webpack-contrib/mini-css-extract-plugin/issues/676 --- lib/ChunkGraph.js | 18 +++++++++--- lib/ids/IdHelpers.js | 11 ++++++-- .../plugins/mini-css-extract-plugin/chunk.js | 2 ++ .../mini-css-extract-plugin/webpack.config.js | 28 +++++++++++++++++-- .../plugins/mini-css-extract-plugin/x.js | 1 + 5 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 test/configCases/plugins/mini-css-extract-plugin/x.js diff --git a/lib/ChunkGraph.js b/lib/ChunkGraph.js index 48494895318..b79902ae9a3 100644 --- a/lib/ChunkGraph.js +++ b/lib/ChunkGraph.js @@ -6,6 +6,7 @@ "use strict"; const util = require("util"); +const ModuleGraphConnection = require("./ModuleGraphConnection"); const SortableSet = require("./util/SortableSet"); const { compareModulesById, @@ -272,10 +273,19 @@ class ChunkGraph { findGraphRoots(set, module => { /** @type {Set} */ const set = new Set(); - for (const connection of moduleGraph.getOutgoingConnections(module)) { - if (!connection.module) continue; - set.add(connection.module); - } + const addDependencies = module => { + for (const connection of moduleGraph.getOutgoingConnections(module)) { + if (!connection.module) continue; + const activeState = connection.getActiveState(undefined); + if (activeState === false) continue; + if (activeState === ModuleGraphConnection.TRANSITIVE_ONLY) { + addDependencies(connection.module); + continue; + } + set.add(connection.module); + } + }; + addDependencies(module); return set; }) ).sort(compareModulesByIdentifier); diff --git a/lib/ids/IdHelpers.js b/lib/ids/IdHelpers.js index b9958b4a062..e5e2be5f25d 100644 --- a/lib/ids/IdHelpers.js +++ b/lib/ids/IdHelpers.js @@ -77,9 +77,14 @@ const shortenLongString = (string, delimiter) => { * @returns {string} short module name */ const getShortModuleName = (module, context, associatedObjectForCache) => { - return avoidNumber( - module.libIdent({ context, associatedObjectForCache }) || "" - ); + const libIdent = module.libIdent({ context, associatedObjectForCache }); + if (libIdent) return avoidNumber(libIdent); + const nameForCondition = module.nameForCondition(); + if (nameForCondition) + return avoidNumber( + makePathsRelative(context, nameForCondition, associatedObjectForCache) + ); + return ""; }; exports.getShortModuleName = getShortModuleName; diff --git a/test/configCases/plugins/mini-css-extract-plugin/chunk.js b/test/configCases/plugins/mini-css-extract-plugin/chunk.js index c7300ee6e93..a39adf003eb 100644 --- a/test/configCases/plugins/mini-css-extract-plugin/chunk.js +++ b/test/configCases/plugins/mini-css-extract-plugin/chunk.js @@ -1 +1,3 @@ import "./chunk.css"; + +export default 42; diff --git a/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js b/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js index 37397dd2494..b04b470d415 100644 --- a/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js +++ b/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js @@ -5,7 +5,8 @@ module.exports = { entry: { a: "./a", b: "./b", - c: "./c.css" + c: "./c.css", + x: "./x" // also imports chunk but with different exports }, output: { filename: "[name].js" @@ -18,9 +19,32 @@ module.exports = { } ] }, + optimization: { + chunkIds: "named" + }, target: "web", node: { __dirname: false }, - plugins: [new MCEP()] + plugins: [ + new MCEP(), + compiler => { + compiler.hooks.done.tap("Test", stats => { + const chunkIds = stats + .toJson({ all: false, chunks: true, ids: true }) + .chunks.map(c => c.id) + .sort(); + expect(chunkIds).toEqual([ + "a", + "b", + "c", + "chunk_js-_43b60", + "chunk_js-_43b61", + "chunk_js-_43b62", + "d_css", + "x" + ]); + }); + } + ] }; diff --git a/test/configCases/plugins/mini-css-extract-plugin/x.js b/test/configCases/plugins/mini-css-extract-plugin/x.js new file mode 100644 index 00000000000..0c441475d80 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/x.js @@ -0,0 +1 @@ +import(/* webpackExports: [] */ "./chunk");