@module-federation/enhanced
Version:
This package provides enhanced features for module federation.
94 lines (92 loc) • 4.86 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('../../../container/runtime/utils.js');
const require_lib_container_runtime_FederationRuntimeModule = require('../../../container/runtime/FederationRuntimeModule.js');
const require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedDependency = require('./SharedDependency.js');
const require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedEntryDependency = require('./SharedEntryDependency.js');
const require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedEntryModuleFactory = require('./SharedEntryModuleFactory.js');
let _module_federation_sdk = require("@module-federation/sdk");
let _module_federation_sdk_normalize_webpack_path = require("@module-federation/sdk/normalize-webpack-path");
//#region src/lib/sharing/tree-shaking/SharedContainerPlugin/SharedContainerPlugin.ts
const EntryDependency = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack/lib/dependencies/EntryDependency"));
const PLUGIN_NAME = "SharedContainerPlugin";
const HOT_UPDATE_SUFFIX = ".hot-update";
var SharedContainerPlugin = class {
constructor(options) {
this.name = PLUGIN_NAME;
this.filename = "";
const { mfName, shareName, request, library, independentShareFileName } = options;
const version = options.version || "0.0.0";
this._globalName = (0, _module_federation_sdk.encodeName)(`${mfName}_${shareName}_${version}`);
const fileName = independentShareFileName || `${version}/share-entry.js`;
this._shareName = shareName;
this._options = {
name: shareName,
request,
library: (library ? {
...library,
name: this._globalName
} : void 0) || {
type: "global",
name: this._globalName
},
version,
fileName
};
}
getData() {
return [
this.filename,
this._globalName,
this._options.version
];
}
apply(compiler) {
const { library, name, request, fileName } = this._options;
if (library.type && compiler.options.output && compiler.options.output.enabledLibraryTypes && !compiler.options.output.enabledLibraryTypes.includes(library.type)) compiler.options.output.enabledLibraryTypes.push(library.type);
compiler.hooks.make.tapAsync(PLUGIN_NAME, async (compilation, callback) => {
const dep = new require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedEntryDependency.default(name, request);
dep.loc = { name };
compilation.addEntry(compilation.options.context || "", dep, {
name,
filename: fileName,
library: {
type: library.type,
name: this._globalName
}
}, (error) => {
if (error) throw error;
});
callback();
});
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation, { normalModuleFactory }) => {
compilation.dependencyFactories.set(require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedEntryDependency.default, new require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedEntryModuleFactory.default());
compilation.dependencyFactories.set(require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedDependency.default, normalModuleFactory);
if (!compilation.dependencyFactories.has(EntryDependency)) compilation.dependencyFactories.set(EntryDependency, normalModuleFactory);
compilation.hooks.additionalTreeRuntimeRequirements.tap(PLUGIN_NAME, (chunk, set) => {
set.add(require_lib_container_runtime_utils.getFederationGlobalScope(compiler.webpack.RuntimeGlobals));
set.add(compiler.webpack.RuntimeGlobals.runtimeId);
compilation.addRuntimeModule(chunk, new require_lib_container_runtime_FederationRuntimeModule.default(set, name, {
name,
remotes: []
}));
});
compilation.hooks.processAssets.tapPromise({
name: "getManifestFileName",
stage: compilation.constructor.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER
}, async () => {
(0, _module_federation_sdk.assert)(compilation.entrypoints.get(name), `Can not get shared ${name} entryPoint!`);
const remoteEntryNameChunk = compilation.namedChunks.get(name);
(0, _module_federation_sdk.assert)(remoteEntryNameChunk, `Can not get shared ${name} chunk!`);
const files = Array.from(remoteEntryNameChunk.files).filter((f) => !f.includes(HOT_UPDATE_SUFFIX) && !f.endsWith(".css"));
(0, _module_federation_sdk.assert)(files.length > 0, `no files found for shared ${name} chunk`);
(0, _module_federation_sdk.assert)(files.length === 1, `shared ${name} chunk should not have multiple files!, current files: ${files.join(",")}`);
this.filename = files[0];
});
});
}
};
//#endregion
exports.PLUGIN_NAME = PLUGIN_NAME;
exports.default = SharedContainerPlugin;
//# sourceMappingURL=SharedContainerPlugin.js.map