Skip to content

Commit 66bd2ea

Browse files
committed
make render manifest extensible
move JS and WASM specific template stuff into plugins
1 parent f2141e1 commit 66bd2ea

File tree

4 files changed

+99
-74
lines changed

4 files changed

+99
-74
lines changed

lib/ChunkTemplate.js

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
*/
55
"use strict";
66

7-
const ConcatSource = require("webpack-sources").ConcatSource;
8-
const Template = require("./Template");
97
const Tapable = require("tapable").Tapable;
108
const SyncWaterfallHook = require("tapable").SyncWaterfallHook;
119
const SyncHook = require("tapable").SyncHook;
@@ -15,6 +13,7 @@ module.exports = class ChunkTemplate extends Tapable {
1513
super();
1614
this.outputOptions = outputOptions || {};
1715
this.hooks = {
16+
renderManifest: new SyncWaterfallHook(["result", "options"]),
1817
modules: new SyncWaterfallHook(["source", "chunk", "moduleTemplate", "dependencyTemplates"]),
1918
render: new SyncWaterfallHook(["source", "chunk", "moduleTemplate", "dependencyTemplates"]),
2019
renderWithEntry: new SyncWaterfallHook(["source", "chunk"]),
@@ -24,57 +23,13 @@ module.exports = class ChunkTemplate extends Tapable {
2423
}
2524

2625
getRenderManifest(options) {
27-
const chunk = options.chunk;
28-
const outputOptions = options.outputOptions;
29-
const moduleTemplates = options.moduleTemplates;
30-
const dependencyTemplates = options.dependencyTemplates;
31-
3226
const result = [];
3327

34-
const filenameTemplate = outputOptions.chunkFilename;
35-
36-
result.push({
37-
render: () => this.renderJavascript(chunk, moduleTemplates.javascript, dependencyTemplates),
38-
filenameTemplate,
39-
pathOptions: {
40-
chunk
41-
},
42-
identifier: `chunk${chunk.id}`,
43-
hash: chunk.hash
44-
});
45-
46-
for(const module of chunk.getModules().filter(m => m.type && m.type.startsWith("webassembly"))) {
47-
const filenameTemplate = outputOptions.webassemblyModuleFilename;
48-
49-
result.push({
50-
render: () => this.renderWebAssembly(module, moduleTemplates.webassembly, dependencyTemplates),
51-
filenameTemplate,
52-
pathOptions: {
53-
module
54-
},
55-
identifier: `webassemblyModule${module.id}`,
56-
hash: module.hash
57-
});
58-
}
28+
this.hooks.renderManifest.call(result, options);
5929

6030
return result;
6131
}
6232

63-
renderJavascript(chunk, moduleTemplate, dependencyTemplates) {
64-
const moduleSources = Template.renderChunkModules(chunk, m => true, moduleTemplate, dependencyTemplates);
65-
const core = this.hooks.modules.call(moduleSources, chunk, moduleTemplate, dependencyTemplates);
66-
let source = this.hooks.render.call(core, chunk, moduleTemplate, dependencyTemplates);
67-
if(chunk.hasEntryModule()) {
68-
source = this.hooks.renderWithEntry.call(source, chunk);
69-
}
70-
chunk.rendered = true;
71-
return new ConcatSource(source, ";");
72-
}
73-
74-
renderWebAssembly(module, moduleTemplate, dependencyTemplates) {
75-
return moduleTemplate.render(module, dependencyTemplates, {});
76-
}
77-
7833
updateHash(hash) {
7934
hash.update("ChunkTemplate");
8035
hash.update("2");

lib/JavascriptModulesPlugin.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
"use strict";
66

77
const Parser = require("./Parser");
8+
const Template = require("./Template");
9+
const ConcatSource = require("webpack-sources").ConcatSource;
810

911
class JavascriptModulesPlugin {
1012
apply(compiler) {
@@ -20,8 +22,70 @@ class JavascriptModulesPlugin {
2022
normalModuleFactory.hooks.createParser.for("javascript/esm").tap("JavascriptModulesPlugin", options => {
2123
return new Parser(options, "module");
2224
});
25+
compilation.mainTemplate.hooks.renderManifest.tap("JavascriptModulesPlugin", (result, options) => {
26+
const chunk = options.chunk;
27+
const hash = options.hash;
28+
const fullHash = options.fullHash;
29+
const outputOptions = options.outputOptions;
30+
const moduleTemplates = options.moduleTemplates;
31+
const dependencyTemplates = options.dependencyTemplates;
32+
33+
let filenameTemplate;
34+
if(chunk.filenameTemplate)
35+
filenameTemplate = chunk.filenameTemplate;
36+
else
37+
filenameTemplate = outputOptions.filename;
38+
39+
const useChunkHash = compilation.mainTemplate.useChunkHash(chunk);
40+
41+
result.push({
42+
render: () => compilation.mainTemplate.render(hash, chunk, moduleTemplates.javascript, dependencyTemplates),
43+
filenameTemplate,
44+
pathOptions: {
45+
noChunkHash: !useChunkHash,
46+
chunk
47+
},
48+
identifier: `chunk${chunk.id}`,
49+
hash: useChunkHash ? chunk.hash : fullHash
50+
});
51+
return result;
52+
});
53+
compilation.mainTemplate.hooks.modules.tap("JavascriptModulesPlugin", (source, chunk, hash, moduleTemplate, dependencyTemplates) => {
54+
return Template.renderChunkModules(chunk, () => true, moduleTemplate, dependencyTemplates, "/******/ ");
55+
});
56+
compilation.chunkTemplate.hooks.renderManifest.tap("JavascriptModulesPlugin", (result, options) => {
57+
const chunk = options.chunk;
58+
const outputOptions = options.outputOptions;
59+
const moduleTemplates = options.moduleTemplates;
60+
const dependencyTemplates = options.dependencyTemplates;
61+
62+
const filenameTemplate = outputOptions.chunkFilename;
63+
64+
result.push({
65+
render: () => this.renderJavascript(compilation.chunkTemplate, chunk, moduleTemplates.javascript, dependencyTemplates),
66+
filenameTemplate,
67+
pathOptions: {
68+
chunk
69+
},
70+
identifier: `chunk${chunk.id}`,
71+
hash: chunk.hash
72+
});
73+
74+
return result;
75+
});
2376
});
2477
}
78+
79+
renderJavascript(chunkTemplate, chunk, moduleTemplate, dependencyTemplates) {
80+
const moduleSources = Template.renderChunkModules(chunk, m => true, moduleTemplate, dependencyTemplates);
81+
const core = chunkTemplate.hooks.modules.call(moduleSources, chunk, moduleTemplate, dependencyTemplates);
82+
let source = chunkTemplate.hooks.render.call(core, chunk, moduleTemplate, dependencyTemplates);
83+
if(chunk.hasEntryModule()) {
84+
source = chunkTemplate.hooks.renderWithEntry.call(source, chunk);
85+
}
86+
chunk.rendered = true;
87+
return new ConcatSource(source, ";");
88+
}
2589
}
2690

2791
module.exports = JavascriptModulesPlugin;

lib/MainTemplate.js

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
const ConcatSource = require("webpack-sources").ConcatSource;
88
const OriginalSource = require("webpack-sources").OriginalSource;
99
const PrefixSource = require("webpack-sources").PrefixSource;
10+
const RawSource = require("webpack-sources").RawSource;
1011
const Template = require("./Template");
1112
const Tapable = require("tapable").Tapable;
1213
const SyncWaterfallHook = require("tapable").SyncWaterfallHook;
@@ -34,6 +35,7 @@ module.exports = class MainTemplate extends Tapable {
3435
super();
3536
this.outputOptions = outputOptions || {};
3637
this.hooks = {
38+
renderManifest: new SyncWaterfallHook(["result", "options"]),
3739
modules: new SyncWaterfallHook(["modules", "chunk", "hash", "moduleTemplate", "dependencyTemplates"]),
3840
moduleObj: new SyncWaterfallHook(["source", "chunk", "hash", "moduleIdExpression"]),
3941
requireEnsure: new SyncWaterfallHook(["source", "chunk", "hash", "chunkIdExpression"]),
@@ -73,8 +75,7 @@ module.exports = class MainTemplate extends Tapable {
7375
source.add("/******/ })\n");
7476
source.add("/************************************************************************/\n");
7577
source.add("/******/ (");
76-
const modules = Template.renderChunkModules(chunk, () => true, moduleTemplate, dependencyTemplates, "/******/ ");
77-
source.add(this.hooks.modules.call(modules, chunk, hash, moduleTemplate, dependencyTemplates));
78+
source.add(this.hooks.modules.call(new RawSource(""), chunk, hash, moduleTemplate, dependencyTemplates));
7879
source.add(")");
7980
return source;
8081
});
@@ -207,33 +208,9 @@ module.exports = class MainTemplate extends Tapable {
207208
}
208209

209210
getRenderManifest(options) {
210-
const chunk = options.chunk;
211-
const hash = options.hash;
212-
const fullHash = options.fullHash;
213-
const outputOptions = options.outputOptions;
214-
const moduleTemplates = options.moduleTemplates;
215-
const dependencyTemplates = options.dependencyTemplates;
216-
217211
const result = [];
218212

219-
let filenameTemplate;
220-
if(chunk.filenameTemplate)
221-
filenameTemplate = chunk.filenameTemplate;
222-
else
223-
filenameTemplate = outputOptions.filename;
224-
225-
const useChunkHash = this.useChunkHash(chunk);
226-
227-
result.push({
228-
render: () => this.render(hash, chunk, moduleTemplates.javascript, dependencyTemplates),
229-
filenameTemplate,
230-
pathOptions: {
231-
noChunkHash: !useChunkHash,
232-
chunk
233-
},
234-
identifier: `chunk${chunk.id}`,
235-
hash: useChunkHash ? chunk.hash : fullHash
236-
});
213+
this.hooks.renderManifest.call(result, options);
237214

238215
return result;
239216
}

lib/WebAssemblyModulesPlugin.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,37 @@ class WebAssemblyModulesPlugin {
1717
normalModuleFactory.hooks.createParser.for("webassembly/experimental").tap("WebAssemblyModulesPlugin", () => {
1818
return new WebAssemblyParser();
1919
});
20+
21+
compilation.chunkTemplate.hooks.renderManifest.tap("WebAssemblyModulesPlugin", (result, options) => {
22+
const chunk = options.chunk;
23+
const outputOptions = options.outputOptions;
24+
const moduleTemplates = options.moduleTemplates;
25+
const dependencyTemplates = options.dependencyTemplates;
26+
27+
for(const module of chunk.modulesIterable) {
28+
if(module.type && module.type.startsWith("webassembly")) {
29+
const filenameTemplate = outputOptions.webassemblyModuleFilename;
30+
31+
result.push({
32+
render: () => this.renderWebAssembly(module, moduleTemplates.webassembly, dependencyTemplates),
33+
filenameTemplate,
34+
pathOptions: {
35+
module
36+
},
37+
identifier: `webassemblyModule${module.id}`,
38+
hash: module.hash
39+
});
40+
}
41+
}
42+
43+
return result;
44+
});
2045
});
2146
}
47+
48+
renderWebAssembly(module, moduleTemplate, dependencyTemplates) {
49+
return moduleTemplate.render(module, dependencyTemplates, {});
50+
}
2251
}
2352

2453
module.exports = WebAssemblyModulesPlugin;

0 commit comments

Comments
 (0)