/
githubmirror
/
webpack
Обзор
Документация
Войти
/
githubmirror
/
webpack
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v5.108.4
lib/container/ModuleFederationPlugin.js
121 строка
4 KB
Xiao
refactor: extract createHooksRegistry to deduplicate getCompilationHooks pattern (#21224)
26 июн 2026, 16:27
Не верифицирован
26 июн 2026, 16:27
5e7db5d
Код
Авторство
О чём код?
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy */ "use strict"; const { SyncHook } = require("tapable"); const isValidExternalsType = require("../../schemas/plugins/container/ExternalsType.check"); const SharePlugin = require("../sharing/SharePlugin"); const createHooksRegistry = require("../util/createHooksRegistry"); const ContainerPlugin = require("./ContainerPlugin"); const ContainerReferencePlugin = require("./ContainerReferencePlugin"); const HoistContainerReferences = require("./HoistContainerReferencesPlugin"); /** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").ExternalsType} ExternalsType */ /** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").ModuleFederationPluginOptions} ModuleFederationPluginOptions */ /** @typedef {import("../Compiler")} Compiler */ /** @typedef {import("../Dependency")} Dependency */ /** * Defines the compilation hooks type used by this module. * @typedef {object} CompilationHooks * @property {SyncHook<Dependency>} addContainerEntryDependency * @property {SyncHook<Dependency>} addFederationRuntimeDependency */ const PLUGIN_NAME = "ModuleFederationPlugin"; class ModuleFederationPlugin { /** * Creates an instance of ModuleFederationPlugin. * @param {ModuleFederationPluginOptions} options options */ constructor(options) { /** @type {ModuleFederationPluginOptions} */ this.options = options; } /** * Applies the plugin by registering its hooks on the compiler. * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { compiler.hooks.validate.tap(PLUGIN_NAME, () => { compiler.validate( () => require("../../schemas/plugins/container/ModuleFederationPlugin.json"), this.options, { name: "Module Federation Plugin", baseDataPath: "options" }, (options) => require("../../schemas/plugins/container/ModuleFederationPlugin.check")( options ) ); }); const { options } = this; const library = options.library || { type: "var", name: options.name }; const remoteType = options.remoteType || (options.library && isValidExternalsType(options.library.type) ? /** @type {ExternalsType} */ (options.library.type) : "script"); if ( library && !compiler.options.output.enabledLibraryTypes.includes(library.type) ) { compiler.options.output.enabledLibraryTypes.push(library.type); } compiler.hooks.afterPlugins.tap(PLUGIN_NAME, () => { if ( options.exposes && (Array.isArray(options.exposes) ? options.exposes.length > 0 : Object.keys(options.exposes).length > 0) ) { new ContainerPlugin({ name: /** @type {string} */ (options.name), library, filename: options.filename, runtime: options.runtime, shareScope: options.shareScope, exposes: options.exposes }).apply(compiler); } if ( options.remotes && (Array.isArray(options.remotes) ? options.remotes.length > 0 : Object.keys(options.remotes).length > 0) ) { new ContainerReferencePlugin({ remoteType, shareScope: options.shareScope, remotes: options.remotes }).apply(compiler); } if (options.shared) { new SharePlugin({ shared: options.shared, shareScope: options.shareScope }).apply(compiler); } new HoistContainerReferences().apply(compiler); }); } } ModuleFederationPlugin.getCompilationHooks = createHooksRegistry( () => /** @type {CompilationHooks} */ ({ addContainerEntryDependency: new SyncHook(["dependency"]), addFederationRuntimeDependency: new SyncHook(["dependency"]) }) ); module.exports = ModuleFederationPlugin;