UNPKG

@module-federation/enhanced

Version:

This package provides enhanced features for module federation.

143 lines (141 loc) • 7.45 kB
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const require_runtime = require('../../_virtual/_rolldown/runtime.js'); let _module_federation_sdk_normalize_webpack_path = require("@module-federation/sdk/normalize-webpack-path"); //#region src/lib/container/AsyncBoundaryPlugin.ts const SortableSet = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack/lib/util/SortableSet")); var AsyncEntryStartupPlugin = class { constructor(options) { this._runtimeChunks = /* @__PURE__ */ new Map(); this._options = options || {}; } apply(compiler) { compiler.hooks.thisCompilation.tap("AsyncEntryStartupPlugin", (compilation) => { this._collectRuntimeChunks(compilation); this._handleRenderStartup(compiler, compilation); }); } _collectRuntimeChunks(compilation) { compilation.hooks.beforeChunkAssets.tap("AsyncEntryStartupPlugin", () => { for (const chunk of compilation.chunks) if (chunk.hasRuntime() && chunk.id !== null) { this._runtimeChunks.set(chunk.id, chunk); for (const dependentChunk of compilation.chunkGraph.getChunkEntryDependentChunksIterable(chunk)) if (dependentChunk.id !== null) this._runtimeChunks.set(dependentChunk.id, dependentChunk); } }); } getChunkByName(compilation, dependOn, byname) { for (const name of dependOn) { const chunk = compilation.namedChunks.get(name); if (chunk) byname.add(chunk); } } _handleRenderStartup(compiler, compilation) { compiler.webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation).renderStartup.tap("AsyncEntryStartupPlugin", (source, _renderContext, upperContext) => { const isSingleRuntime = compiler.options?.optimization?.runtimeChunk; if (upperContext?.chunk.id && isSingleRuntime) { if (upperContext?.chunk.hasRuntime()) { this._runtimeChunks.set(upperContext.chunk.id, upperContext.chunk); return source; } } if (this._options.excludeChunk && this._options.excludeChunk(upperContext.chunk)) return source; const runtime = this._getChunkRuntime(upperContext); let remotes = ""; let shared = ""; for (const runtimeItem of runtime) { if (!runtimeItem) continue; const requirements = compilation.chunkGraph.getTreeRuntimeRequirements(runtimeItem); const entryOptions = upperContext.chunk.getEntryOptions(); const chunkInitialsSet = new Set(compilation.chunkGraph.getChunkEntryDependentChunksIterable(upperContext.chunk)); chunkInitialsSet.add(upperContext.chunk); const dependOn = entryOptions?.dependOn || []; this.getChunkByName(compilation, dependOn, chunkInitialsSet); const initialChunks = []; let hasRemoteModules = false; let consumeShares = false; for (const chunk of chunkInitialsSet) { initialChunks.push(chunk.id); if (!hasRemoteModules) hasRemoteModules = Boolean(compilation.chunkGraph.getChunkModulesIterableBySourceType(chunk, "remote")); if (!consumeShares) consumeShares = Boolean(compilation.chunkGraph.getChunkModulesIterableBySourceType(chunk, "consume-shared")); if (hasRemoteModules && consumeShares) break; } remotes = this._getRemotes(compiler.webpack.RuntimeGlobals, requirements, hasRemoteModules, initialChunks, remotes); shared = this._getShared(compiler.webpack.RuntimeGlobals, requirements, consumeShares, initialChunks, shared); } if (!remotes && !shared) return source; const initialEntryModules = this._getInitialEntryModules(compilation, upperContext); const templateString = this._getTemplateString(compiler, initialEntryModules, shared, remotes, source); return new compiler.webpack.sources.ConcatSource(templateString); }); } _getChunkRuntime(upperContext) { const runtime = /* @__PURE__ */ new Set(); const chunkRuntime = upperContext.chunk.runtime; if (chunkRuntime) { const runtimeItems = chunkRuntime instanceof SortableSet ? chunkRuntime : [chunkRuntime]; for (const runtimeItem of runtimeItems) { const chunk = this._runtimeChunks.get(runtimeItem); if (chunk) runtime.add(chunk); } } if (runtime.size === 0) runtime.add(upperContext.chunk); return runtime; } _getRemotes(runtimeGlobals, requirements, hasRemoteModules, chunksToRef, remotes) { if (!requirements.has(runtimeGlobals.currentRemoteGetScope) && !hasRemoteModules && !requirements.has("__webpack_require__.vmok")) return remotes; const remotesParts = remotes.startsWith("if(__webpack_require__.f && __webpack_require__.f.remotes) {") ? [remotes] : [remotes, "if(__webpack_require__.f && __webpack_require__.f.remotes) {"]; for (const chunkId of chunksToRef) if (chunkId !== null && chunkId !== void 0) remotesParts.push(` __webpack_require__.f.remotes(${JSON.stringify(chunkId)}, promiseTrack);`); remotesParts.push("}"); return remotesParts.join(""); } _getShared(runtimeGlobals, requirements, consumeShares, chunksToRef, shared) { if (!requirements.has(runtimeGlobals.shareScopeMap) && !consumeShares && !requirements.has(runtimeGlobals.initializeSharing)) return shared; const sharedParts = shared.startsWith("if(__webpack_require__.f && __webpack_require__.f.consumes) {") ? [shared] : [shared, "if(__webpack_require__.f && __webpack_require__.f.consumes) {"]; for (const chunkId of chunksToRef) if (chunkId !== null && chunkId !== void 0) sharedParts.push(` __webpack_require__.f.consumes(${JSON.stringify(chunkId)}, promiseTrack);`); sharedParts.push("}"); return sharedParts.join(""); } _getInitialEntryModules(compilation, upperContext) { const entryModules = compilation.chunkGraph.getChunkEntryModulesIterable(upperContext.chunk); const initialEntryModules = []; for (const entryModule of entryModules) { const entryModuleID = compilation.chunkGraph.getModuleId(entryModule); if (entryModuleID) { let shouldInclude = false; if (typeof this._options.eager === "function") shouldInclude = this._options.eager(entryModule); else if (this._options.eager && this._options.eager.test(entryModule.identifier())) shouldInclude = true; if (shouldInclude) initialEntryModules.push(`if(__webpack_require__.m[${JSON.stringify(entryModuleID)}]) { __webpack_require__(${JSON.stringify(entryModuleID)}); } else { console.warn('Federation Runtime Module not found. In the current runtime'); }`); } } return initialEntryModules; } _getTemplateString(compiler, initialEntryModules, shared, remotes, source) { const { Template } = compiler.webpack; const experiments = compiler.options?.experiments; const experimentsRecord = experiments && typeof experiments === "object" ? experiments : null; if (!!experimentsRecord && !!experimentsRecord["topLevelAwait"] && compiler.options?.experiments?.outputModule) return Template.asString([ "var promiseTrack = [];", Template.asString(initialEntryModules), shared, remotes, "await Promise.all(promiseTrack)", Template.indent(source.source().toString()) ]); return Template.asString([ "var promiseTrack = [];", Template.asString(initialEntryModules), shared, remotes, "var __webpack_exports__ = Promise.all(promiseTrack).then(function() {", Template.indent(source.source().toString()), Template.indent("return __webpack_exports__"), "});" ]); } }; //#endregion exports.default = AsyncEntryStartupPlugin; //# sourceMappingURL=AsyncBoundaryPlugin.js.map