@module-federation/enhanced
Version:
This package provides enhanced features for module federation.
73 lines (71 loc) • 3.89 kB
JavaScript
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const require_runtime = require('../../../_virtual/_rolldown/runtime.js');
const require_lib_container_runtime_utils = require('./utils.js');
const require_lib_container_runtime_EmbedFederationRuntimeModule = require('./EmbedFederationRuntimeModule.js');
const require_lib_container_runtime_FederationModulesPlugin = require('./FederationModulesPlugin.js');
let _module_federation_sdk_normalize_webpack_path = require("@module-federation/sdk/normalize-webpack-path");
//#region src/lib/container/runtime/EmbedFederationRuntimePlugin.ts
const { RuntimeGlobals } = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack"));
const PLUGIN_NAME = "EmbedFederationRuntimePlugin";
const federationGlobal = require_lib_container_runtime_utils.getFederationGlobalScope(RuntimeGlobals);
/**
* Plugin that embeds Module Federation runtime code into chunks.
* It ensures proper initialization of federated modules and manages runtime requirements.
*/
var EmbedFederationRuntimePlugin = class {
constructor(options = {}) {
this.processedChunks = /* @__PURE__ */ new WeakMap();
this.options = {
enableForAllChunks: false,
...options
};
}
/**
* Determines if runtime embedding should be enabled for a given chunk.
*/
isEnabledForChunk(chunk) {
if (chunk.id === "build time chunk") return false;
return this.options.enableForAllChunks || chunk.hasRuntime();
}
/**
* Checks if a hook has already been tapped by this plugin.
*/
isHookAlreadyTapped(taps, hookName) {
return taps.some((tap) => tap.name === hookName);
}
apply(compiler) {
const compilationTaps = compiler.hooks.thisCompilation.taps || [];
if (this.isHookAlreadyTapped(compilationTaps, PLUGIN_NAME)) return;
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
const { renderStartup } = compiler.webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation);
renderStartup.tap(PLUGIN_NAME, (startupSource, _lastInlinedModule, renderContext) => {
const { chunk, chunkGraph } = renderContext;
if (!this.isEnabledForChunk(chunk)) return startupSource;
const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
if (chunkGraph.getNumberOfEntryModules(chunk) > 0 || runtimeRequirements.has(RuntimeGlobals.startupNoDefault)) return startupSource;
return new compiler.webpack.sources.ConcatSource(startupSource, "\n// Custom hook: appended startup call because none was added automatically\n", `${RuntimeGlobals.startup}();\n`);
});
const federationHooks = require_lib_container_runtime_FederationModulesPlugin.default.getCompilationHooks(compilation);
const containerEntrySet = /* @__PURE__ */ new Set();
compilation.hooks.additionalChunkRuntimeRequirements.tap(PLUGIN_NAME, (chunk, runtimeRequirements) => {
if (!this.isEnabledForChunk(chunk)) return;
runtimeRequirements.add(RuntimeGlobals.startupOnlyBefore);
});
federationHooks.addFederationRuntimeDependency.tap(PLUGIN_NAME, (dependency) => {
containerEntrySet.add(dependency);
});
const handleRuntimeRequirements = (chunk, runtimeRequirements) => {
if (!this.isEnabledForChunk(chunk)) return;
if (runtimeRequirements.has("embeddedFederationRuntime")) return;
if (!runtimeRequirements.has(federationGlobal)) return;
runtimeRequirements.add("embeddedFederationRuntime");
const runtimeModule = new require_lib_container_runtime_EmbedFederationRuntimeModule.default(containerEntrySet);
compilation.addRuntimeModule(chunk, runtimeModule);
};
compilation.hooks.runtimeRequirementInTree.for(federationGlobal).tap(PLUGIN_NAME, handleRuntimeRequirements);
});
}
};
//#endregion
exports.default = EmbedFederationRuntimePlugin;
//# sourceMappingURL=EmbedFederationRuntimePlugin.js.map