2013-03-26 23:54:41 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
2018-07-30 23:08:51 +08:00
|
|
|
|
2017-01-13 04:38:38 +08:00
|
|
|
"use strict";
|
|
|
|
|
2018-10-23 23:09:32 +08:00
|
|
|
const { SyncWaterfallHook, SyncHook } = require("tapable");
|
2018-03-22 19:05:58 +08:00
|
|
|
const {
|
|
|
|
ConcatSource,
|
|
|
|
OriginalSource,
|
2019-09-30 16:08:08 +08:00
|
|
|
PrefixSource
|
2018-03-22 19:05:58 +08:00
|
|
|
} = require("webpack-sources");
|
2018-11-05 21:36:15 +08:00
|
|
|
const RuntimeGlobals = require("./RuntimeGlobals");
|
2017-01-13 04:38:38 +08:00
|
|
|
const Template = require("./Template");
|
2013-03-26 23:54:41 +08:00
|
|
|
|
2018-04-21 08:35:02 +08:00
|
|
|
/** @typedef {import("webpack-sources").ConcatSource} ConcatSource */
|
2018-07-02 22:18:49 +08:00
|
|
|
/** @typedef {import("webpack-sources").Source} Source */
|
2018-04-24 21:44:50 +08:00
|
|
|
/** @typedef {import("./ModuleTemplate")} ModuleTemplate */
|
|
|
|
/** @typedef {import("./Chunk")} Chunk */
|
2019-09-13 17:12:26 +08:00
|
|
|
/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
|
2018-04-24 21:44:50 +08:00
|
|
|
/** @typedef {import("./Module")} Module} */
|
2019-07-17 22:02:33 +08:00
|
|
|
/** @typedef {import("./util/Hash")} Hash} */
|
2018-07-11 19:05:13 +08:00
|
|
|
/** @typedef {import("./DependencyTemplates")} DependencyTemplates} */
|
2018-08-14 22:40:37 +08:00
|
|
|
/** @typedef {import("./ModuleTemplate").RenderContext} RenderContext} */
|
|
|
|
/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate} */
|
|
|
|
/** @typedef {import("./ModuleGraph")} ModuleGraph} */
|
|
|
|
/** @typedef {import("./ChunkGraph")} ChunkGraph} */
|
|
|
|
/** @typedef {import("./Template").RenderManifestOptions} RenderManifestOptions} */
|
|
|
|
/** @typedef {import("./Template").RenderManifestEntry} RenderManifestEntry} */
|
2018-05-01 23:47:14 +08:00
|
|
|
|
|
|
|
/**
|
2018-08-14 22:40:37 +08:00
|
|
|
* @typedef {Object} MainRenderContext
|
|
|
|
* @property {Chunk} chunk the chunk
|
|
|
|
* @property {DependencyTemplates} dependencyTemplates the dependency templates
|
|
|
|
* @property {RuntimeTemplate} runtimeTemplate the runtime template
|
|
|
|
* @property {ModuleGraph} moduleGraph the module graph
|
|
|
|
* @property {ChunkGraph} chunkGraph the chunk graph
|
|
|
|
* @property {string} hash hash to be used for render call
|
2018-05-01 23:47:14 +08:00
|
|
|
*/
|
2018-04-21 08:35:02 +08:00
|
|
|
|
2018-05-01 23:47:14 +08:00
|
|
|
/**
|
2018-09-15 19:10:58 +08:00
|
|
|
* @typedef {Object} RenderBootstrapContext
|
|
|
|
* @property {Chunk} chunk the chunk
|
|
|
|
* @property {RuntimeTemplate} runtimeTemplate the runtime template
|
|
|
|
* @property {ModuleGraph} moduleGraph the module graph
|
|
|
|
* @property {ChunkGraph} chunkGraph the chunk graph
|
|
|
|
* @property {string} hash hash to be used for render call
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @typedef {Object} UpdateHashForChunkContext
|
|
|
|
* @property {RuntimeTemplate} runtimeTemplate the runtime template
|
|
|
|
* @property {ModuleGraph} moduleGraph the module graph
|
|
|
|
* @property {ChunkGraph} chunkGraph the chunk graph
|
2018-05-01 23:47:14 +08:00
|
|
|
*/
|
2018-04-21 08:35:02 +08:00
|
|
|
|
2018-06-26 14:27:44 +08:00
|
|
|
module.exports = class MainTemplate {
|
2018-04-21 08:35:02 +08:00
|
|
|
/**
|
|
|
|
*
|
2018-05-08 20:31:51 +08:00
|
|
|
* @param {TODO=} outputOptions output options for the MainTemplate
|
2018-04-21 08:35:02 +08:00
|
|
|
*/
|
2017-01-13 04:38:38 +08:00
|
|
|
constructor(outputOptions) {
|
2018-05-08 20:31:51 +08:00
|
|
|
/** @type {TODO?} */
|
2017-12-07 16:42:33 +08:00
|
|
|
this.outputOptions = outputOptions || {};
|
2018-07-30 20:25:40 +08:00
|
|
|
this.hooks = Object.freeze({
|
2018-12-09 19:54:17 +08:00
|
|
|
/** @type {SyncWaterfallHook<[RenderManifestEntry[], RenderManifestOptions]>} */
|
2018-01-24 16:39:49 +08:00
|
|
|
renderManifest: new SyncWaterfallHook(["result", "options"]),
|
2018-12-09 19:54:17 +08:00
|
|
|
/** @type {SyncWaterfallHook<[string, RenderBootstrapContext]>} */
|
2018-08-14 22:40:37 +08:00
|
|
|
require: new SyncWaterfallHook(["source", "renderContext"]),
|
2018-12-09 19:54:17 +08:00
|
|
|
/** @type {SyncWaterfallHook<[Source, Chunk, string]>} */
|
2017-11-29 01:43:01 +08:00
|
|
|
renderWithEntry: new SyncWaterfallHook(["source", "chunk", "hash"]),
|
2019-09-13 17:12:26 +08:00
|
|
|
/** @type {SyncWaterfallHook<[string, object, AssetInfo]>} */
|
2019-09-11 17:13:46 +08:00
|
|
|
assetPath: new SyncWaterfallHook(["path", "options", "assetInfo"]),
|
2018-12-09 19:54:17 +08:00
|
|
|
/** @type {SyncHook<[Hash]>} */
|
2017-11-29 01:43:01 +08:00
|
|
|
hash: new SyncHook(["hash"]),
|
2018-12-09 19:54:17 +08:00
|
|
|
/** @type {SyncHook<[Hash, Chunk]>} */
|
2019-09-26 21:51:40 +08:00
|
|
|
hashForChunk: new SyncHook(["hash", "chunk"]),
|
|
|
|
|
|
|
|
// for compatibility:
|
2019-09-30 16:08:08 +08:00
|
|
|
/** @type {SyncWaterfallHook<[string, Chunk, string, ModuleTemplate, DependencyTemplates]>} */
|
|
|
|
bootstrap: new SyncWaterfallHook([
|
|
|
|
"source",
|
|
|
|
"chunk",
|
|
|
|
"hash",
|
|
|
|
"moduleTemplate",
|
|
|
|
"dependencyTemplates"
|
|
|
|
]),
|
2019-09-26 21:51:40 +08:00
|
|
|
/** @type {SyncWaterfallHook<[string, Chunk, string]>} */
|
|
|
|
localVars: new SyncWaterfallHook(["source", "chunk", "hash"]),
|
|
|
|
/** @type {SyncWaterfallHook<[string, Chunk, string]>} */
|
|
|
|
requireExtensions: new SyncWaterfallHook(["source", "chunk", "hash"]),
|
|
|
|
/** @type {SyncWaterfallHook<[string, Chunk, string, string]>} */
|
|
|
|
requireEnsure: new SyncWaterfallHook([
|
|
|
|
"source",
|
|
|
|
"chunk",
|
|
|
|
"hash",
|
|
|
|
"chunkIdExpression"
|
|
|
|
])
|
2018-07-30 20:25:40 +08:00
|
|
|
});
|
2018-08-14 22:40:37 +08:00
|
|
|
this.hooks.require.tap("MainTemplate", (source, renderContext) => {
|
2018-11-28 20:07:40 +08:00
|
|
|
const { chunk, chunkGraph } = renderContext;
|
|
|
|
const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
|
|
|
|
const moduleExecution = runtimeRequirements.has(
|
|
|
|
RuntimeGlobals.interceptModuleExecution
|
|
|
|
)
|
|
|
|
? Template.asString([
|
2019-09-30 16:08:08 +08:00
|
|
|
"var execOptions = { id: moduleId, module: module, factory: __webpack_modules__[moduleId], require: __webpack_require__ };",
|
2019-06-13 16:51:12 +08:00
|
|
|
`${RuntimeGlobals.interceptModuleExecution}.forEach(function(handler) { handler(execOptions); });`,
|
2018-11-28 20:07:40 +08:00
|
|
|
"module = execOptions.module;",
|
|
|
|
"execOptions.factory.call(module.exports, module, module.exports, execOptions.require);"
|
|
|
|
])
|
2019-08-27 02:21:07 +08:00
|
|
|
: runtimeRequirements.has(RuntimeGlobals.thisAsExports)
|
|
|
|
? Template.asString([
|
2019-09-30 16:08:08 +08:00
|
|
|
"__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);"
|
2019-08-27 02:21:07 +08:00
|
|
|
])
|
|
|
|
: Template.asString([
|
2019-09-30 16:08:08 +08:00
|
|
|
"__webpack_modules__[moduleId](module, module.exports, __webpack_require__);"
|
2018-11-28 20:07:40 +08:00
|
|
|
]);
|
2017-12-07 16:42:33 +08:00
|
|
|
return Template.asString([
|
2017-01-13 04:38:38 +08:00
|
|
|
source,
|
|
|
|
"// Check if module is in cache",
|
2019-09-30 16:08:08 +08:00
|
|
|
"if(__webpack_module_cache__[moduleId]) {",
|
|
|
|
Template.indent("return __webpack_module_cache__[moduleId].exports;"),
|
2017-03-31 21:07:39 +08:00
|
|
|
"}",
|
2017-01-13 04:38:38 +08:00
|
|
|
"// Create a new module (and put it into the cache)",
|
2019-09-30 16:08:08 +08:00
|
|
|
"var module = __webpack_module_cache__[moduleId] = {",
|
2018-11-28 20:07:40 +08:00
|
|
|
Template.indent(["i: moduleId,", "l: false,", "exports: {}"]),
|
2017-01-13 04:38:38 +08:00
|
|
|
"};",
|
|
|
|
"",
|
2018-11-28 20:07:40 +08:00
|
|
|
outputOptions.strictModuleExceptionHandling
|
|
|
|
? Template.asString([
|
|
|
|
"// Execute the module function",
|
|
|
|
"var threw = true;",
|
|
|
|
"try {",
|
|
|
|
Template.indent([moduleExecution, "threw = false;"]),
|
|
|
|
"} finally {",
|
2019-09-30 16:08:08 +08:00
|
|
|
Template.indent([
|
|
|
|
"if(threw) delete __webpack_module_cache__[moduleId];"
|
|
|
|
]),
|
2018-11-28 20:07:40 +08:00
|
|
|
"}"
|
|
|
|
])
|
|
|
|
: Template.asString([
|
|
|
|
"// Execute the module function",
|
|
|
|
moduleExecution
|
|
|
|
]),
|
2017-01-13 04:38:38 +08:00
|
|
|
"",
|
|
|
|
"// Flag the module as loaded",
|
|
|
|
"module.l = true;",
|
|
|
|
"",
|
|
|
|
"// Return the exports of the module",
|
|
|
|
"return module.exports;"
|
|
|
|
]);
|
|
|
|
});
|
2018-11-05 20:13:05 +08:00
|
|
|
}
|
2016-07-20 22:20:09 +08:00
|
|
|
|
2019-09-26 21:51:40 +08:00
|
|
|
// TODO webpack 6 remove
|
|
|
|
// BACKWARD COMPAT START
|
2018-11-05 20:13:05 +08:00
|
|
|
get requireFn() {
|
|
|
|
return "__webpack_require__";
|
2017-01-13 04:38:38 +08:00
|
|
|
}
|
2016-06-08 06:10:30 +08:00
|
|
|
|
2019-09-26 21:51:40 +08:00
|
|
|
/**
|
|
|
|
* @deprecated
|
|
|
|
* @param {string} hash the hash
|
|
|
|
* @param {number=} length length of the hash
|
|
|
|
* @returns {string} generated code
|
|
|
|
*/
|
|
|
|
renderCurrentHashCode(hash, length) {
|
|
|
|
if (length) {
|
|
|
|
return `${RuntimeGlobals.getFullHash} ? ${
|
|
|
|
RuntimeGlobals.getFullHash
|
|
|
|
}().slice(0, ${length}) : ${hash.slice(0, length)}`;
|
|
|
|
}
|
|
|
|
return `${RuntimeGlobals.getFullHash} ? ${RuntimeGlobals.getFullHash}() : ${hash}`;
|
|
|
|
}
|
|
|
|
// BACKWARD COMPAT END
|
|
|
|
|
2018-04-21 08:35:02 +08:00
|
|
|
/**
|
|
|
|
*
|
2018-05-01 23:47:14 +08:00
|
|
|
* @param {RenderManifestOptions} options render manifest options
|
2018-08-14 22:40:37 +08:00
|
|
|
* @returns {RenderManifestEntry[]} returns render manifest
|
2018-04-21 08:35:02 +08:00
|
|
|
*/
|
2017-10-30 20:56:57 +08:00
|
|
|
getRenderManifest(options) {
|
|
|
|
const result = [];
|
|
|
|
|
2018-01-24 16:39:49 +08:00
|
|
|
this.hooks.renderManifest.call(result, options);
|
2017-10-30 20:56:57 +08:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2018-04-21 08:35:02 +08:00
|
|
|
/**
|
2018-09-15 19:10:58 +08:00
|
|
|
* @param {RenderBootstrapContext} renderContext options object
|
2019-09-30 16:08:08 +08:00
|
|
|
* @returns {{ header: string[], startup: string[] }} the generated source of the bootstrap code
|
2018-04-21 08:35:02 +08:00
|
|
|
*/
|
2018-09-15 19:10:58 +08:00
|
|
|
renderBootstrap(renderContext) {
|
2019-09-30 16:08:08 +08:00
|
|
|
const { chunkGraph, chunk, runtimeTemplate } = renderContext;
|
2019-09-26 21:51:40 +08:00
|
|
|
|
|
|
|
const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
|
|
|
|
|
2019-09-30 16:08:08 +08:00
|
|
|
const requireFunction = runtimeRequirements.has(RuntimeGlobals.require);
|
|
|
|
const moduleCache = runtimeRequirements.has(RuntimeGlobals.moduleCache);
|
|
|
|
const moduleUsed = runtimeRequirements.has(RuntimeGlobals.module);
|
|
|
|
const exportsUsed = runtimeRequirements.has(RuntimeGlobals.exports);
|
|
|
|
const requireScopeUsed = runtimeRequirements.has(
|
|
|
|
RuntimeGlobals.requireScope
|
|
|
|
);
|
|
|
|
const interceptModuleExecution = runtimeRequirements.has(
|
|
|
|
RuntimeGlobals.interceptModuleExecution
|
|
|
|
);
|
|
|
|
const returnExportsFromRuntime = runtimeRequirements.has(
|
|
|
|
RuntimeGlobals.returnExportsFromRuntime
|
|
|
|
);
|
|
|
|
|
|
|
|
const useRequire =
|
|
|
|
requireFunction ||
|
|
|
|
interceptModuleExecution ||
|
|
|
|
returnExportsFromRuntime ||
|
|
|
|
moduleUsed ||
|
|
|
|
exportsUsed;
|
|
|
|
|
|
|
|
const result = {
|
|
|
|
header: [],
|
|
|
|
startup: []
|
|
|
|
};
|
|
|
|
|
|
|
|
let buf = result.header;
|
|
|
|
let startup = result.startup;
|
|
|
|
|
|
|
|
if (useRequire || moduleCache) {
|
|
|
|
buf.push("// The module cache");
|
|
|
|
buf.push("var __webpack_module_cache__ = {};");
|
|
|
|
buf.push("");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (useRequire) {
|
|
|
|
buf.push("// The require function");
|
|
|
|
buf.push(`function __webpack_require__(moduleId) {`);
|
|
|
|
buf.push(Template.indent('"use strict";'));
|
|
|
|
buf.push(Template.indent(this.hooks.require.call("", renderContext)));
|
|
|
|
buf.push("}");
|
|
|
|
buf.push("");
|
|
|
|
} else if (runtimeRequirements.has(RuntimeGlobals.requireScope)) {
|
|
|
|
buf.push("// The require scope");
|
|
|
|
buf.push("var __webpack_require__ = {};");
|
|
|
|
}
|
2019-09-26 21:51:40 +08:00
|
|
|
|
|
|
|
if (runtimeRequirements.has(RuntimeGlobals.moduleFactories)) {
|
|
|
|
buf.push("");
|
|
|
|
buf.push("// expose the modules object (__webpack_modules__)");
|
2019-09-30 16:08:08 +08:00
|
|
|
buf.push(`${RuntimeGlobals.moduleFactories} = __webpack_modules__;`);
|
2019-09-26 21:51:40 +08:00
|
|
|
}
|
|
|
|
|
2019-09-30 16:08:08 +08:00
|
|
|
if (moduleCache) {
|
2019-09-26 21:51:40 +08:00
|
|
|
buf.push("");
|
|
|
|
buf.push("// expose the module cache");
|
2019-09-30 16:08:08 +08:00
|
|
|
buf.push(`${RuntimeGlobals.moduleCache} = __webpack_module_cache__;`);
|
2019-09-26 21:51:40 +08:00
|
|
|
}
|
|
|
|
|
2019-09-30 16:08:08 +08:00
|
|
|
if (interceptModuleExecution) {
|
2019-09-26 21:51:40 +08:00
|
|
|
buf.push("");
|
|
|
|
buf.push("// expose the module execution interceptor");
|
|
|
|
buf.push(`${RuntimeGlobals.interceptModuleExecution} = [];`);
|
|
|
|
}
|
|
|
|
|
2014-06-03 03:23:53 +08:00
|
|
|
buf.push("");
|
2019-09-30 16:08:08 +08:00
|
|
|
if (!runtimeRequirements.has(RuntimeGlobals.startupNoDefault)) {
|
|
|
|
if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
|
|
|
|
/** @type {string[]} */
|
|
|
|
const buf2 = [];
|
|
|
|
const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(
|
|
|
|
chunk
|
|
|
|
);
|
|
|
|
buf2.push(
|
|
|
|
returnExportsFromRuntime
|
|
|
|
? "// Load entry module and return exports"
|
|
|
|
: "// Load entry module"
|
|
|
|
);
|
|
|
|
let i = chunkGraph.getNumberOfEntryModules(chunk);
|
|
|
|
for (const entryModule of chunkGraph.getChunkEntryModulesIterable(
|
|
|
|
chunk
|
|
|
|
)) {
|
|
|
|
const mayReturn =
|
|
|
|
--i === 0 && returnExportsFromRuntime ? "return " : "";
|
|
|
|
const moduleId = chunkGraph.getModuleId(entryModule);
|
|
|
|
let moduleIdExpr = JSON.stringify(moduleId);
|
|
|
|
if (runtimeRequirements.has(RuntimeGlobals.entryModuleId)) {
|
|
|
|
moduleIdExpr = `${RuntimeGlobals.entryModuleId} = ${moduleIdExpr}`;
|
|
|
|
}
|
|
|
|
if (useRequire) {
|
|
|
|
buf2.push(`${mayReturn}__webpack_require__(${moduleIdExpr});`);
|
|
|
|
} else if (requireScopeUsed) {
|
|
|
|
buf2.push(
|
|
|
|
`__webpack_modules__[${moduleIdExpr}](0, 0, __webpack_require__);`
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
buf2.push(`__webpack_modules__[${moduleIdExpr}]();`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (runtimeRequirements.has(RuntimeGlobals.startup)) {
|
|
|
|
buf.push(
|
|
|
|
Template.asString([
|
|
|
|
"// the startup function",
|
|
|
|
`${RuntimeGlobals.startup} = ${runtimeTemplate.basicFunction(
|
|
|
|
"",
|
|
|
|
buf2
|
|
|
|
)};`
|
|
|
|
])
|
|
|
|
);
|
|
|
|
startup.push("// run startup");
|
|
|
|
startup.push(`return ${RuntimeGlobals.startup}();`);
|
|
|
|
} else {
|
|
|
|
startup.push(
|
|
|
|
Template.asString(["// startup", Template.asString(buf2)])
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else if (runtimeRequirements.has(RuntimeGlobals.startup)) {
|
|
|
|
buf.push(
|
|
|
|
Template.asString([
|
|
|
|
"// the startup function",
|
|
|
|
"// It's empty as no entry modules are in this chunk",
|
|
|
|
`${RuntimeGlobals.startup} = ${runtimeTemplate.basicFunction(
|
|
|
|
"",
|
|
|
|
""
|
|
|
|
)}`
|
|
|
|
])
|
|
|
|
);
|
|
|
|
}
|
|
|
|
} else if (runtimeRequirements.has(RuntimeGlobals.startup)) {
|
|
|
|
startup.push("// run startup");
|
|
|
|
startup.push(`return ${RuntimeGlobals.startup}();`);
|
2018-11-29 21:13:02 +08:00
|
|
|
}
|
2019-09-30 16:08:08 +08:00
|
|
|
return result;
|
2018-09-14 05:25:26 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render
|
2018-09-15 19:10:58 +08:00
|
|
|
* @param {MainRenderContext} renderContext options object
|
2019-09-30 16:08:08 +08:00
|
|
|
* @returns {Source} the newly generated source from rendering
|
2018-09-14 05:25:26 +08:00
|
|
|
*/
|
2018-09-15 19:10:58 +08:00
|
|
|
render(moduleTemplate, renderContext) {
|
2019-09-30 16:08:08 +08:00
|
|
|
const { hash, chunk, chunkGraph, runtimeTemplate } = renderContext;
|
|
|
|
|
|
|
|
let source = new ConcatSource();
|
|
|
|
if (runtimeTemplate.supportsConst()) {
|
|
|
|
source.add("/******/ (() => { // webpackBootstrap\n");
|
|
|
|
} else {
|
|
|
|
source.add("/******/ (function() { // webpackBootstrap\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
source.add("/******/ \tvar __webpack_modules__ = (");
|
|
|
|
source.add(
|
|
|
|
Template.renderChunkModules(
|
|
|
|
renderContext,
|
|
|
|
m => m.getSourceTypes().has("javascript"),
|
|
|
|
moduleTemplate,
|
|
|
|
"/******/ \t"
|
|
|
|
)
|
|
|
|
);
|
|
|
|
source.add(");\n");
|
|
|
|
|
|
|
|
const bootstrap = this.renderBootstrap(renderContext);
|
|
|
|
|
|
|
|
source.add(
|
|
|
|
"/************************************************************************/\n"
|
|
|
|
);
|
|
|
|
source.add(
|
|
|
|
new PrefixSource(
|
|
|
|
"/******/",
|
|
|
|
new OriginalSource(
|
|
|
|
Template.prefix(bootstrap.header, " \t") + "\n",
|
|
|
|
"webpack/bootstrap"
|
|
|
|
)
|
|
|
|
)
|
2018-02-25 09:00:20 +08:00
|
|
|
);
|
2019-09-30 16:08:08 +08:00
|
|
|
|
|
|
|
const runtimeModules = renderContext.chunkGraph.getChunkRuntimeModulesInOrder(
|
|
|
|
chunk
|
|
|
|
);
|
|
|
|
|
|
|
|
if (runtimeModules.length > 0) {
|
|
|
|
source.add(
|
|
|
|
"/************************************************************************/\n"
|
|
|
|
);
|
|
|
|
source.add(
|
|
|
|
Template.renderMainRuntimeModules(runtimeModules, renderContext)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
source.add(
|
|
|
|
"/************************************************************************/\n"
|
|
|
|
);
|
|
|
|
source.add(
|
|
|
|
new PrefixSource(
|
|
|
|
"/******/",
|
|
|
|
new OriginalSource(
|
|
|
|
Template.prefix(bootstrap.startup, " \t") + "\n",
|
|
|
|
"webpack/startup"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
source.add("/******/ })()\n");
|
|
|
|
|
|
|
|
/** @type {Source} */
|
|
|
|
let finalSource = source;
|
2018-08-14 22:40:37 +08:00
|
|
|
if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
|
2019-09-30 16:08:08 +08:00
|
|
|
finalSource = this.hooks.renderWithEntry.call(finalSource, chunk, hash);
|
2017-01-13 04:38:38 +08:00
|
|
|
}
|
2019-09-30 16:08:08 +08:00
|
|
|
if (!finalSource) {
|
2018-02-25 09:00:20 +08:00
|
|
|
throw new Error(
|
|
|
|
"Compiler error: MainTemplate plugin 'render' should return something"
|
|
|
|
);
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
2017-01-13 04:38:38 +08:00
|
|
|
chunk.rendered = true;
|
2019-09-30 16:08:08 +08:00
|
|
|
return new ConcatSource(finalSource, ";");
|
2014-12-22 23:10:23 +08:00
|
|
|
}
|
2013-06-12 22:16:06 +08:00
|
|
|
|
2018-04-21 08:35:02 +08:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param {object} options get public path options
|
2018-05-08 20:31:51 +08:00
|
|
|
* @returns {string} hook call
|
2018-04-21 08:35:02 +08:00
|
|
|
*/
|
2017-01-13 04:38:38 +08:00
|
|
|
getPublicPath(options) {
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.hooks.assetPath.call(
|
|
|
|
this.outputOptions.publicPath || "",
|
2019-09-13 17:12:26 +08:00
|
|
|
options,
|
|
|
|
undefined
|
2018-02-25 09:00:20 +08:00
|
|
|
);
|
2017-11-29 01:43:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
getAssetPath(path, options) {
|
2019-09-13 17:12:26 +08:00
|
|
|
return this.hooks.assetPath.call(path, options, undefined);
|
2017-01-13 04:38:38 +08:00
|
|
|
}
|
2015-04-17 16:17:10 +08:00
|
|
|
|
2019-09-11 17:13:46 +08:00
|
|
|
getAssetPathWithInfo(path, options) {
|
|
|
|
const assetInfo = {};
|
|
|
|
// TODO webpack 5: refactor assetPath hook to receive { path, info } object
|
|
|
|
const newPath = this.hooks.assetPath.call(path, options, assetInfo);
|
|
|
|
return { path: newPath, info: assetInfo };
|
2017-01-13 04:38:38 +08:00
|
|
|
}
|
2015-04-17 16:17:10 +08:00
|
|
|
|
2018-06-25 16:44:54 +08:00
|
|
|
/**
|
|
|
|
* Updates hash with information from this template
|
|
|
|
* @param {Hash} hash the hash to update
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
2017-01-13 04:38:38 +08:00
|
|
|
updateHash(hash) {
|
|
|
|
hash.update("maintemplate");
|
|
|
|
hash.update("3");
|
2017-11-29 01:43:01 +08:00
|
|
|
this.hooks.hash.call(hash);
|
2017-01-13 04:38:38 +08:00
|
|
|
}
|
2014-04-20 03:35:01 +08:00
|
|
|
|
2018-06-25 16:44:54 +08:00
|
|
|
/**
|
|
|
|
* Updates hash with chunk-specific information from this template
|
|
|
|
* @param {Hash} hash the hash to update
|
|
|
|
* @param {Chunk} chunk the chunk
|
2018-09-15 19:10:58 +08:00
|
|
|
* @param {UpdateHashForChunkContext} context options object
|
2018-06-25 16:44:54 +08:00
|
|
|
* @returns {void}
|
|
|
|
*/
|
2018-09-15 19:10:58 +08:00
|
|
|
updateHashForChunk(hash, chunk, context) {
|
2017-01-13 04:38:38 +08:00
|
|
|
this.updateHash(hash);
|
2017-11-29 01:43:01 +08:00
|
|
|
this.hooks.hashForChunk.call(hash, chunk);
|
2019-09-30 16:08:08 +08:00
|
|
|
const bootstrap = this.renderBootstrap({
|
2018-09-15 19:10:58 +08:00
|
|
|
hash: "0000",
|
2018-09-14 05:25:26 +08:00
|
|
|
chunk,
|
2018-09-15 19:10:58 +08:00
|
|
|
chunkGraph: context.chunkGraph,
|
|
|
|
moduleGraph: context.moduleGraph,
|
|
|
|
runtimeTemplate: context.runtimeTemplate
|
2019-09-30 16:08:08 +08:00
|
|
|
});
|
|
|
|
for (const key of Object.keys(bootstrap)) {
|
|
|
|
hash.update(key);
|
|
|
|
for (const line of bootstrap[key]) {
|
|
|
|
hash.update(line);
|
|
|
|
}
|
2018-09-14 05:25:26 +08:00
|
|
|
}
|
2017-01-13 04:38:38 +08:00
|
|
|
}
|
2014-08-22 19:51:24 +08:00
|
|
|
};
|