Skip to content

Commit 357d073

Browse files
laysentevilebottnawi
authored andcommitted
fix: improve warning of conflict order (#465)
1 parent 50434b5 commit 357d073

File tree

8 files changed

+2454
-1651
lines changed

8 files changed

+2454
-1651
lines changed

package-lock.json

+2,384-1,636
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.js

+34-15
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,7 @@ class CssModule extends webpack.Module {
9090
}
9191

9292
class CssModuleFactory {
93-
create(
94-
{
95-
dependencies: [dependency],
96-
},
97-
callback
98-
) {
93+
create({ dependencies: [dependency] }, callback) {
9994
callback(null, new CssModule(dependency));
10095
}
10196
}
@@ -416,6 +411,9 @@ class MiniCssExtractPlugin {
416411
if (typeof chunkGroup.getModuleIndex2 === 'function') {
417412
// Store dependencies for modules
418413
const moduleDependencies = new Map(modules.map((m) => [m, new Set()]));
414+
const moduleDependenciesReasons = new Map(
415+
modules.map((m) => [m, new Map()])
416+
);
419417

420418
// Get ordered list of modules per chunk group
421419
// This loop also gathers dependencies from the ordered lists
@@ -435,9 +433,14 @@ class MiniCssExtractPlugin {
435433

436434
for (let i = 0; i < sortedModules.length; i++) {
437435
const set = moduleDependencies.get(sortedModules[i]);
436+
const reasons = moduleDependenciesReasons.get(sortedModules[i]);
438437

439438
for (let j = i + 1; j < sortedModules.length; j++) {
440-
set.add(sortedModules[j]);
439+
const module = sortedModules[j];
440+
set.add(module);
441+
const reason = reasons.get(module) || new Set();
442+
reason.add(cg);
443+
reasons.set(module, reason);
441444
}
442445
}
443446

@@ -489,16 +492,32 @@ class MiniCssExtractPlugin {
489492
// and emit a warning
490493
const fallbackModule = bestMatch.pop();
491494
if (!this.options.ignoreOrder) {
495+
const reasons = moduleDependenciesReasons.get(fallbackModule);
492496
compilation.warnings.push(
493497
new Error(
494-
`chunk ${chunk.name || chunk.id} [${pluginName}]\n` +
495-
'Conflicting order between:\n' +
496-
` * ${fallbackModule.readableIdentifier(
497-
requestShortener
498-
)}\n` +
499-
`${bestMatchDeps
500-
.map((m) => ` * ${m.readableIdentifier(requestShortener)}`)
501-
.join('\n')}`
498+
[
499+
`chunk ${chunk.name || chunk.id} [${pluginName}]`,
500+
'Conflicting order. Following module has been added:',
501+
` * ${fallbackModule.readableIdentifier(requestShortener)}`,
502+
'despite it was not able to fulfill desired ordering with these modules:',
503+
...bestMatchDeps.map((m) => {
504+
const goodReasonsMap = moduleDependenciesReasons.get(m);
505+
const goodReasons =
506+
goodReasonsMap && goodReasonsMap.get(fallbackModule);
507+
const failedChunkGroups = Array.from(
508+
reasons.get(m),
509+
(cg) => cg.name
510+
).join(', ');
511+
const goodChunkGroups =
512+
goodReasons &&
513+
Array.from(goodReasons, (cg) => cg.name).join(', ');
514+
return [
515+
` * ${m.readableIdentifier(requestShortener)}`,
516+
` - couldn't fulfill desired order of chunk group(s) ${failedChunkGroups}`,
517+
` - while fulfilling desired order of chunk group(s) ${goodChunkGroups}`,
518+
].join('\n');
519+
}),
520+
].join('\n')
502521
)
503522
);
504523
}

test/TestCases.test.js

+14
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ function compareDirectory(actual, expected) {
2525
}
2626
}
2727

28+
function compareWarning(actual, expectedFile) {
29+
if (!fs.existsSync(expectedFile)) return;
30+
31+
const expected = require(expectedFile); // eslint-disable-line global-require,import/no-dynamic-require
32+
expect(actual).toBe(expected);
33+
}
34+
2835
describe('TestCases', () => {
2936
const casesDirectory = path.resolve(__dirname, 'cases');
3037
const outputDirectory = path.resolve(__dirname, 'js');
@@ -93,6 +100,13 @@ describe('TestCases', () => {
93100

94101
compareDirectory(outputDirectoryForCase, expectedDirectory);
95102

103+
const expectedWarning = path.resolve(directoryForCase, 'warnings.js');
104+
const actualWarning = stats.toString({
105+
all: false,
106+
warnings: true,
107+
});
108+
compareWarning(actualWarning, expectedWarning);
109+
96110
done();
97111
});
98112
}, 10000);

test/cases/ignoreOrderFalse/e3.css

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
body {
2+
content: 'e3';
3+
}

test/cases/ignoreOrderFalse/expected/styles.css

+4
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ body {
66
content: 'e1';
77
}
88

9+
body {
10+
content: 'e3';
11+
}
12+

test/cases/ignoreOrderFalse/index3.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import './e2.css';
2+
import './e3.css';
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const cssLoaderPath = require.resolve('css-loader').replace(/\\/g, '/');
2+
3+
module.exports = [
4+
'',
5+
'WARNING in chunk styles [mini-css-extract-plugin]',
6+
'Conflicting order. Following module has been added:',
7+
` * css ${cssLoaderPath}!./e2.css`,
8+
'despite it was not able to fulfill desired ordering with these modules:',
9+
` * css ${cssLoaderPath}!./e1.css`,
10+
" - couldn't fulfill desired order of chunk group(s) entry2",
11+
' - while fulfilling desired order of chunk group(s) entry1',
12+
].join('\n');

test/cases/ignoreOrderFalse/webpack.config.js

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module.exports = {
44
entry: {
55
entry1: './index.js',
66
entry2: './index2.js',
7+
entry3: './index3.js',
78
},
89
module: {
910
rules: [

0 commit comments

Comments
 (0)