Skip to content

Commit 8a79536

Browse files
committed
feat(loader): webpack 3 module concatenation interop in extract mode
ISSUES CLOSED: #146
1 parent 110e141 commit 8a79536

3 files changed

Lines changed: 55 additions & 5 deletions

File tree

lib/utils/get-all-modules.js

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,34 @@
1+
let ConcatenatedModule;
2+
try {
3+
// eslint-disable-next-line global-require,import/no-unresolved,import/no-extraneous-dependencies
4+
ConcatenatedModule = require('webpack/lib/optimize/ConcatenatedModule');
5+
// eslint-disable-next-line no-empty
6+
} catch (e) {}
7+
18
/**
2-
* Get all modules main & child compilations.
9+
* Get all modules from main & child compilations.
10+
* Merge modules from ConcatenatedModule (when webpack.optimize.ModuleConcatenationPlugin is used)
311
* @param {Compilation} compilation
412
* @return {NormalModule[]}
513
*/
614
function getAllModules(compilation) {
715
let modules = compilation.modules;
816

9-
// Search in child compilations
17+
// Look up in child compilations
1018
if (compilation.children.length > 0) {
11-
modules = compilation.children.reduce((acc, childCompilation) => {
12-
return acc.concat(childCompilation.modules);
13-
}, modules);
19+
const childModules = compilation.children.map(getAllModules)
20+
.reduce((acc, compilationModules) => acc.concat(compilationModules), []);
21+
22+
modules = modules.concat(childModules);
23+
}
24+
25+
// Merge modules from ConcatenatedModule
26+
if (ConcatenatedModule) {
27+
const concatenatedModules = modules
28+
.filter(m => m instanceof ConcatenatedModule)
29+
.reduce((acc, m) => acc.concat(m.modules), []);
30+
31+
modules = modules.concat(concatenatedModules);
1432
}
1533

1634
return modules;

test/fixtures/entry-es6-import.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import './img/image.svg';

test/loader.test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin');
33
const HtmlPlugin = require('html-webpack-plugin');
44

55
const { isWebpack1 } = require('../lib/utils');
6+
const webpackVersion = require('../lib/utils/get-webpack-version');
67
const { loaderPath, fixturesPath } = require('./_config');
78
const {
89
rule,
@@ -274,6 +275,36 @@ describe('loader and plugin', () => {
274275
});
275276
});
276277

278+
// webpack 3 scope hoisting interop
279+
if (webpackVersion.IS_3) {
280+
// eslint-disable-next-line global-require
281+
const ModuleConcatenationPlugin = require('webpack/lib/optimize/ModuleConcatenationPlugin');
282+
283+
describe('webpack ModuleConcatenationPlugin interop', () => {
284+
it('should work', async () => {
285+
const spriteFilename = 'qwe.svg';
286+
const { assets } = await compile({
287+
entry: './entry-es6-import',
288+
module: rules(
289+
svgRule({ extract: true, spriteFilename })
290+
),
291+
plugins: [
292+
new SpritePlugin(),
293+
new ModuleConcatenationPlugin()
294+
]
295+
});
296+
297+
Object.keys(assets).should.be.lengthOf(2);
298+
assets.should.have.property(spriteFilename);
299+
});
300+
301+
// TODO
302+
it('should properly interpolate [chunkname]', () => {
303+
304+
});
305+
});
306+
}
307+
277308
it('should automatically detect modules to extract', async () => {
278309
const { assets } = await compile({
279310
entry: './entry',

0 commit comments

Comments
 (0)