From 5a23fc04a53d3f5b93eab7ab93b20e05b0519110 Mon Sep 17 00:00:00 2001 From: Steven Hargrove Date: Fri, 7 Jul 2017 00:53:55 -0400 Subject: [PATCH 1/2] fix: corrected order for chunk.modules (#563) * corrected order for chunk.modules loop * added regression test for #548 * upgraded to latest webpack version 3.1.0 which includes needed Chunk.sortModules method * applied change to new location of index.js --- package.json | 2 +- src/index.js | 1 + test/cases/chunk-modules-ordered-by-id/a.js | 1 + test/cases/chunk-modules-ordered-by-id/b.txt | 3 +++ test/cases/chunk-modules-ordered-by-id/c.txt | 3 +++ test/cases/chunk-modules-ordered-by-id/expected/file.css | 6 ++++++ test/cases/chunk-modules-ordered-by-id/index.js | 2 ++ test/cases/chunk-modules-ordered-by-id/webpack.config.js | 7 +++++++ 8 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 test/cases/chunk-modules-ordered-by-id/a.js create mode 100644 test/cases/chunk-modules-ordered-by-id/b.txt create mode 100644 test/cases/chunk-modules-ordered-by-id/c.txt create mode 100644 test/cases/chunk-modules-ordered-by-id/expected/file.css create mode 100644 test/cases/chunk-modules-ordered-by-id/index.js create mode 100644 test/cases/chunk-modules-ordered-by-id/webpack.config.js diff --git a/package.json b/package.json index 975a6b8b..c2cf23fd 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "node": ">= 4.3 < 5.0.0 || >= 5.10" }, "peerDependencies": { - "webpack": "^3.0.0" + "webpack": "^3.1.0" }, "homepage": "http://github.com/webpack-contrib/extract-text-webpack-plugin", "repository": { diff --git a/src/index.js b/src/index.js index 6105992e..161f67bd 100644 --- a/src/index.js +++ b/src/index.js @@ -144,6 +144,7 @@ class ExtractTextPlugin { async.forEach(chunks, (chunk, callback) => { // eslint-disable-line no-shadow const extractedChunk = extractedChunks[chunks.indexOf(chunk)]; const shouldExtract = !!(options.allChunks || isInitialOrHasNoParents(chunk)); + chunk.sortModules(); async.forEach(chunk.mapModules((c) => { return c; }), (module, callback) => { // eslint-disable-line no-shadow, arrow-body-style let meta = module[NS]; if (meta && (!meta.options.id || meta.options.id === id)) { diff --git a/test/cases/chunk-modules-ordered-by-id/a.js b/test/cases/chunk-modules-ordered-by-id/a.js new file mode 100644 index 00000000..e72da909 --- /dev/null +++ b/test/cases/chunk-modules-ordered-by-id/a.js @@ -0,0 +1 @@ +require('./c.txt'); diff --git a/test/cases/chunk-modules-ordered-by-id/b.txt b/test/cases/chunk-modules-ordered-by-id/b.txt new file mode 100644 index 00000000..6b0f2b45 --- /dev/null +++ b/test/cases/chunk-modules-ordered-by-id/b.txt @@ -0,0 +1,3 @@ +.block { + color: tomato; +} diff --git a/test/cases/chunk-modules-ordered-by-id/c.txt b/test/cases/chunk-modules-ordered-by-id/c.txt new file mode 100644 index 00000000..b0fb26a3 --- /dev/null +++ b/test/cases/chunk-modules-ordered-by-id/c.txt @@ -0,0 +1,3 @@ +.App { + color: black; +} diff --git a/test/cases/chunk-modules-ordered-by-id/expected/file.css b/test/cases/chunk-modules-ordered-by-id/expected/file.css new file mode 100644 index 00000000..cf83e47d --- /dev/null +++ b/test/cases/chunk-modules-ordered-by-id/expected/file.css @@ -0,0 +1,6 @@ +.block { + color: tomato; +} +.App { + color: black; +} diff --git a/test/cases/chunk-modules-ordered-by-id/index.js b/test/cases/chunk-modules-ordered-by-id/index.js new file mode 100644 index 00000000..5a240449 --- /dev/null +++ b/test/cases/chunk-modules-ordered-by-id/index.js @@ -0,0 +1,2 @@ +require('./a'); +require('./b.txt'); diff --git a/test/cases/chunk-modules-ordered-by-id/webpack.config.js b/test/cases/chunk-modules-ordered-by-id/webpack.config.js new file mode 100644 index 00000000..0fbc2d5c --- /dev/null +++ b/test/cases/chunk-modules-ordered-by-id/webpack.config.js @@ -0,0 +1,7 @@ +var ExtractTextPlugin = require("../../../"); +module.exports = { + entry: "./index", + plugins: [ + new ExtractTextPlugin("file.css") + ] +}; From 1ec14f21ee89e66eec6e44cb071ee9eeb968c645 Mon Sep 17 00:00:00 2001 From: Joshua Wiens Date: Sat, 24 Jun 2017 01:04:42 -0500 Subject: [PATCH 2/2] refactor: Replace usage of chunk.modules BREAKING CHANGE: Updates to `Chunk.mapModules | forEachModule | getNumberOfModules`. This release is not backwards compatible with `Webpack 2.x` due to breaking changes in webpack/webpack#4764 --- src/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/index.js b/src/index.js index 161f67bd..02f061de 100644 --- a/src/index.js +++ b/src/index.js @@ -64,7 +64,7 @@ class ExtractTextPlugin { }, this); } else if (checkedChunks.indexOf(chunk) < 0) { checkedChunks.push(chunk); - chunk.modules.slice().forEach((module) => { + chunk.forEachModule((module) => { intoChunk.addModule(module); module.addChunk(intoChunk); }); @@ -77,7 +77,7 @@ class ExtractTextPlugin { renderExtractedChunk(chunk) { const source = new ConcatSource(); - chunk.modules.forEach((module) => { + chunk.forEachModule((module) => { const moduleSource = module.source(); source.add(this.applyAdditionalInformation(moduleSource, module.additionalInformation)); }, this); @@ -145,7 +145,7 @@ class ExtractTextPlugin { const extractedChunk = extractedChunks[chunks.indexOf(chunk)]; const shouldExtract = !!(options.allChunks || isInitialOrHasNoParents(chunk)); chunk.sortModules(); - async.forEach(chunk.mapModules((c) => { return c; }), (module, callback) => { // eslint-disable-line no-shadow, arrow-body-style + async.forEach(chunk.mapModules(c => c), (module, callback) => { // eslint-disable-line no-shadow let meta = module[NS]; if (meta && (!meta.options.id || meta.options.id === id)) { const wasExtracted = Array.isArray(meta.content); @@ -182,7 +182,7 @@ class ExtractTextPlugin { }, this); extractedChunks.forEach((extractedChunk) => { if (!isInitialOrHasNoParents(extractedChunk)) { - extractedChunk.modules.slice().forEach((module) => { + extractedChunk.forEachModule((module) => { extractedChunk.removeModule(module); }); } @@ -193,7 +193,7 @@ class ExtractTextPlugin { }); compilation.plugin('additional-assets', (callback) => { extractedChunks.forEach((extractedChunk) => { - if (extractedChunk.modules.length) { + if (extractedChunk.getNumberOfModules()) { extractedChunk.modules.sort((a, b) => { if (!options.ignoreOrder && isInvalidOrder(a, b)) { compilation.errors.push(new OrderUndefinedError(a.getOriginalModule()));