Skip to content

Commit 47ae6dc

Browse files
committed
only add deduplicate code if deduplicated modules are in the chunk.
1 parent a91cff4 commit 47ae6dc

File tree

4 files changed

+66
-28
lines changed

4 files changed

+66
-28
lines changed

examples/code-splitted-dedupe/README.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,15 @@ require(["../dedupe/b"]);
8787
/******/ }
8888
/******/ for(moduleId in moreModules) {
8989
/******/ var _m = moreModules[moduleId];
90+
/******/
91+
/******/ // Check if module is deduplicated
9092
/******/ switch(typeof _m) {
9193
/******/ case "number":
94+
/******/ // Module is a copy of another module
9295
/******/ modules[moduleId] = modules[_m];
9396
/******/ break;
9497
/******/ case "object":
98+
/******/ // Module can be created from a template
9599
/******/ modules[moduleId] = (function(_m) {
96100
/******/ var args = _m.slice(1), fn = modules[_m[0]];
97101
/******/ return function (a,b,c) {
@@ -100,6 +104,7 @@ require(["../dedupe/b"]);
100104
/******/ }(_m));
101105
/******/ break;
102106
/******/ default:
107+
/******/ // Normal module
103108
/******/ modules[moduleId] = _m;
104109
/******/ }
105110
/******/ }
@@ -112,12 +117,15 @@ require(["../dedupe/b"]);
112117
/******/ })
113118
/************************************************************************/
114119
/******/ ((function(modules) {
120+
// Check all modules for deduplicated modules
115121
for(var i in modules) {
116122
switch(typeof modules[i]) {
117123
case "number":
124+
// Module is a copy of another module
118125
modules[i] = modules[modules[i]];
119126
break;
120127
case "object":
128+
// Module can be created from a template
121129
modules[i] = (function(_m) {
122130
var args = _m.slice(1), fn = modules[_m[0]];
123131
return function (a,b,c) {
@@ -360,10 +368,10 @@ webpackJsonp([4],
360368

361369
```
362370
Hash: 46d170ad35acc40bf3ea
363-
Version: webpack 0.10.0-beta20
364-
Time: 101ms
371+
Version: webpack 0.10.0-beta22
372+
Time: 95ms
365373
Asset Size Chunks Chunk Names
366-
output.js 4645 0 [emitted] main
374+
output.js 4972 0 [emitted] main
367375
1.output.js 1485 1, 3 [emitted]
368376
2.output.js 877 2, 4 [emitted]
369377
3.output.js 875 3 [emitted]
@@ -377,8 +385,8 @@ chunk {1} 1.output.js 492 {0} [rendered]
377385
[3] (webpack)/~/bundle-loader?lazy!../dedupe/b/index.js 207 {1} [built]
378386
amd require bundle?lazy!../dedupe/b [0] ./example.js 2:0-51
379387
[4] ../dedupe/z.js 34 {1} {2} {3} [built]
380-
cjs require ../z [2] ../dedupe/b/index.js 4:4-19
381388
cjs require ../z [1] ../dedupe/a/index.js 4:4-19
389+
cjs require ../z [2] ../dedupe/b/index.js 4:4-19
382390
[5] ../dedupe/a/x.js 34 {1} {3} [built]
383391
cjs require ./x [1] ../dedupe/a/index.js 2:4-18
384392
[6] ../dedupe/a/y.js 49 {1} {3} [built]
@@ -391,8 +399,8 @@ chunk {2} 2.output.js 201 {0} [rendered]
391399
amd require ../dedupe/b [0] ./example.js 6:0-24
392400
cjs require !!(webpack)\examples\dedupe\b\index.js [3] (webpack)/~/bundle-loader?lazy!../dedupe/b/index.js 3:5-126
393401
[4] ../dedupe/z.js 34 {1} {2} {3} [built]
394-
cjs require ../z [2] ../dedupe/b/index.js 4:4-19
395402
cjs require ../z [1] ../dedupe/a/index.js 4:4-19
403+
cjs require ../z [2] ../dedupe/b/index.js 4:4-19
396404
[7] ../dedupe/b/x.js 34 {2} {4} [built]
397405
cjs require ./x [2] ../dedupe/b/index.js 2:4-18
398406
[8] ../dedupe/b/y.js 49 {2} {4} [built]
@@ -402,8 +410,8 @@ chunk {3} 3.output.js 201 {0} [rendered]
402410
amd require ../dedupe/a [0] ./example.js 2:0-51
403411
amd require ../dedupe/a [0] ./example.js 5:0-24
404412
[4] ../dedupe/z.js 34 {1} {2} {3} [built]
405-
cjs require ../z [2] ../dedupe/b/index.js 4:4-19
406413
cjs require ../z [1] ../dedupe/a/index.js 4:4-19
414+
cjs require ../z [2] ../dedupe/b/index.js 4:4-19
407415
[5] ../dedupe/a/x.js 34 {1} {3} [built]
408416
cjs require ./x [1] ../dedupe/a/index.js 2:4-18
409417
[6] ../dedupe/a/y.js 49 {1} {3} [built]
@@ -422,8 +430,8 @@ chunk {4} 4.output.js 167 {1} [rendered]
422430

423431
```
424432
Hash: 46d170ad35acc40bf3ea
425-
Version: webpack 0.10.0-beta20
426-
Time: 273ms
433+
Version: webpack 0.10.0-beta22
434+
Time: 267ms
427435
Asset Size Chunks Chunk Names
428436
output.js 1151 0 [emitted] main
429437
1.output.js 294 1, 3 [emitted]

examples/dedupe/README.md

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,15 @@ module.exports = {"this is": "z"};
105105
/******/ })
106106
/************************************************************************/
107107
/******/ ((function(modules) {
108+
// Check all modules for deduplicated modules
108109
for(var i in modules) {
109110
switch(typeof modules[i]) {
110111
case "number":
112+
// Module is a copy of another module
111113
modules[i] = modules[modules[i]];
112114
break;
113115
case "object":
116+
// Module can be created from a template
114117
modules[i] = (function(_m) {
115118
var args = _m.slice(1), fn = modules[_m[0]];
116119
return function (a,b,c) {
@@ -207,59 +210,59 @@ module.exports = {"this is": "z"};
207210
## Uncompressed
208211

209212
```
210-
Hash: 4afc9f4631bed4b86de9
211-
Version: webpack 0.10.0-beta20
212-
Time: 42ms
213+
Hash: 15b13398a7aae2eaaec9
214+
Version: webpack 0.10.0-beta22
215+
Time: 54ms
213216
Asset Size Chunks Chunk Names
214-
output.js 3223 0 [emitted] main
215-
chunk {0} output.js (main) 513 [rendered]
216-
[0] ./example.js 73 {0} [built]
217+
output.js 3362 0 [emitted] main
218+
chunk {0} output.js (main) 528 [rendered]
219+
[0] ./example.js 76 {0} [built]
217220
[1] ./z.js 34 {0} [built]
218221
cjs require ../z [2] ./a/index.js 4:4-19
219222
cjs require ../z [5] ./b/index.js 4:4-19
220-
[2] ./a/index.js 80 {0} [built]
223+
[2] ./a/index.js 84 {0} [built]
221224
cjs require ./a [0] ./example.js 1:8-22
222225
[3] ./a/x.js 34 {0} [built]
223226
cjs require ./x [2] ./a/index.js 2:4-18
224227
[4] ./a/y.js 49 {0} [built]
225228
cjs require ./y [2] ./a/index.js 3:4-18
226-
[5] ./b/index.js 80 {0} [built]
229+
[5] ./b/index.js 84 {0} [built]
227230
cjs require ./b [0] ./example.js 2:8-22
228231
[6] ./b/x.js 34 {0} [built]
229232
cjs require ./x [5] ./b/index.js 2:4-18
230233
[7] ./b/y.js 49 {0} [built]
231234
cjs require ./y [5] ./b/index.js 3:4-18
232-
[8] 80 {0} [not cacheable] [built]
235+
[8] 84 {0} [not cacheable] [built]
233236
template 1 [2] ./a/index.js
234237
template 1 [5] ./b/index.js
235238
```
236239

237240
## Minimized (uglify-js, no zip)
238241

239242
```
240-
Hash: 4afc9f4631bed4b86de9
241-
Version: webpack 0.10.0-beta20
242-
Time: 98ms
243+
Hash: 15b13398a7aae2eaaec9
244+
Version: webpack 0.10.0-beta22
245+
Time: 137ms
243246
Asset Size Chunks Chunk Names
244-
output.js 776 0 [emitted] main
245-
chunk {0} output.js (main) 513 [rendered]
246-
[0] ./example.js 73 {0} [built]
247+
output.js 777 0 [emitted] main
248+
chunk {0} output.js (main) 528 [rendered]
249+
[0] ./example.js 76 {0} [built]
247250
[1] ./z.js 34 {0} [built]
248251
cjs require ../z [2] ./a/index.js 4:4-19
249252
cjs require ../z [5] ./b/index.js 4:4-19
250-
[2] ./a/index.js 80 {0} [built]
253+
[2] ./a/index.js 84 {0} [built]
251254
cjs require ./a [0] ./example.js 1:8-22
252255
[3] ./a/x.js 34 {0} [built]
253256
cjs require ./x [2] ./a/index.js 2:4-18
254257
[4] ./a/y.js 49 {0} [built]
255258
cjs require ./y [2] ./a/index.js 3:4-18
256-
[5] ./b/index.js 80 {0} [built]
259+
[5] ./b/index.js 84 {0} [built]
257260
cjs require ./b [0] ./example.js 2:8-22
258261
[6] ./b/x.js 34 {0} [built]
259262
cjs require ./x [5] ./b/index.js 2:4-18
260263
[7] ./b/y.js 49 {0} [built]
261264
cjs require ./y [5] ./b/index.js 3:4-18
262-
[8] 80 {0} [not cacheable] [built]
265+
[8] 84 {0} [not cacheable] [built]
263266
template 1 [2] ./a/index.js
264267
template 1 [5] ./b/index.js
265268
```

lib/optimize/DedupePlugin.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ DedupePlugin.prototype.apply = function(compiler) {
3636
compilation.plugin("after-optimize-chunks", function(chunks) {
3737
var entryChunks = chunks.filter(function(c) { return c.entry; });
3838
entryChunks.forEach(function(chunk) { // for each entry chunk
39+
var hasDeduplicatedModules = false;
3940
(function x(dups, roots, visited, chunk) {
4041
var currentDups = [];
4142
var currentRoots = [];
@@ -51,6 +52,7 @@ DedupePlugin.prototype.apply = function(compiler) {
5152
module.rootDuplicates[chunkIndex].push(module);
5253
module.rootDuplicates[chunkIndex].commonModules =
5354
mergeCommonModules(module.rootDuplicates[chunkIndex].commonModules, module.getAllModuleDependencies());
55+
hasDeduplicatedModules = true;
5456
} else {
5557
idx = dups.indexOf(module.duplicates);
5658
if(idx < 0) {
@@ -65,6 +67,7 @@ DedupePlugin.prototype.apply = function(compiler) {
6567
module.rootDuplicates[chunkIndex] = roots[idx];
6668
module.rootDuplicates[chunkIndex].commonModules =
6769
mergeCommonModules(module.rootDuplicates[chunkIndex].commonModules, module.getAllModuleDependencies());
70+
hasDeduplicatedModules = true;
6871
}
6972
}
7073
}
@@ -83,9 +86,12 @@ DedupePlugin.prototype.apply = function(compiler) {
8386
chunk.addModule(template);
8487
template.addChunk(chunk);
8588
compilation.modules.push(template);
89+
hasDeduplicatedModules = true;
8690
}
8791
});
8892
}([], [], [], chunk));
93+
if(hasDeduplicatedModules)
94+
chunk._DedupePlugin_hasDeduplicatedModules = true;
8995
});
9096
});
9197
function mergeCommonModules(commonModules, newModules) {
@@ -96,17 +102,25 @@ DedupePlugin.prototype.apply = function(compiler) {
96102
});
97103
compiler.moduleTemplate = new DedupModuleTemplateDecorator(compiler.moduleTemplate);
98104
compiler.mainTemplate = Object.create(compiler.mainTemplate);
105+
var oldRenderAddModule = compiler.mainTemplate.renderAddModule;
99106
compiler.mainTemplate.renderAddModule = function(hash, chunk, varModuleId, varModule) {
107+
if(!chunk._DedupePlugin_hasDeduplicatedModules) {
108+
return oldRenderAddModule.call(this, hash, chunk, varModuleId, varModule);
109+
}
100110
return [
101111
"var _m = " + varModule + ";",
112+
"",
113+
"// Check if module is deduplicated",
102114
"switch(typeof _m) {",
103115
"case \"number\":",
104116
this.indent([
117+
"// Module is a copy of another module",
105118
"modules[" + varModuleId + "] = modules[_m];",
106119
"break;"
107120
]),
108121
"case \"object\":",
109122
this.indent([
123+
"// Module can be created from a template",
110124
"modules[" + varModuleId + "] = (function(_m) {",
111125
this.indent([
112126
"var args = _m.slice(1), fn = modules[_m[0]];",
@@ -120,25 +134,34 @@ DedupePlugin.prototype.apply = function(compiler) {
120134
"break;"
121135
]),
122136
"default:",
123-
this.indent("modules[" + varModuleId + "] = _m;"),
137+
this.indent([
138+
"// Normal module",
139+
"modules[" + varModuleId + "] = _m;"
140+
]),
124141
"}"
125142
]
126143
};
127144
var oldRenderModules = compiler.mainTemplate.renderModules;
128145
compiler.mainTemplate.renderModules = function renderModules(hash, chunk, moduleTemplate, dependencyTemplates) {
146+
if(!chunk._DedupePlugin_hasDeduplicatedModules) {
147+
return oldRenderModules.call(this, hash, chunk, moduleTemplate, dependencyTemplates);
148+
}
129149
var source = new ConcatSource();
130150
source.add("(function(modules) {\n");
131151
source.add(this.indent([
152+
"// Check all modules for deduplicated modules",
132153
"for(var i in modules) {",
133154
this.indent([
134155
"switch(typeof modules[i]) {",
135156
"case \"number\":",
136157
this.indent([
158+
"// Module is a copy of another module",
137159
"modules[i] = modules[modules[i]];",
138160
"break;"
139161
]),
140162
"case \"object\":",
141163
this.indent([
164+
"// Module can be created from a template",
142165
"modules[i] = (function(_m) {",
143166
this.indent([
144167
"var args = _m.slice(1), fn = modules[_m[0]];",
@@ -177,6 +200,10 @@ DedupModuleTemplateDecorator.prototype.render = function(module, dependencyTempl
177200
request: module.request,
178201
templateModules: rootDuplicates.template.templateModules
179202
});
203+
rootDuplicates.template.reasons.sort(function(a, b) {
204+
if(a.request == b.request) return 0;
205+
return a.request < b.request ? -1 : 1;
206+
});
180207
var array = [rootDuplicates.template.id].concat(module.getTemplateArguments(rootDuplicates.template.templateModules).map(function(module) {
181208
if(typeof module.id !== "number")
182209
return "(function webpackMissingModule() { throw new Error(" + JSON.stringify("Cannot find module") + "); }())"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webpack",
3-
"version": "0.10.0-beta21",
3+
"version": "0.10.0-beta22",
44
"author": "Tobias Koppers @sokra",
55
"description": "Packs CommonJs/AMD/Labeled Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jade, coffee, css, less, ... and your custom stuff.",
66
"dependencies": {

0 commit comments

Comments
 (0)