webpack/lib/container/RemoteRuntimeModule.js

107 lines
3.3 KiB
JavaScript
Raw Normal View History

2020-02-25 04:18:14 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const RuntimeGlobals = require("../RuntimeGlobals");
const RuntimeModule = require("../RuntimeModule");
const Template = require("../Template");
/** @typedef {import("./RemoteModule")} RemoteModule */
class RemoteRuntimeModule extends RuntimeModule {
constructor() {
super("remotes loading");
}
/**
* @returns {string} runtime code
*/
generate() {
const { runtimeTemplate, chunkGraph, moduleGraph } = this.compilation;
const chunkToRemotesMapping = {};
const idToExternalAndNameMapping = {};
for (const chunk of this.chunk.getAllAsyncChunks()) {
const modules = chunkGraph.getChunkModulesIterableBySourceType(
chunk,
"remote"
);
if (!modules) continue;
const remotes = (chunkToRemotesMapping[chunk.id] = []);
for (const m of modules) {
const module = /** @type {RemoteModule} */ (m);
const name = module.internalRequest;
const id = chunkGraph.getModuleId(module);
const externalModule = moduleGraph.getModule(module.dependencies[0]);
const externalModuleId =
externalModule && chunkGraph.getModuleId(externalModule);
const overridesModule = moduleGraph.getModule(module.dependencies[1]);
const overridesModuleId =
overridesModule && chunkGraph.getModuleId(overridesModule);
2020-02-25 04:18:14 +08:00
remotes.push(id);
idToExternalAndNameMapping[id] = [
overridesModuleId,
externalModuleId,
name
];
2020-02-25 04:18:14 +08:00
}
}
return Template.asString([
2020-05-05 20:45:18 +08:00
"var installedModules = {};",
2020-02-25 04:18:14 +08:00
`var chunkMapping = ${JSON.stringify(
chunkToRemotesMapping,
null,
"\t"
)};`,
`var idToExternalAndNameMapping = ${JSON.stringify(
idToExternalAndNameMapping,
null,
"\t"
)};`,
`${
RuntimeGlobals.ensureChunkHandlers
}.remotes = ${runtimeTemplate.basicFunction("chunkId, promises", [
`if(${RuntimeGlobals.hasOwnProperty}(chunkMapping, chunkId)) {`,
Template.indent([
`chunkMapping[chunkId].forEach(${runtimeTemplate.basicFunction("id", [
2020-05-05 20:45:18 +08:00
`if(${RuntimeGlobals.hasOwnProperty}(installedModules, id)) return installedModules[id] && promises.push(installedModules[id]);`,
2020-02-25 04:18:14 +08:00
"var data = idToExternalAndNameMapping[id];",
2020-05-05 20:45:18 +08:00
`var onError = ${runtimeTemplate.basicFunction("error", [
"if(error && typeof error.message === \"string\") error.message += '\\nwhile loading \"' + data[2] + '\" from ' + data[1];",
`__webpack_modules__[id] = ${runtimeTemplate.basicFunction("", [
"throw error;"
])}`,
"delete installedModules[id];"
])};`,
`var onFactory = ${runtimeTemplate.basicFunction("factory", [
`__webpack_modules__[id] = ${runtimeTemplate.basicFunction(
"module",
["module.exports = factory();"]
)}`
])};`,
"try {",
Template.indent([
"var promise = __webpack_require__(data[0])(__webpack_require__(data[1])).get(data[2]);",
"if(promise && promise.then) {",
Template.indent([
`promises.push(installedModules[id] = promise.then(onFactory, onError));`
]),
"} else {",
Template.indent([`onFactory(promise);`]),
"}"
]),
"} catch(error) {",
Template.indent(["onError(error);"]),
"}"
2020-02-25 04:18:14 +08:00
])});`
]),
"}"
])}`
]);
}
}
module.exports = RemoteRuntimeModule;