@@ -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" ) + "); }())"
0 commit comments