webpack/lib/container/ContainerReferencePlugin.js

90 lines
2.6 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 and Zackary Jackson @ScriptedAlchemy
*/
"use strict";
2020-02-27 04:14:49 +08:00
const validateOptions = require("schema-utils");
const schema = require("../../schemas/plugins/ContainerReferencePlugin.json");
2020-02-25 04:18:14 +08:00
const ExternalsPlugin = require("../ExternalsPlugin");
const RuntimeGlobals = require("../RuntimeGlobals");
const RemoteModule = require("./RemoteModule");
const RemoteOverrideModuleFactory = require("./RemoteOverrideModuleFactory");
2020-02-25 04:18:14 +08:00
const RemoteRuntimeModule = require("./RemoteRuntimeModule");
const RemoteToExternalDependency = require("./RemoteToExternalDependency");
const RemoteToOverrideDependency = require("./RemoteToOverrideDependency");
2020-02-25 04:18:14 +08:00
const parseOptions = require("./parseOptions");
/** @typedef {import("../Compiler")} Compiler */
module.exports = class ContainerReferencePlugin {
constructor(options) {
this.remoteType = options.remoteType || "global";
this.remotes = parseOptions(options.remotes || []);
this.overrides = parseOptions(options.overrides || {});
2020-02-25 04:18:14 +08:00
2020-02-25 10:54:33 +08:00
validateOptions(schema, options, {
name: "Container Reference Plugin"
});
2020-02-25 04:18:14 +08:00
// TODO: Apply some validation around what was passed in.
}
/**
* @param {Compiler} compiler webpack compiler
* @returns {void}
*/
apply(compiler) {
const { remotes, remoteType } = this;
const remoteExternals = {};
for (const [key, value] of remotes) {
remoteExternals[`container-reference/${key}`] = value;
}
new ExternalsPlugin(remoteType, remoteExternals).apply(compiler);
compiler.hooks.compilation.tap(
"ContainerReferencePlugin",
(compilation, { normalModuleFactory }) => {
compilation.dependencyFactories.set(
RemoteToExternalDependency,
normalModuleFactory
);
compilation.dependencyFactories.set(
RemoteToOverrideDependency,
new RemoteOverrideModuleFactory()
);
2020-02-25 04:18:14 +08:00
normalModuleFactory.hooks.factorize.tap(
"ContainerReferencePlugin",
data => {
if (!data.request.includes("!")) {
for (const [key] of remotes) {
if (data.request.startsWith(`${key}/`)) {
return new RemoteModule(
data.request,
this.overrides,
`container-reference/${key}`,
2020-02-25 04:18:14 +08:00
data.request.slice(key.length + 1)
);
}
}
}
}
);
2020-02-27 05:32:48 +08:00
compilation.hooks.runtimeRequirementInTree
.for(RuntimeGlobals.ensureChunkHandlers)
.tap("OverridablesPlugin", (chunk, set) => {
2020-02-25 04:18:14 +08:00
set.add(RuntimeGlobals.module);
set.add(RuntimeGlobals.moduleFactories);
set.add(RuntimeGlobals.hasOwnProperty);
compilation.addRuntimeModule(chunk, new RemoteRuntimeModule());
2020-02-27 05:32:48 +08:00
});
2020-02-25 04:18:14 +08:00
}
);
}
};