Skip to content

Commit a91cff4

Browse files
committed
complexer dedupe example and fixed bugs
1 parent a9cb625 commit a91cff4

File tree

8 files changed

+426
-93
lines changed

8 files changed

+426
-93
lines changed

examples/code-splitted-dedupe/README.md

Lines changed: 370 additions & 68 deletions
Large diffs are not rendered by default.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
// index.js and x.js can be deduplicated
22
require(["../dedupe/a", "bundle?lazy!../dedupe/b"]);
3+
4+
// index.js and x.js cannot be deduplicated
5+
require(["../dedupe/a"]);
6+
require(["../dedupe/b"]);

examples/code-splitted-dedupe/template.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
{{example.js}}
66
```
77

8+
# js/output.js
9+
10+
``` javascript
11+
{{js/output.js}}
12+
```
13+
814
# js/1.output.js
915

1016
``` javascript
@@ -17,6 +23,18 @@
1723
{{js/2.output.js}}
1824
```
1925

26+
# js/3.output.js
27+
28+
``` javascript
29+
{{js/3.output.js}}
30+
```
31+
32+
# js/4.output.js
33+
34+
``` javascript
35+
{{js/4.output.js}}
36+
```
37+
2038
# Info
2139

2240
## Uncompressed

lib/ChunkTemplate.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ ChunkTemplate.prototype.render = function(chunk, moduleTemplate, dependencyTempl
1818
chunk.modules.forEach(function(module, idx) {
1919
if(idx != 0) source.add(",\n");
2020
source.add("\n/***/ " + module.id + ":\n");
21-
source.add(moduleTemplate.render(module, dependencyTemplates));
21+
source.add(moduleTemplate.render(module, dependencyTemplates, chunk));
2222
});
2323
source.add("\n\n");
2424
source.add(this.asString(this.renderFooter(chunk)));

lib/FunctionModuleTemplate.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function FunctionModuleTemplate(outputOptions, requestShortener) {
1111
}
1212
module.exports = FunctionModuleTemplate;
1313

14-
FunctionModuleTemplate.prototype.render = function(module, dependencyTemplates) {
14+
FunctionModuleTemplate.prototype.render = function(module, dependencyTemplates, chunk) {
1515
var source = new ConcatSource();
1616
if(this.outputOptions.pathinfo) {
1717
var req = module.readableIdentifier(this.requestShortener);

lib/MainTemplate.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ MainTemplate.prototype.renderModules = function renderModules(hash, chunk, modul
4848
chunk.modules.forEach(function(module, idx) {
4949
if(idx != 0) source.add(",\n");
5050
source.add("\n/***/ " + module.id + ":\n");
51-
source.add(moduleTemplate.render(module, dependencyTemplates));
51+
source.add(moduleTemplate.render(module, dependencyTemplates, chunk));
5252
});
5353
source.add("\n/******/ }");
5454
return source;

lib/optimize/DedupePlugin.js

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,36 @@ DedupePlugin.prototype.apply = function(compiler) {
3535
});
3636
compilation.plugin("after-optimize-chunks", function(chunks) {
3737
var entryChunks = chunks.filter(function(c) { return c.entry; });
38-
entryChunks.forEach(function(chunk) {
38+
entryChunks.forEach(function(chunk) { // for each entry chunk
3939
(function x(dups, roots, visited, chunk) {
4040
var currentDups = [];
4141
var currentRoots = [];
4242
chunk.modules.forEach(function(module) {
4343
if(module.duplicates) {
44+
if(!module.rootDuplicatesChunks)
45+
module.rootDuplicatesChunks = module.chunks.slice();
46+
var chunkIndex = module.rootDuplicatesChunks.indexOf(chunk);
47+
if(!module.rootDuplicates) module.rootDuplicates = [];
4448
var idx = currentDups.indexOf(module.duplicates);
4549
if(idx >= 0) {
46-
module.rootDuplicates = currentRoots[idx];
47-
module.rootDuplicates.push(module);
48-
module.rootDuplicates.commonModules = mergeCommonModules(module.rootDuplicates.commonModules, module.getAllModuleDependencies());
50+
module.rootDuplicates[chunkIndex] = currentRoots[idx];
51+
module.rootDuplicates[chunkIndex].push(module);
52+
module.rootDuplicates[chunkIndex].commonModules =
53+
mergeCommonModules(module.rootDuplicates[chunkIndex].commonModules, module.getAllModuleDependencies());
4954
} else {
5055
idx = dups.indexOf(module.duplicates);
5156
if(idx < 0) {
52-
module.rootDuplicates = [module];
53-
module.rootDuplicates.commonModules = module.getAllModuleDependencies();
54-
module.rootDuplicates.initialCcommonModulesLength = module.rootDuplicates.commonModules.length;
57+
module.rootDuplicates[chunkIndex] = [module];
58+
module.rootDuplicates[chunkIndex].commonModules = module.getAllModuleDependencies();
59+
module.rootDuplicates[chunkIndex].initialCommonModulesLength = module.rootDuplicates[chunkIndex].commonModules.length;
5560
dups = dups.concat([module.duplicates]);
56-
roots = roots.concat([module.rootDuplicates]);
61+
roots = roots.concat([module.rootDuplicates[chunkIndex]]);
5762
currentDups = currentDups.concat([module.duplicates]);
58-
currentRoots = currentRoots.concat([module.rootDuplicates]);
63+
currentRoots = currentRoots.concat([module.rootDuplicates[chunkIndex]]);
5964
} else {
60-
module.rootDuplicates = roots[idx];
61-
module.rootDuplicates.commonModules = mergeCommonModules(module.rootDuplicates.commonModules, module.getAllModuleDependencies());
65+
module.rootDuplicates[chunkIndex] = roots[idx];
66+
module.rootDuplicates[chunkIndex].commonModules =
67+
mergeCommonModules(module.rootDuplicates[chunkIndex].commonModules, module.getAllModuleDependencies());
6268
}
6369
}
6470
}
@@ -70,7 +76,7 @@ DedupePlugin.prototype.apply = function(compiler) {
7076

7177
currentRoots.forEach(function(roots) {
7278
var commonModules = roots.commonModules;
73-
var initialLength = roots.initialCcommonModulesLength;
79+
var initialLength = roots.initialCommonModulesLength;
7480
if(initialLength !== commonModules.length) {
7581
var template = roots[0].createTemplate(commonModules);
7682
roots.template = template;
@@ -160,27 +166,30 @@ function DedupModuleTemplateDecorator(template) {
160166
this.template = template;
161167
}
162168

163-
DedupModuleTemplateDecorator.prototype.render = function(module, dependencyTemplates) {
164-
if(!module.rootDuplicates) return this.template.render(module, dependencyTemplates);
165-
if(module.rootDuplicates.template) {
166-
module.rootDuplicates.template.addReason(module, {
169+
DedupModuleTemplateDecorator.prototype.render = function(module, dependencyTemplates, chunk) {
170+
if(!module.rootDuplicatesChunks) return this.template.render(module, dependencyTemplates, chunk);
171+
var chunkIndex = module.rootDuplicatesChunks.indexOf(chunk);
172+
if(!module.rootDuplicates || !module.rootDuplicates[chunkIndex]) return this.template.render(module, dependencyTemplates, chunk);
173+
var rootDuplicates = module.rootDuplicates[chunkIndex];
174+
if(rootDuplicates.template) {
175+
rootDuplicates.template.addReason(module, {
167176
type: "template",
168177
request: module.request,
169-
templateModules: module.rootDuplicates.template.templateModules
178+
templateModules: rootDuplicates.template.templateModules
170179
});
171-
var array = [module.rootDuplicates.template.id].concat(module.getTemplateArguments(module.rootDuplicates.template.templateModules).map(function(module) {
180+
var array = [rootDuplicates.template.id].concat(module.getTemplateArguments(rootDuplicates.template.templateModules).map(function(module) {
172181
if(typeof module.id !== "number")
173182
return "(function webpackMissingModule() { throw new Error(" + JSON.stringify("Cannot find module") + "); }())"
174183
return module.id;
175184
}));
176185
var source = new ConcatSource("[" + array.join(", ") + "]");
177186
return source;
178187
} else {
179-
module.rootDuplicates.sort(function(a, b) {
188+
rootDuplicates.sort(function(a, b) {
180189
return a.id - b.id;
181190
});
182-
if(module === module.rootDuplicates[0]) return this.template.render(module, dependencyTemplates);
183-
var source = new ConcatSource("" + module.rootDuplicates[0].id);
191+
if(module === rootDuplicates[0]) return this.template.render(module, dependencyTemplates, chunk);
192+
var source = new ConcatSource("" + rootDuplicates[0].id);
184193
return source;
185194
}
186195
};

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-beta20",
3+
"version": "0.10.0-beta21",
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)