@@ -42,13 +42,17 @@ class JavascriptModulesPlugin {
42
42
"The 'compilation' argument must be an instance of Compilation"
43
43
) ;
44
44
}
45
+
45
46
let hooks = compilationHooksMap . get ( compilation ) ;
47
+
46
48
if ( hooks === undefined ) {
47
49
hooks = {
48
50
shouldRender : new SyncBailHook ( [ "module" , "chunk" ] )
49
51
} ;
52
+
50
53
compilationHooksMap . set ( compilation , hooks ) ;
51
54
}
55
+
52
56
return hooks ;
53
57
}
54
58
@@ -57,67 +61,82 @@ class JavascriptModulesPlugin {
57
61
* @returns {void }
58
62
*/
59
63
apply ( compiler ) {
60
- compiler . hooks . compilation . tap (
64
+ const { compilation } = compiler . hooks ;
65
+
66
+ compilation . tap (
61
67
"JavascriptModulesPlugin" ,
62
68
( compilation , { normalModuleFactory } ) => {
63
- const moduleGraph = compilation . moduleGraph ;
64
69
const hooks = JavascriptModulesPlugin . getHooks ( compilation ) ;
70
+
65
71
hooks . shouldRender . tap ( "JavascriptModulesPlugin" , module => {
66
72
if ( module . type === "javascript/auto" ) return true ;
67
73
if ( module . type === "javascript/dynamic" ) return true ;
68
74
if ( module . type === "javascript/esm" ) return true ;
69
75
} ) ;
70
- normalModuleFactory . hooks . createParser
76
+
77
+ const { createParser, createGenerator } = normalModuleFactory . hooks ;
78
+
79
+ createParser
71
80
. for ( "javascript/auto" )
72
81
. tap ( "JavascriptModulesPlugin" , options => {
73
82
return new JavascriptParser ( options , "auto" ) ;
74
83
} ) ;
75
- normalModuleFactory . hooks . createParser
84
+ createParser
76
85
. for ( "javascript/dynamic" )
77
86
. tap ( "JavascriptModulesPlugin" , options => {
78
87
return new JavascriptParser ( options , "script" ) ;
79
88
} ) ;
80
- normalModuleFactory . hooks . createParser
89
+ createParser
81
90
. for ( "javascript/esm" )
82
91
. tap ( "JavascriptModulesPlugin" , options => {
83
92
return new JavascriptParser ( options , "module" ) ;
84
93
} ) ;
85
- normalModuleFactory . hooks . createGenerator
94
+
95
+ createGenerator
86
96
. for ( "javascript/auto" )
87
97
. tap ( "JavascriptModulesPlugin" , ( ) => {
88
98
return new JavascriptGenerator ( ) ;
89
99
} ) ;
90
- normalModuleFactory . hooks . createGenerator
100
+ createGenerator
91
101
. for ( "javascript/dynamic" )
92
102
. tap ( "JavascriptModulesPlugin" , ( ) => {
93
103
return new JavascriptGenerator ( ) ;
94
104
} ) ;
95
- normalModuleFactory . hooks . createGenerator
105
+ createGenerator
96
106
. for ( "javascript/esm" )
97
107
. tap ( "JavascriptModulesPlugin" , ( ) => {
98
108
return new JavascriptGenerator ( ) ;
99
109
} ) ;
100
- compilation . mainTemplate . hooks . renderManifest . tap (
110
+
111
+ const { moduleGraph } = compilation ;
112
+ const { contentHash } = compilation . hooks ;
113
+ const { mainTemplate, chunkTemplate } = compilation ;
114
+
115
+ mainTemplate . hooks . renderManifest . tap (
101
116
"JavascriptModulesPlugin" ,
102
117
( result , options ) => {
103
118
const chunk = options . chunk ;
104
- const hash = options . hash ;
105
- const outputOptions = options . outputOptions ;
119
+ const { filename } = options . outputOptions ;
120
+ const { hash } = options ;
121
+ const { moduleGraph, chunkGraph } = options ;
122
+
123
+ const mainTemplate = compilation . mainTemplate ;
124
+
125
+ const filenameTemplate = chunk . filenameTemplate || filename ;
126
+
127
+ const runtimeTemplate = options . runtimeTemplate ;
106
128
const moduleTemplates = options . moduleTemplates ;
107
129
const dependencyTemplates = options . dependencyTemplates ;
108
130
109
- const filenameTemplate =
110
- chunk . filenameTemplate || outputOptions . filename ;
111
-
112
131
result . push ( {
113
132
render : ( ) =>
114
- compilation . mainTemplate . render ( moduleTemplates . javascript , {
133
+ mainTemplate . render ( moduleTemplates . javascript , {
115
134
hash,
116
135
chunk,
117
- dependencyTemplates ,
118
- runtimeTemplate : options . runtimeTemplate ,
119
- moduleGraph : options . moduleGraph ,
120
- chunkGraph : options . chunkGraph
136
+ chunkGraph ,
137
+ moduleGraph ,
138
+ runtimeTemplate ,
139
+ dependencyTemplates
121
140
} ) ,
122
141
filenameTemplate,
123
142
pathOptions : {
@@ -130,7 +149,8 @@ class JavascriptModulesPlugin {
130
149
return result ;
131
150
}
132
151
) ;
133
- compilation . mainTemplate . hooks . modules . tap (
152
+
153
+ mainTemplate . hooks . modules . tap (
134
154
"JavascriptModulesPlugin" ,
135
155
( source , moduleTemplate , renderContext ) => {
136
156
const chunk = renderContext . chunk ;
@@ -142,23 +162,26 @@ class JavascriptModulesPlugin {
142
162
) ;
143
163
}
144
164
) ;
145
- compilation . chunkTemplate . hooks . renderManifest . tap (
165
+
166
+ chunkTemplate . hooks . renderManifest . tap (
146
167
"JavascriptModulesPlugin" ,
147
168
( result , options ) => {
148
169
const chunk = options . chunk ;
149
- const outputOptions = options . outputOptions ;
150
- const moduleTemplates = options . moduleTemplates ;
151
- const dependencyTemplates = options . dependencyTemplates ;
170
+ const { filename, chunkFilename } = options . outputOptions ;
152
171
153
172
let filenameTemplate ;
173
+
154
174
if ( chunk . filenameTemplate ) {
155
175
filenameTemplate = chunk . filenameTemplate ;
156
176
} else if ( chunk . isOnlyInitial ( ) ) {
157
- filenameTemplate = outputOptions . filename ;
177
+ filenameTemplate = filename ;
158
178
} else {
159
- filenameTemplate = outputOptions . chunkFilename ;
179
+ filenameTemplate = chunkFilename ;
160
180
}
161
181
182
+ const { chunkTemplate, runtimeTemplate } = compilation ;
183
+ const { moduleTemplates, dependencyTemplates } = options ;
184
+
162
185
const { chunkGraph } = compilation ;
163
186
164
187
const hasModules = Array . from (
@@ -176,14 +199,14 @@ class JavascriptModulesPlugin {
176
199
render : ( ) =>
177
200
this . renderJavascript (
178
201
compilation ,
179
- compilation . chunkTemplate ,
202
+ chunkTemplate ,
180
203
moduleTemplates . javascript ,
181
204
{
182
205
chunk,
183
- dependencyTemplates,
184
- runtimeTemplate : compilation . runtimeTemplate ,
206
+ chunkGraph,
185
207
moduleGraph,
186
- chunkGraph : compilation . chunkGraph
208
+ runtimeTemplate,
209
+ dependencyTemplates
187
210
}
188
211
) ,
189
212
filenameTemplate,
@@ -199,10 +222,13 @@ class JavascriptModulesPlugin {
199
222
}
200
223
}
201
224
) ;
202
- compilation . hooks . contentHash . tap ( "JavascriptModulesPlugin" , chunk => {
225
+
226
+ contentHash . tap ( "JavascriptModulesPlugin" , chunk => {
203
227
const {
204
228
chunkGraph,
205
229
moduleGraph,
230
+ mainTemplate,
231
+ chunkTemplate,
206
232
runtimeTemplate,
207
233
outputOptions : {
208
234
hashSalt,
@@ -211,18 +237,22 @@ class JavascriptModulesPlugin {
211
237
hashFunction
212
238
}
213
239
} = compilation ;
240
+
214
241
const hash = createHash ( hashFunction ) ;
242
+
215
243
if ( hashSalt ) hash . update ( hashSalt ) ;
216
- const template = chunk . hasRuntime ( )
217
- ? compilation . mainTemplate
218
- : compilation . chunkTemplate ;
244
+
245
+ const template = chunk . hasRuntime ( ) ? mainTemplate : chunkTemplate ;
246
+
219
247
hash . update ( `${ chunk . id } ` ) ;
220
248
hash . update ( chunk . ids ? chunk . ids . join ( "," ) : "" ) ;
249
+
221
250
template . updateHashForChunk ( hash , chunk , {
222
251
chunkGraph,
223
252
moduleGraph,
224
253
runtimeTemplate
225
254
} ) ;
255
+
226
256
for ( const m of chunkGraph . getOrderedChunkModulesIterable (
227
257
chunk ,
228
258
compareModulesById ( chunkGraph )
@@ -231,6 +261,7 @@ class JavascriptModulesPlugin {
231
261
hash . update ( chunkGraph . getModuleHash ( m ) ) ;
232
262
}
233
263
}
264
+
234
265
chunk . contentHash . javascript = hash
235
266
. digest ( hashDigest )
236
267
. substr ( 0 , hashDigestLength ) ;
@@ -250,25 +281,31 @@ class JavascriptModulesPlugin {
250
281
const hooks = JavascriptModulesPlugin . getHooks ( compilation ) ;
251
282
252
283
const chunk = renderContext . chunk ;
284
+
253
285
const moduleSources = Template . renderChunkModules (
254
286
renderContext ,
255
- m => hooks . shouldRender . call ( m , chunk ) ,
287
+ module => hooks . shouldRender . call ( module , chunk ) ,
256
288
moduleTemplate
257
289
) ;
290
+
258
291
const core = chunkTemplate . hooks . modules . call (
259
292
moduleSources ,
260
293
moduleTemplate ,
261
294
renderContext
262
295
) ;
296
+
263
297
let source = chunkTemplate . hooks . render . call (
264
298
core ,
265
299
moduleTemplate ,
266
300
renderContext
267
301
) ;
302
+
268
303
if ( renderContext . chunkGraph . getNumberOfEntryModules ( chunk ) > 0 ) {
269
304
source = chunkTemplate . hooks . renderWithEntry . call ( source , chunk ) ;
270
305
}
306
+
271
307
chunk . rendered = true ;
308
+
272
309
return new ConcatSource ( source , ";" ) ;
273
310
}
274
311
}
0 commit comments