@module-federation/enhanced 2.4.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +40 -0
- package/dist/src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.d.ts +3 -0
- package/dist/src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.js +29 -22
- package/dist/src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.js.map +1 -1
- package/dist/src/lib/sharing/tree-shaking/IndependentSharedPlugin.js +42 -47
- package/dist/src/lib/sharing/tree-shaking/IndependentSharedPlugin.js.map +1 -1
- package/dist/src/schemas/container/ModuleFederationPlugin.check.js +6 -2
- package/dist/src/schemas/container/ModuleFederationPlugin.check.js.map +1 -1
- package/dist/src/schemas/container/ModuleFederationPlugin.d.ts +1 -1
- package/dist/src/schemas/container/ModuleFederationPlugin.js +5 -1
- package/dist/src/schemas/container/ModuleFederationPlugin.js.map +1 -1
- package/package.json +12 -12
package/dist/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# @module-federation/enhanced
|
|
2
2
|
|
|
3
|
+
## 2.5.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 4da5508: Preserve all compiled shared fallback versions for webpack tree shaking.
|
|
8
|
+
- Updated dependencies [b79ba22]
|
|
9
|
+
- Updated dependencies [b553153]
|
|
10
|
+
- Updated dependencies [b9b3b8c]
|
|
11
|
+
- @module-federation/dts-plugin@2.5.1
|
|
12
|
+
- @module-federation/sdk@2.5.1
|
|
13
|
+
- @module-federation/cli@2.5.1
|
|
14
|
+
- @module-federation/manifest@2.5.1
|
|
15
|
+
- @module-federation/rspack@2.5.1
|
|
16
|
+
- @module-federation/bridge-react-webpack-plugin@2.5.1
|
|
17
|
+
- @module-federation/managers@2.5.1
|
|
18
|
+
- @module-federation/webpack-bundler-runtime@2.5.1
|
|
19
|
+
- @module-federation/runtime-tools@2.5.1
|
|
20
|
+
- @module-federation/inject-external-runtime-core-plugin@2.5.1
|
|
21
|
+
- @module-federation/error-codes@2.5.1
|
|
22
|
+
|
|
23
|
+
## 2.5.0
|
|
24
|
+
|
|
25
|
+
### Patch Changes
|
|
26
|
+
|
|
27
|
+
- Updated dependencies [5d4095d]
|
|
28
|
+
- Updated dependencies [0716c11]
|
|
29
|
+
- Updated dependencies [13dce52]
|
|
30
|
+
- Updated dependencies [41281f4]
|
|
31
|
+
- @module-federation/sdk@2.5.0
|
|
32
|
+
- @module-federation/dts-plugin@2.5.0
|
|
33
|
+
- @module-federation/error-codes@2.5.0
|
|
34
|
+
- @module-federation/bridge-react-webpack-plugin@2.5.0
|
|
35
|
+
- @module-federation/cli@2.5.0
|
|
36
|
+
- @module-federation/managers@2.5.0
|
|
37
|
+
- @module-federation/manifest@2.5.0
|
|
38
|
+
- @module-federation/rspack@2.5.0
|
|
39
|
+
- @module-federation/webpack-bundler-runtime@2.5.0
|
|
40
|
+
- @module-federation/runtime-tools@2.5.0
|
|
41
|
+
- @module-federation/inject-external-runtime-core-plugin@2.5.0
|
|
42
|
+
|
|
3
43
|
## 2.4.0
|
|
4
44
|
|
|
5
45
|
### Minor Changes
|
|
@@ -15,6 +15,9 @@ declare class CollectSharedEntryPlugin {
|
|
|
15
15
|
private _collectedEntries;
|
|
16
16
|
constructor(options: CollectSharedEntryPluginOptions);
|
|
17
17
|
getData(): ShareRequestsMap;
|
|
18
|
+
private resetData;
|
|
19
|
+
private getMatchedSharedOption;
|
|
20
|
+
private addRequest;
|
|
18
21
|
apply(compiler: Compiler): void;
|
|
19
22
|
}
|
|
20
23
|
//#endregion
|
|
@@ -7,14 +7,20 @@ fs = require_runtime.__toESM(fs);
|
|
|
7
7
|
|
|
8
8
|
//#region src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.ts
|
|
9
9
|
const PLUGIN_NAME = "CollectSharedEntryPlugin";
|
|
10
|
+
const NODE_MODULES = "node_modules";
|
|
11
|
+
const PNPM_STORE = ".pnpm";
|
|
10
12
|
function inferPkgVersionFromResource(resource) {
|
|
11
13
|
try {
|
|
12
|
-
const nmIndex = resource.lastIndexOf(
|
|
14
|
+
const nmIndex = resource.lastIndexOf(NODE_MODULES);
|
|
13
15
|
if (nmIndex === -1) return;
|
|
14
16
|
const after = resource.substring(nmIndex + 12 + 1);
|
|
15
|
-
if (after.startsWith(
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
17
|
+
if (after.startsWith(`${PNPM_STORE}/`)) {
|
|
18
|
+
const encodedPkgWithVersion = after.split(/[\\/]+/)[1];
|
|
19
|
+
if (encodedPkgWithVersion) {
|
|
20
|
+
const encodedPkgWithoutPeers = encodedPkgWithVersion.split("_")[0];
|
|
21
|
+
const versionStart = encodedPkgWithoutPeers.lastIndexOf("@");
|
|
22
|
+
if (versionStart > 0) return encodedPkgWithoutPeers.slice(versionStart + 1);
|
|
23
|
+
}
|
|
18
24
|
}
|
|
19
25
|
const parts = after.split(/[\\/]+/).filter(Boolean);
|
|
20
26
|
if (!parts.length) return;
|
|
@@ -44,32 +50,33 @@ var CollectSharedEntryPlugin = class {
|
|
|
44
50
|
getData() {
|
|
45
51
|
return this._collectedEntries;
|
|
46
52
|
}
|
|
53
|
+
resetData() {
|
|
54
|
+
this._collectedEntries = {};
|
|
55
|
+
}
|
|
56
|
+
getMatchedSharedOption(request) {
|
|
57
|
+
return this.sharedOptions.find(([sharedName, sharedConfig]) => request === sharedName || request === sharedConfig.import || request === sharedConfig.request || request === sharedConfig.shareKey);
|
|
58
|
+
}
|
|
59
|
+
addRequest(sharedName, resource, version) {
|
|
60
|
+
this._collectedEntries[sharedName] ||= { requests: [] };
|
|
61
|
+
const requests = this._collectedEntries[sharedName].requests;
|
|
62
|
+
if (requests.some(([, existingVersion]) => existingVersion === version)) return;
|
|
63
|
+
requests.push([resource, version]);
|
|
64
|
+
}
|
|
47
65
|
apply(compiler) {
|
|
48
|
-
const { sharedOptions } = this;
|
|
49
|
-
const { _collectedEntries: collectedEntries } = this;
|
|
50
66
|
compiler.hooks.compilation.tap("CollectSharedEntryPlugin", (_compilation, { normalModuleFactory }) => {
|
|
51
|
-
|
|
67
|
+
this.resetData();
|
|
68
|
+
normalModuleFactory.hooks.module.tap("CollectSharedEntryPlugin", (module, { resource }) => {
|
|
52
69
|
if (!resource || !("rawRequest" in module)) return module;
|
|
53
|
-
const matchedSharedOption =
|
|
70
|
+
const matchedSharedOption = this.getMatchedSharedOption(module.rawRequest);
|
|
54
71
|
if (!matchedSharedOption) return module;
|
|
55
|
-
const [sharedName,
|
|
56
|
-
const
|
|
72
|
+
const [sharedName, sharedConfig] = matchedSharedOption;
|
|
73
|
+
const configuredVersion = typeof sharedConfig.version === "string" ? sharedConfig.version : void 0;
|
|
74
|
+
const sharedVersion = inferPkgVersionFromResource(resource) || configuredVersion;
|
|
57
75
|
if (!sharedVersion) return module;
|
|
58
|
-
|
|
59
|
-
collectedEntries[sharedName].requests.push([resource, sharedVersion]);
|
|
76
|
+
this.addRequest(sharedName, resource, sharedVersion);
|
|
60
77
|
return module;
|
|
61
78
|
});
|
|
62
79
|
});
|
|
63
|
-
compiler.hooks.thisCompilation.tap("Collect shared entry", (compilation) => {
|
|
64
|
-
compilation.hooks.processAssets.tapPromise({
|
|
65
|
-
name: "CollectSharedEntry",
|
|
66
|
-
stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE
|
|
67
|
-
}, async () => {
|
|
68
|
-
compilation.getAssets().forEach((asset) => {
|
|
69
|
-
compilation.deleteAsset(asset.name);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
80
|
}
|
|
74
81
|
};
|
|
75
82
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectSharedEntryPlugin.js","names":[],"sources":["../../../../../src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { NormalizedSharedOptions } from '../SharePlugin';\n\nconst PLUGIN_NAME = 'CollectSharedEntryPlugin';\n\nexport type ShareRequestsMap = Record<\n string,\n {\n // request, version\n requests: [string, string][];\n }\n>;\n\nexport type CollectSharedEntryPluginOptions = {\n sharedOptions: NormalizedSharedOptions;\n shareScope?: string;\n};\n\nfunction inferPkgVersionFromResource(resource: string): string | undefined {\n try {\n const nmIndex = resource.lastIndexOf(
|
|
1
|
+
{"version":3,"file":"CollectSharedEntryPlugin.js","names":[],"sources":["../../../../../src/lib/sharing/tree-shaking/CollectSharedEntryPlugin.ts"],"sourcesContent":["import type { Compiler } from 'webpack';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { NormalizedSharedOptions } from '../SharePlugin';\n\nconst PLUGIN_NAME = 'CollectSharedEntryPlugin';\n\nexport type ShareRequestsMap = Record<\n string,\n {\n // request, version\n requests: [string, string][];\n }\n>;\n\nexport type CollectSharedEntryPluginOptions = {\n sharedOptions: NormalizedSharedOptions;\n shareScope?: string;\n};\n\nconst NODE_MODULES = 'node_modules';\nconst PNPM_STORE = '.pnpm';\n\nfunction inferPkgVersionFromResource(resource: string): string | undefined {\n try {\n const nmIndex = resource.lastIndexOf(NODE_MODULES);\n if (nmIndex === -1) {\n return undefined;\n }\n const after = resource.substring(nmIndex + NODE_MODULES.length + 1);\n\n // pnpm layout: node_modules/.pnpm/<encoded@version>/node_modules/<pkg>/...\n if (after.startsWith(`${PNPM_STORE}/`)) {\n const encodedPkgWithVersion = after.split(/[\\\\/]+/)[1];\n if (encodedPkgWithVersion) {\n const encodedPkgWithoutPeers = encodedPkgWithVersion.split('_')[0];\n const versionStart = encodedPkgWithoutPeers.lastIndexOf('@');\n if (versionStart > 0) {\n return encodedPkgWithoutPeers.slice(versionStart + 1);\n }\n }\n }\n\n const parts = after.split(/[\\\\/]+/).filter(Boolean);\n if (!parts.length) {\n return undefined;\n }\n let pkgPathParts: string[];\n if (parts[0].startsWith('@') && parts.length >= 2) {\n pkgPathParts = [parts[0], parts[1]];\n } else {\n pkgPathParts = [parts[0]];\n }\n const nmBase = resource.substring(0, nmIndex + NODE_MODULES.length + 1);\n const pkgJsonPath = path.join(nmBase, ...pkgPathParts, 'package.json');\n try {\n const content = fs.readFileSync(pkgJsonPath, 'utf-8');\n const pkg = JSON.parse(content);\n const v = pkg?.version;\n if (typeof v === 'string' && v) {\n return v;\n }\n } catch {\n // ignore\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nclass CollectSharedEntryPlugin {\n name = PLUGIN_NAME;\n\n sharedOptions: NormalizedSharedOptions;\n private _collectedEntries: ShareRequestsMap;\n\n constructor(options: CollectSharedEntryPluginOptions) {\n this.name = PLUGIN_NAME;\n\n const { sharedOptions } = options;\n\n this.sharedOptions = sharedOptions;\n this._collectedEntries = {};\n }\n\n getData() {\n return this._collectedEntries;\n }\n\n private resetData() {\n this._collectedEntries = {};\n }\n\n private getMatchedSharedOption(request: string) {\n const matchedSharedOption = this.sharedOptions.find(\n ([sharedName, sharedConfig]) =>\n request === sharedName ||\n request === sharedConfig.import ||\n request === sharedConfig.request ||\n request === sharedConfig.shareKey,\n );\n return matchedSharedOption;\n }\n\n private addRequest(sharedName: string, resource: string, version: string) {\n this._collectedEntries[sharedName] ||= { requests: [] };\n const requests = this._collectedEntries[sharedName].requests;\n if (requests.some(([, existingVersion]) => existingVersion === version)) {\n return;\n }\n requests.push([resource, version]);\n }\n\n apply(compiler: Compiler): void {\n compiler.hooks.compilation.tap(\n 'CollectSharedEntryPlugin',\n (_compilation, { normalModuleFactory }) => {\n this.resetData();\n normalModuleFactory.hooks.module.tap(\n 'CollectSharedEntryPlugin',\n (module, { resource }) => {\n if (!resource || !('rawRequest' in module)) {\n return module;\n }\n const matchedSharedOption = this.getMatchedSharedOption(\n module.rawRequest as string,\n );\n if (!matchedSharedOption) {\n return module;\n }\n const [sharedName, sharedConfig] = matchedSharedOption;\n const configuredVersion =\n typeof sharedConfig.version === 'string'\n ? sharedConfig.version\n : undefined;\n const sharedVersion =\n inferPkgVersionFromResource(resource) || configuredVersion;\n if (!sharedVersion) {\n return module;\n }\n this.addRequest(sharedName, resource, sharedVersion);\n return module;\n },\n );\n },\n );\n }\n}\n\nexport default CollectSharedEntryPlugin;\n"],"mappings":";;;;;;;;AAKA,MAAM,cAAc;AAepB,MAAM,eAAe;AACrB,MAAM,aAAa;AAEnB,SAAS,4BAA4B,UAAsC;AACzE,KAAI;EACF,MAAM,UAAU,SAAS,YAAY,aAAa;AAClD,MAAI,YAAY,GACd;EAEF,MAAM,QAAQ,SAAS,UAAU,UAAU,KAAsB,EAAE;AAGnE,MAAI,MAAM,WAAW,GAAG,WAAW,GAAG,EAAE;GACtC,MAAM,wBAAwB,MAAM,MAAM,SAAS,CAAC;AACpD,OAAI,uBAAuB;IACzB,MAAM,yBAAyB,sBAAsB,MAAM,IAAI,CAAC;IAChE,MAAM,eAAe,uBAAuB,YAAY,IAAI;AAC5D,QAAI,eAAe,EACjB,QAAO,uBAAuB,MAAM,eAAe,EAAE;;;EAK3D,MAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,QAAQ;AACnD,MAAI,CAAC,MAAM,OACT;EAEF,IAAI;AACJ,MAAI,MAAM,GAAG,WAAW,IAAI,IAAI,MAAM,UAAU,EAC9C,gBAAe,CAAC,MAAM,IAAI,MAAM,GAAG;MAEnC,gBAAe,CAAC,MAAM,GAAG;EAE3B,MAAM,SAAS,SAAS,UAAU,GAAG,UAAU,KAAsB,EAAE;EACvE,MAAM,cAAc,KAAK,KAAK,QAAQ,GAAG,cAAc,eAAe;AACtE,MAAI;GACF,MAAM,UAAU,GAAG,aAAa,aAAa,QAAQ;GAErD,MAAM,IADM,KAAK,MAAM,QAAQ,EAChB;AACf,OAAI,OAAO,MAAM,YAAY,EAC3B,QAAO;UAEH;AAGR;SACM;AACN;;;AAIJ,IAAM,2BAAN,MAA+B;CAM7B,YAAY,SAA0C;cAL/C;AAML,OAAK,OAAO;EAEZ,MAAM,EAAE,kBAAkB;AAE1B,OAAK,gBAAgB;AACrB,OAAK,oBAAoB,EAAE;;CAG7B,UAAU;AACR,SAAO,KAAK;;CAGd,AAAQ,YAAY;AAClB,OAAK,oBAAoB,EAAE;;CAG7B,AAAQ,uBAAuB,SAAiB;AAQ9C,SAP4B,KAAK,cAAc,MAC5C,CAAC,YAAY,kBACZ,YAAY,cACZ,YAAY,aAAa,UACzB,YAAY,aAAa,WACzB,YAAY,aAAa,SAC5B;;CAIH,AAAQ,WAAW,YAAoB,UAAkB,SAAiB;AACxE,OAAK,kBAAkB,gBAAgB,EAAE,UAAU,EAAE,EAAE;EACvD,MAAM,WAAW,KAAK,kBAAkB,YAAY;AACpD,MAAI,SAAS,MAAM,GAAG,qBAAqB,oBAAoB,QAAQ,CACrE;AAEF,WAAS,KAAK,CAAC,UAAU,QAAQ,CAAC;;CAGpC,MAAM,UAA0B;AAC9B,WAAS,MAAM,YAAY,IACzB,6BACC,cAAc,EAAE,0BAA0B;AACzC,QAAK,WAAW;AAChB,uBAAoB,MAAM,OAAO,IAC/B,6BACC,QAAQ,EAAE,eAAe;AACxB,QAAI,CAAC,YAAY,EAAE,gBAAgB,QACjC,QAAO;IAET,MAAM,sBAAsB,KAAK,uBAC/B,OAAO,WACR;AACD,QAAI,CAAC,oBACH,QAAO;IAET,MAAM,CAAC,YAAY,gBAAgB;IACnC,MAAM,oBACJ,OAAO,aAAa,YAAY,WAC5B,aAAa,UACb;IACN,MAAM,gBACJ,4BAA4B,SAAS,IAAI;AAC3C,QAAI,CAAC,cACH,QAAO;AAET,SAAK,WAAW,YAAY,UAAU,cAAc;AACpD,WAAO;KAEV;IAEJ"}
|
|
@@ -59,18 +59,15 @@ var IndependentSharedPlugin = class {
|
|
|
59
59
|
}
|
|
60
60
|
apply(compiler) {
|
|
61
61
|
const { manifest } = this;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (runCount) return;
|
|
65
|
-
await this.createIndependentCompilers(compiler);
|
|
66
|
-
runCount++;
|
|
67
|
-
});
|
|
68
|
-
compiler.hooks.watchRun.tapPromise("IndependentSharedPlugin", async () => {
|
|
69
|
-
if (runCount) return;
|
|
70
|
-
await this.createIndependentCompilers(compiler);
|
|
71
|
-
runCount++;
|
|
72
|
-
});
|
|
62
|
+
const collectSharedEntryPlugin = new require_lib_sharing_tree_shaking_CollectSharedEntryPlugin.default({ sharedOptions: this.sharedOptions });
|
|
63
|
+
collectSharedEntryPlugin.apply(compiler);
|
|
73
64
|
compiler.hooks.thisCompilation.tap("IndependentSharedPlugin", (compilation) => {
|
|
65
|
+
compilation.hooks.finishModules.tapPromise({
|
|
66
|
+
name: "IndependentSharedPlugin",
|
|
67
|
+
stage: 20
|
|
68
|
+
}, async () => {
|
|
69
|
+
await this.createIndependentCompilers(compiler, collectSharedEntryPlugin.getData());
|
|
70
|
+
});
|
|
74
71
|
compilation.hooks.additionalTreeRuntimeRequirements.tap("OptimizeDependencyReferencedExportsPlugin", (chunk) => {
|
|
75
72
|
compilation.addRuntimeModule(chunk, new require_lib_sharing_tree_shaking_IndependentSharedRuntimeModule.default(this.buildAssets, this.library?.type || "global"));
|
|
76
73
|
});
|
|
@@ -107,17 +104,19 @@ var IndependentSharedPlugin = class {
|
|
|
107
104
|
fs.writeFileSync(entryPath, entryContent);
|
|
108
105
|
return entryPath;
|
|
109
106
|
}
|
|
110
|
-
async createIndependentCompilers(parentCompiler) {
|
|
107
|
+
async createIndependentCompilers(parentCompiler, shareRequestsMap) {
|
|
111
108
|
const { sharedOptions, outputDir } = this;
|
|
109
|
+
this.buildAssets = {};
|
|
110
|
+
if (!sharedOptions.some(([shareName, shareConfig]) => Boolean(shareConfig.treeShaking) && Boolean(shareRequestsMap[shareName]?.requests.length))) return;
|
|
112
111
|
console.log("Start building shared fallback resources ...");
|
|
113
|
-
const shareRequestsMap = await this.createIndependentCompiler(parentCompiler);
|
|
114
112
|
await Promise.all(sharedOptions.map(async ([shareName, shareConfig]) => {
|
|
115
113
|
if (!shareConfig.treeShaking) return;
|
|
116
|
-
const shareRequests = shareRequestsMap[shareName]
|
|
117
|
-
|
|
114
|
+
const shareRequests = shareRequestsMap[shareName]?.requests ?? [];
|
|
115
|
+
for (let index = 0; index < shareRequests.length; index++) {
|
|
116
|
+
const [request, version] = shareRequests[index];
|
|
118
117
|
const sharedConfig = sharedOptions.find(([name]) => name === shareName)?.[1];
|
|
119
118
|
const [shareFileName, globalName, sharedVersion] = await this.createIndependentCompiler(parentCompiler, {
|
|
120
|
-
|
|
119
|
+
cleanOutput: index === 0,
|
|
121
120
|
currentShare: {
|
|
122
121
|
shareName,
|
|
123
122
|
version,
|
|
@@ -133,41 +132,37 @@ var IndependentSharedPlugin = class {
|
|
|
133
132
|
globalName
|
|
134
133
|
]);
|
|
135
134
|
}
|
|
136
|
-
}
|
|
135
|
+
}
|
|
137
136
|
}));
|
|
138
137
|
console.log("All shared fallback have been compiled successfully");
|
|
139
138
|
}
|
|
140
139
|
async createIndependentCompiler(parentCompiler, extraOptions) {
|
|
141
140
|
const { treeShaking, plugins, outputDir, sharedOptions, mfName, library, treeShakingSharedExcludePlugins } = this;
|
|
142
|
-
const outputDirWithShareName = resolveOutputDir(outputDir, extraOptions
|
|
141
|
+
const outputDirWithShareName = resolveOutputDir(outputDir, extraOptions.currentShare.shareName);
|
|
143
142
|
const parentConfig = parentCompiler.options;
|
|
144
143
|
const finalPlugins = [];
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
eager: options.eager
|
|
168
|
-
} })) }));
|
|
169
|
-
if (treeShaking) finalPlugins.push(new require_lib_sharing_tree_shaking_SharedUsedExportsOptimizerPlugin.default(sharedOptions, this.injectTreeShakingUsedExports, [IGNORED_ENTRY], this.manifest));
|
|
170
|
-
}
|
|
144
|
+
const extraPlugin = new require_lib_sharing_tree_shaking_SharedContainerPlugin_SharedContainerPlugin.default({
|
|
145
|
+
mfName: `${mfName}_${treeShaking ? "t" : "f"}`,
|
|
146
|
+
library,
|
|
147
|
+
...extraOptions.currentShare
|
|
148
|
+
});
|
|
149
|
+
(parentConfig.plugins || []).forEach((plugin) => {
|
|
150
|
+
if (plugin !== void 0 && typeof plugin !== "string" && filterPlugin(plugin, treeShakingSharedExcludePlugins)) finalPlugins.push(plugin);
|
|
151
|
+
});
|
|
152
|
+
plugins.forEach((plugin) => {
|
|
153
|
+
finalPlugins.push(plugin);
|
|
154
|
+
});
|
|
155
|
+
finalPlugins.push(new require_lib_sharing_ConsumeSharedPlugin.default({ consumes: sharedOptions.filter(([key, options]) => extraOptions.currentShare.shareName !== (options.shareKey || key)).map(([key, options]) => ({ [key]: {
|
|
156
|
+
import: false,
|
|
157
|
+
shareKey: options.shareKey || key,
|
|
158
|
+
shareScope: options.shareScope,
|
|
159
|
+
requiredVersion: options.requiredVersion,
|
|
160
|
+
strictVersion: options.strictVersion,
|
|
161
|
+
singleton: options.singleton,
|
|
162
|
+
packageName: options.packageName,
|
|
163
|
+
eager: options.eager
|
|
164
|
+
} })) }));
|
|
165
|
+
if (treeShaking) finalPlugins.push(new require_lib_sharing_tree_shaking_SharedUsedExportsOptimizerPlugin.default(sharedOptions, this.injectTreeShakingUsedExports, [IGNORED_ENTRY], this.manifest));
|
|
171
166
|
finalPlugins.push(extraPlugin);
|
|
172
167
|
const fullOutputDir = path.resolve(parentCompiler.outputPath, outputDirWithShareName);
|
|
173
168
|
const compilerConfig = {
|
|
@@ -177,7 +172,7 @@ var IndependentSharedPlugin = class {
|
|
|
177
172
|
entry: { [IGNORED_ENTRY]: this.createEntry(parentCompiler.context) },
|
|
178
173
|
output: {
|
|
179
174
|
path: fullOutputDir,
|
|
180
|
-
clean:
|
|
175
|
+
clean: extraOptions.cleanOutput,
|
|
181
176
|
publicPath: parentConfig.output?.publicPath || "auto"
|
|
182
177
|
},
|
|
183
178
|
plugins: finalPlugins,
|
|
@@ -190,7 +185,7 @@ var IndependentSharedPlugin = class {
|
|
|
190
185
|
if (parentCompiler.inputFileSystem) compiler.inputFileSystem = parentCompiler.inputFileSystem;
|
|
191
186
|
if (parentCompiler.outputFileSystem) compiler.outputFileSystem = parentCompiler.outputFileSystem;
|
|
192
187
|
if (parentCompiler.intermediateFileSystem) compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem;
|
|
193
|
-
const { currentShare
|
|
188
|
+
const { currentShare } = extraOptions;
|
|
194
189
|
return new Promise((resolve, reject) => {
|
|
195
190
|
compiler.run((err, stats) => {
|
|
196
191
|
const shareName = currentShare?.shareName || "unknown shared package";
|
|
@@ -228,7 +223,7 @@ var IndependentSharedPlugin = class {
|
|
|
228
223
|
reject(err || /* @__PURE__ */ new Error(`Shared "${shareName}" compilation failed`));
|
|
229
224
|
return;
|
|
230
225
|
}
|
|
231
|
-
|
|
226
|
+
console.log(`Shared "${shareName}" compilation succeeded`);
|
|
232
227
|
resolve(extraPlugin.getData());
|
|
233
228
|
});
|
|
234
229
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndependentSharedPlugin.js","names":["parseOptions","IndependentSharedRuntimeModule","StatsFileName","CollectSharedEntryPlugin","SharedContainerPlugin","ConsumeSharedPlugin","SharedUsedExportsOptimizerPlugin"],"sources":["../../../../../src/lib/sharing/tree-shaking/IndependentSharedPlugin.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n WebpackPluginInstance,\n Compiler,\n Configuration,\n WebpackOptionsNormalized,\n} from 'webpack';\nimport type { moduleFederationPlugin, Stats } from '@module-federation/sdk';\nimport {\n encodeName,\n isRequiredVersion,\n StatsFileName,\n} from '@module-federation/sdk';\nimport CollectSharedEntryPlugin, {\n type ShareRequestsMap,\n} from './CollectSharedEntryPlugin';\nimport SharedUsedExportsOptimizerPlugin from './SharedUsedExportsOptimizerPlugin';\nimport SharedContainerPlugin, {\n SharedContainerPluginOptions,\n} from './SharedContainerPlugin/SharedContainerPlugin';\nimport { parseOptions } from '../../container/options';\ntype SharedConfig = moduleFederationPlugin.SharedConfig;\nimport ConsumeSharedPlugin from '../ConsumeSharedPlugin';\nimport { NormalizedSharedOptions } from '../SharePlugin';\nimport IndependentSharedRuntimeModule from './IndependentSharedRuntimeModule';\n\nconst IGNORED_ENTRY = 'ignored-entry';\n\n// { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name ] ] }\nexport type ShareFallback = Record<string, [string, string, string][]>;\n\nexport type MakeRequired<T, K extends keyof T> = Required<Pick<T, K>> &\n Omit<T, K>;\n\nconst filterPlugin = (\n plugin: WebpackOptionsNormalized['plugins'][0],\n treeShakingSharedExcludePlugins: string[] = [],\n) => {\n if (!plugin) {\n return true;\n }\n const pluginName = plugin['name'] || plugin['constructor']?.name;\n if (!pluginName) {\n return true;\n }\n return ![\n 'IndependentSharedPlugin',\n 'ModuleFederationPlugin',\n 'SharedUsedExportsOptimizerPlugin',\n 'HtmlWebpackPlugin',\n 'TreeShakingSharedPlugin',\n ...treeShakingSharedExcludePlugins,\n ].includes(pluginName);\n};\n\nconst resolveOutputDir = (outputDir: string, shareName?: string) => {\n return shareName ? path.join(outputDir, encodeName(shareName)) : outputDir;\n};\n\nexport interface IndependentSharePluginOptions {\n name: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n outputDir?: string;\n plugins?: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n treeShakingSharedExcludePlugins?: string[];\n}\n\nexport default class IndependentSharedPlugin {\n mfName: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n sharedOptions: NormalizedSharedOptions;\n outputDir: string;\n plugins: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n buildAssets: ShareFallback = {};\n treeShakingSharedExcludePlugins?: string[];\n\n name = 'IndependentSharedPlugin';\n constructor(options: IndependentSharePluginOptions) {\n const {\n outputDir,\n plugins,\n treeShaking,\n shared,\n name,\n manifest,\n injectTreeShakingUsedExports,\n library,\n treeShakingSharedExcludePlugins,\n } = options;\n this.shared = shared;\n this.treeShakingSharedExcludePlugins = treeShakingSharedExcludePlugins;\n this.mfName = name;\n this.outputDir = outputDir || 'independent-packages';\n this.plugins = plugins || [];\n this.treeShaking = treeShaking;\n this.manifest = manifest;\n this.injectTreeShakingUsedExports = injectTreeShakingUsedExports ?? true;\n this.library = library;\n this.sharedOptions = parseOptions(\n shared,\n (item, key) => {\n if (typeof item !== 'string')\n throw new Error(\n `Unexpected array in shared configuration for key \"${key}\"`,\n );\n const config: SharedConfig =\n item === key || !isRequiredVersion(item)\n ? {\n import: item,\n }\n : {\n import: key,\n requiredVersion: item,\n };\n\n return config;\n },\n (item) => {\n return item;\n },\n );\n }\n\n static IndependentShareBuildAssetsFilename =\n 'independent-share-build-assets.json';\n\n apply(compiler: Compiler) {\n const { manifest } = this;\n let runCount = 0;\n\n compiler.hooks.beforeRun.tapPromise('IndependentSharedPlugin', async () => {\n if (runCount) {\n return;\n }\n await this.createIndependentCompilers(compiler);\n runCount++;\n });\n\n compiler.hooks.watchRun.tapPromise('IndependentSharedPlugin', async () => {\n if (runCount) {\n return;\n }\n await this.createIndependentCompilers(compiler);\n runCount++;\n });\n\n compiler.hooks.thisCompilation.tap(\n 'IndependentSharedPlugin',\n (compilation) => {\n compilation.hooks.additionalTreeRuntimeRequirements.tap(\n 'OptimizeDependencyReferencedExportsPlugin',\n (chunk) => {\n compilation.addRuntimeModule(\n chunk,\n new IndependentSharedRuntimeModule(\n this.buildAssets,\n this.library?.type || 'global',\n ),\n );\n },\n );\n // inject buildAssets to stats\n if (!manifest) {\n return;\n }\n compilation.hooks.processAssets.tapPromise(\n {\n name: 'injectReferenceExports',\n stage:\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n (compilation.constructor as any)\n .PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER,\n },\n async () => {\n const stats = compilation.getAsset(StatsFileName);\n if (!stats) {\n return;\n }\n const statsContent = JSON.parse(\n stats.source.source().toString(),\n ) as Stats;\n\n const { shared } = statsContent;\n Object.entries(this.buildAssets).forEach(([key, item]) => {\n const targetShared = shared.find((s) => s.name === key);\n if (!targetShared) {\n return;\n }\n item.forEach(([entry, version, globalName]) => {\n if (version === targetShared.version) {\n targetShared.fallback = entry;\n targetShared.fallbackName = globalName;\n }\n });\n });\n\n compilation.updateAsset(\n StatsFileName,\n new compiler.webpack.sources.RawSource(\n JSON.stringify(statsContent),\n ),\n );\n },\n );\n },\n );\n }\n\n private createEntry(context: string) {\n const { sharedOptions } = this;\n const entryContent = sharedOptions.reduce((acc, cur, index) => {\n return `${acc}import shared_${index} from '${cur[0]}';\\n`;\n }, '');\n const entryPath = path.resolve(\n context,\n 'node_modules',\n '.federation',\n // name,\n 'shared-entry.js',\n );\n if (!fs.existsSync(path.dirname(entryPath))) {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n }\n fs.writeFileSync(entryPath, entryContent);\n return entryPath;\n }\n\n private async createIndependentCompilers(parentCompiler: Compiler) {\n const { sharedOptions, outputDir } = this;\n console.log('Start building shared fallback resources ...');\n\n const shareRequestsMap: ShareRequestsMap =\n await this.createIndependentCompiler(parentCompiler);\n\n await Promise.all(\n sharedOptions.map(async ([shareName, shareConfig]) => {\n if (!shareConfig.treeShaking) {\n return;\n }\n const shareRequests = shareRequestsMap[shareName].requests;\n await Promise.all(\n shareRequests.map(async ([request, version]) => {\n const sharedConfig = sharedOptions.find(\n ([name]) => name === shareName,\n )?.[1];\n const [shareFileName, globalName, sharedVersion] =\n await this.createIndependentCompiler(parentCompiler, {\n shareRequestsMap,\n currentShare: {\n shareName,\n version,\n request,\n independentShareFileName: sharedConfig?.treeShaking?.filename,\n },\n });\n if (typeof shareFileName === 'string') {\n this.buildAssets[shareName] ||= [];\n this.buildAssets[shareName].push([\n path.join(\n resolveOutputDir(outputDir, shareName),\n shareFileName,\n ),\n sharedVersion,\n globalName,\n ]);\n }\n }),\n );\n }),\n );\n\n console.log('All shared fallback have been compiled successfully');\n }\n\n private async createIndependentCompiler(\n parentCompiler: Compiler,\n extraOptions?: {\n currentShare: Omit<SharedContainerPluginOptions, 'mfName'>;\n shareRequestsMap: ShareRequestsMap;\n },\n ) {\n const {\n treeShaking,\n plugins,\n outputDir,\n sharedOptions,\n mfName,\n library,\n treeShakingSharedExcludePlugins,\n } = this;\n const outputDirWithShareName = resolveOutputDir(\n outputDir,\n extraOptions?.currentShare?.shareName || '',\n );\n\n const parentConfig = parentCompiler.options;\n\n const finalPlugins = [];\n let extraPlugin: CollectSharedEntryPlugin | SharedContainerPlugin;\n if (!extraOptions) {\n extraPlugin = new CollectSharedEntryPlugin({\n sharedOptions,\n });\n } else {\n extraPlugin = new SharedContainerPlugin({\n mfName: `${mfName}_${treeShaking ? 't' : 'f'}`,\n library: library,\n ...extraOptions.currentShare,\n });\n (parentConfig.plugins || []).forEach((plugin) => {\n if (\n plugin !== undefined &&\n typeof plugin !== 'string' &&\n filterPlugin(plugin, treeShakingSharedExcludePlugins)\n ) {\n finalPlugins.push(plugin);\n }\n });\n plugins.forEach((plugin) => {\n finalPlugins.push(plugin);\n });\n finalPlugins.push(\n new ConsumeSharedPlugin({\n consumes: sharedOptions\n .filter(\n ([key, options]) =>\n extraOptions?.currentShare.shareName !==\n (options.shareKey || key),\n )\n .map(([key, options]) => ({\n [key]: {\n import: !extraOptions ? options.import : false,\n shareKey: options.shareKey || key,\n shareScope: options.shareScope,\n requiredVersion: options.requiredVersion,\n strictVersion: options.strictVersion,\n singleton: options.singleton,\n packageName: options.packageName,\n eager: options.eager,\n },\n })),\n }),\n );\n\n if (treeShaking) {\n finalPlugins.push(\n new SharedUsedExportsOptimizerPlugin(\n sharedOptions,\n this.injectTreeShakingUsedExports,\n [IGNORED_ENTRY],\n this.manifest,\n ),\n );\n }\n }\n finalPlugins.push(extraPlugin);\n const fullOutputDir = path.resolve(\n parentCompiler.outputPath,\n outputDirWithShareName,\n );\n // @ts-ignore webpack version is not the same as the one used in the plugin\n const compilerConfig: Configuration = {\n ...parentConfig,\n mode: parentConfig.mode || 'development',\n ignoreWarnings: [],\n entry: {\n [IGNORED_ENTRY]: this.createEntry(parentCompiler.context),\n },\n\n // 输出配置\n output: {\n path: fullOutputDir,\n clean: true,\n publicPath: parentConfig.output?.publicPath || 'auto',\n },\n\n // 插件继承\n plugins: finalPlugins,\n\n // 优化配置继承\n optimization: {\n ...parentConfig.optimization,\n splitChunks: false, // 每个包独立,不拆分\n },\n };\n\n // 创建独立的 webpack compiler 实例\n const webpack = parentCompiler.webpack;\n const compiler = webpack.webpack(compilerConfig as any);\n\n // 设置文件系统\n if (parentCompiler.inputFileSystem) {\n compiler.inputFileSystem = parentCompiler.inputFileSystem;\n }\n if (parentCompiler.outputFileSystem) {\n compiler.outputFileSystem = parentCompiler.outputFileSystem;\n }\n if (parentCompiler.intermediateFileSystem) {\n compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem;\n }\n\n const { currentShare, shareRequestsMap } = extraOptions || {};\n\n return new Promise<any>((resolve, reject) => {\n compiler.run((err: any, stats: any) => {\n const shareName = currentShare?.shareName || 'unknown shared package';\n const hasStatsErrors =\n !!stats &&\n (stats.hasErrors?.() || stats.toJson?.()?.errors?.length > 0);\n if (err || hasStatsErrors) {\n const lines: string[] = [];\n if (err) {\n const errMsg = (err && (err.stack || err.message)) || String(err);\n lines.push(`Compiler error: ${errMsg}`);\n }\n if (stats?.toJson) {\n const json = stats.toJson({\n all: false,\n errors: true,\n warnings: false,\n errorDetails: true,\n moduleTrace: true,\n } as any);\n const errors = (json && json.errors) || [];\n if (errors.length) {\n lines.push(`Webpack errors (${errors.length}):`);\n const max = 5;\n for (let i = 0; i < Math.min(errors.length, max); i++) {\n const e: any = errors[i];\n const where =\n e.moduleName || e.file || e.moduleIdentifier || '';\n const loc = e.loc ? ` @ ${e.loc}` : '';\n const msg = e.message || e.details || String(e);\n lines.push(` [${i + 1}] ${where}${loc}`);\n lines.push(` ${msg}`);\n }\n if (errors.length > max) {\n lines.push(` ... and ${errors.length - max} more errors`);\n }\n }\n }\n console.error(\n `❌ Shared \"${shareName}\" compilation failed\\n${lines.join('\\n')}`,\n );\n reject(err || new Error(`Shared \"${shareName}\" compilation failed`));\n return;\n }\n\n shareRequestsMap &&\n console.log(`Shared \"${shareName}\" compilation succeeded`);\n\n resolve(extraPlugin.getData());\n });\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA2BA,MAAM,gBAAgB;AAQtB,MAAM,gBACJ,QACA,kCAA4C,EAAE,KAC3C;AACH,KAAI,CAAC,OACH,QAAO;CAET,MAAM,aAAa,OAAO,WAAW,OAAO,gBAAgB;AAC5D,KAAI,CAAC,WACH,QAAO;AAET,QAAO,CAAC;EACN;EACA;EACA;EACA;EACA;EACA,GAAG;EACJ,CAAC,SAAS,WAAW;;AAGxB,MAAM,oBAAoB,WAAmB,cAAuB;AAClE,QAAO,YAAY,KAAK,KAAK,kDAAsB,UAAU,CAAC,GAAG;;AAenE,IAAqB,0BAArB,MAA6C;CAc3C,YAAY,SAAwC;qBAJvB,EAAE;cAGxB;EAEL,MAAM,EACJ,WACA,SACA,aACA,QACA,MACA,UACA,8BACA,SACA,oCACE;AACJ,OAAK,SAAS;AACd,OAAK,kCAAkC;AACvC,OAAK,SAAS;AACd,OAAK,YAAY,aAAa;AAC9B,OAAK,UAAU,WAAW,EAAE;AAC5B,OAAK,cAAc;AACnB,OAAK,WAAW;AAChB,OAAK,+BAA+B,gCAAgC;AACpE,OAAK,UAAU;AACf,OAAK,gBAAgBA,2CACnB,SACC,MAAM,QAAQ;AACb,OAAI,OAAO,SAAS,SAClB,OAAM,IAAI,MACR,qDAAqD,IAAI,GAC1D;AAWH,UATE,SAAS,OAAO,+CAAmB,KAAK,GACpC,EACE,QAAQ,MACT,GACD;IACE,QAAQ;IACR,iBAAiB;IAClB;MAIR,SAAS;AACR,UAAO;IAEV;;;6CAID;;CAEF,MAAM,UAAoB;EACxB,MAAM,EAAE,aAAa;EACrB,IAAI,WAAW;AAEf,WAAS,MAAM,UAAU,WAAW,2BAA2B,YAAY;AACzE,OAAI,SACF;AAEF,SAAM,KAAK,2BAA2B,SAAS;AAC/C;IACA;AAEF,WAAS,MAAM,SAAS,WAAW,2BAA2B,YAAY;AACxE,OAAI,SACF;AAEF,SAAM,KAAK,2BAA2B,SAAS;AAC/C;IACA;AAEF,WAAS,MAAM,gBAAgB,IAC7B,4BACC,gBAAgB;AACf,eAAY,MAAM,kCAAkC,IAClD,8CACC,UAAU;AACT,gBAAY,iBACV,OACA,IAAIC,wEACF,KAAK,aACL,KAAK,SAAS,QAAQ,SACvB,CACF;KAEJ;AAED,OAAI,CAAC,SACH;AAEF,eAAY,MAAM,cAAc,WAC9B;IACE,MAAM;IACN,OAEG,YAAY,YACV;IACN,EACD,YAAY;IACV,MAAM,QAAQ,YAAY,SAASC,qCAAc;AACjD,QAAI,CAAC,MACH;IAEF,MAAM,eAAe,KAAK,MACxB,MAAM,OAAO,QAAQ,CAAC,UAAU,CACjC;IAED,MAAM,EAAE,WAAW;AACnB,WAAO,QAAQ,KAAK,YAAY,CAAC,SAAS,CAAC,KAAK,UAAU;KACxD,MAAM,eAAe,OAAO,MAAM,MAAM,EAAE,SAAS,IAAI;AACvD,SAAI,CAAC,aACH;AAEF,UAAK,SAAS,CAAC,OAAO,SAAS,gBAAgB;AAC7C,UAAI,YAAY,aAAa,SAAS;AACpC,oBAAa,WAAW;AACxB,oBAAa,eAAe;;OAE9B;MACF;AAEF,gBAAY,YACVA,sCACA,IAAI,SAAS,QAAQ,QAAQ,UAC3B,KAAK,UAAU,aAAa,CAC7B,CACF;KAEJ;IAEJ;;CAGH,AAAQ,YAAY,SAAiB;EACnC,MAAM,EAAE,kBAAkB;EAC1B,MAAM,eAAe,cAAc,QAAQ,KAAK,KAAK,UAAU;AAC7D,UAAO,GAAG,IAAI,gBAAgB,MAAM,SAAS,IAAI,GAAG;KACnD,GAAG;EACN,MAAM,YAAY,KAAK,QACrB,SACA,gBACA,eAEA,kBACD;AACD,MAAI,CAAC,GAAG,WAAW,KAAK,QAAQ,UAAU,CAAC,CACzC,IAAG,UAAU,KAAK,QAAQ,UAAU,EAAE,EAAE,WAAW,MAAM,CAAC;AAE5D,KAAG,cAAc,WAAW,aAAa;AACzC,SAAO;;CAGT,MAAc,2BAA2B,gBAA0B;EACjE,MAAM,EAAE,eAAe,cAAc;AACrC,UAAQ,IAAI,+CAA+C;EAE3D,MAAM,mBACJ,MAAM,KAAK,0BAA0B,eAAe;AAEtD,QAAM,QAAQ,IACZ,cAAc,IAAI,OAAO,CAAC,WAAW,iBAAiB;AACpD,OAAI,CAAC,YAAY,YACf;GAEF,MAAM,gBAAgB,iBAAiB,WAAW;AAClD,SAAM,QAAQ,IACZ,cAAc,IAAI,OAAO,CAAC,SAAS,aAAa;IAC9C,MAAM,eAAe,cAAc,MAChC,CAAC,UAAU,SAAS,UACtB,GAAG;IACJ,MAAM,CAAC,eAAe,YAAY,iBAChC,MAAM,KAAK,0BAA0B,gBAAgB;KACnD;KACA,cAAc;MACZ;MACA;MACA;MACA,0BAA0B,cAAc,aAAa;MACtD;KACF,CAAC;AACJ,QAAI,OAAO,kBAAkB,UAAU;AACrC,UAAK,YAAY,eAAe,EAAE;AAClC,UAAK,YAAY,WAAW,KAAK;MAC/B,KAAK,KACH,iBAAiB,WAAW,UAAU,EACtC,cACD;MACD;MACA;MACD,CAAC;;KAEJ,CACH;IACD,CACH;AAED,UAAQ,IAAI,sDAAsD;;CAGpE,MAAc,0BACZ,gBACA,cAIA;EACA,MAAM,EACJ,aACA,SACA,WACA,eACA,QACA,SACA,oCACE;EACJ,MAAM,yBAAyB,iBAC7B,WACA,cAAc,cAAc,aAAa,GAC1C;EAED,MAAM,eAAe,eAAe;EAEpC,MAAM,eAAe,EAAE;EACvB,IAAI;AACJ,MAAI,CAAC,aACH,eAAc,IAAIC,kEAAyB,EACzC,eACD,CAAC;OACG;AACL,iBAAc,IAAIC,qFAAsB;IACtC,QAAQ,GAAG,OAAO,GAAG,cAAc,MAAM;IAChC;IACT,GAAG,aAAa;IACjB,CAAC;AACF,IAAC,aAAa,WAAW,EAAE,EAAE,SAAS,WAAW;AAC/C,QACE,WAAW,UACX,OAAO,WAAW,YAClB,aAAa,QAAQ,gCAAgC,CAErD,cAAa,KAAK,OAAO;KAE3B;AACF,WAAQ,SAAS,WAAW;AAC1B,iBAAa,KAAK,OAAO;KACzB;AACF,gBAAa,KACX,IAAIC,gDAAoB,EACtB,UAAU,cACP,QACE,CAAC,KAAK,aACL,cAAc,aAAa,eAC1B,QAAQ,YAAY,KACxB,CACA,KAAK,CAAC,KAAK,cAAc,GACvB,MAAM;IACL,QAAQ,CAAC,eAAe,QAAQ,SAAS;IACzC,UAAU,QAAQ,YAAY;IAC9B,YAAY,QAAQ;IACpB,iBAAiB,QAAQ;IACzB,eAAe,QAAQ;IACvB,WAAW,QAAQ;IACnB,aAAa,QAAQ;IACrB,OAAO,QAAQ;IAChB,EACF,EAAE,EACN,CAAC,CACH;AAED,OAAI,YACF,cAAa,KACX,IAAIC,0EACF,eACA,KAAK,8BACL,CAAC,cAAc,EACf,KAAK,SACN,CACF;;AAGL,eAAa,KAAK,YAAY;EAC9B,MAAM,gBAAgB,KAAK,QACzB,eAAe,YACf,uBACD;EAED,MAAM,iBAAgC;GACpC,GAAG;GACH,MAAM,aAAa,QAAQ;GAC3B,gBAAgB,EAAE;GAClB,OAAO,GACJ,gBAAgB,KAAK,YAAY,eAAe,QAAQ,EAC1D;GAGD,QAAQ;IACN,MAAM;IACN,OAAO;IACP,YAAY,aAAa,QAAQ,cAAc;IAChD;GAGD,SAAS;GAGT,cAAc;IACZ,GAAG,aAAa;IAChB,aAAa;IACd;GACF;EAID,MAAM,WADU,eAAe,QACN,QAAQ,eAAsB;AAGvD,MAAI,eAAe,gBACjB,UAAS,kBAAkB,eAAe;AAE5C,MAAI,eAAe,iBACjB,UAAS,mBAAmB,eAAe;AAE7C,MAAI,eAAe,uBACjB,UAAS,yBAAyB,eAAe;EAGnD,MAAM,EAAE,cAAc,qBAAqB,gBAAgB,EAAE;AAE7D,SAAO,IAAI,SAAc,SAAS,WAAW;AAC3C,YAAS,KAAK,KAAU,UAAe;IACrC,MAAM,YAAY,cAAc,aAAa;IAC7C,MAAM,iBACJ,CAAC,CAAC,UACD,MAAM,aAAa,IAAI,MAAM,UAAU,EAAE,QAAQ,SAAS;AAC7D,QAAI,OAAO,gBAAgB;KACzB,MAAM,QAAkB,EAAE;AAC1B,SAAI,KAAK;MACP,MAAM,SAAU,QAAQ,IAAI,SAAS,IAAI,YAAa,OAAO,IAAI;AACjE,YAAM,KAAK,mBAAmB,SAAS;;AAEzC,SAAI,OAAO,QAAQ;MACjB,MAAM,OAAO,MAAM,OAAO;OACxB,KAAK;OACL,QAAQ;OACR,UAAU;OACV,cAAc;OACd,aAAa;OACd,CAAQ;MACT,MAAM,SAAU,QAAQ,KAAK,UAAW,EAAE;AAC1C,UAAI,OAAO,QAAQ;AACjB,aAAM,KAAK,mBAAmB,OAAO,OAAO,IAAI;OAChD,MAAM,MAAM;AACZ,YAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,IAAI,EAAE,KAAK;QACrD,MAAM,IAAS,OAAO;QACtB,MAAM,QACJ,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB;QAClD,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,QAAQ;QACpC,MAAM,MAAM,EAAE,WAAW,EAAE,WAAW,OAAO,EAAE;AAC/C,cAAM,KAAK,MAAM,IAAI,EAAE,IAAI,QAAQ,MAAM;AACzC,cAAM,KAAK,SAAS,MAAM;;AAE5B,WAAI,OAAO,SAAS,IAClB,OAAM,KAAK,aAAa,OAAO,SAAS,IAAI,cAAc;;;AAIhE,aAAQ,MACN,aAAa,UAAU,wBAAwB,MAAM,KAAK,KAAK,GAChE;AACD,YAAO,uBAAO,IAAI,MAAM,WAAW,UAAU,sBAAsB,CAAC;AACpE;;AAGF,wBACE,QAAQ,IAAI,WAAW,UAAU,yBAAyB;AAE5D,YAAQ,YAAY,SAAS,CAAC;KAC9B;IACF"}
|
|
1
|
+
{"version":3,"file":"IndependentSharedPlugin.js","names":["parseOptions","CollectSharedEntryPlugin","IndependentSharedRuntimeModule","StatsFileName","SharedContainerPlugin","ConsumeSharedPlugin","SharedUsedExportsOptimizerPlugin"],"sources":["../../../../../src/lib/sharing/tree-shaking/IndependentSharedPlugin.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport type {\n WebpackPluginInstance,\n Compiler,\n Configuration,\n WebpackOptionsNormalized,\n} from 'webpack';\nimport type { moduleFederationPlugin, Stats } from '@module-federation/sdk';\nimport {\n encodeName,\n isRequiredVersion,\n StatsFileName,\n} from '@module-federation/sdk';\nimport CollectSharedEntryPlugin, {\n type ShareRequestsMap,\n} from './CollectSharedEntryPlugin';\nimport SharedUsedExportsOptimizerPlugin from './SharedUsedExportsOptimizerPlugin';\nimport SharedContainerPlugin, {\n SharedContainerPluginOptions,\n} from './SharedContainerPlugin/SharedContainerPlugin';\nimport { parseOptions } from '../../container/options';\ntype SharedConfig = moduleFederationPlugin.SharedConfig;\nimport ConsumeSharedPlugin from '../ConsumeSharedPlugin';\nimport { NormalizedSharedOptions } from '../SharePlugin';\nimport IndependentSharedRuntimeModule from './IndependentSharedRuntimeModule';\n\nconst IGNORED_ENTRY = 'ignored-entry';\n\n// { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name ] ] }\nexport type ShareFallback = Record<string, [string, string, string][]>;\n\nexport type MakeRequired<T, K extends keyof T> = Required<Pick<T, K>> &\n Omit<T, K>;\n\nconst filterPlugin = (\n plugin: WebpackOptionsNormalized['plugins'][0],\n treeShakingSharedExcludePlugins: string[] = [],\n) => {\n if (!plugin) {\n return true;\n }\n const pluginName = plugin['name'] || plugin['constructor']?.name;\n if (!pluginName) {\n return true;\n }\n return ![\n 'IndependentSharedPlugin',\n 'ModuleFederationPlugin',\n 'SharedUsedExportsOptimizerPlugin',\n 'HtmlWebpackPlugin',\n 'TreeShakingSharedPlugin',\n ...treeShakingSharedExcludePlugins,\n ].includes(pluginName);\n};\n\nconst resolveOutputDir = (outputDir: string, shareName?: string) => {\n return shareName ? path.join(outputDir, encodeName(shareName)) : outputDir;\n};\n\nexport interface IndependentSharePluginOptions {\n name: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n outputDir?: string;\n plugins?: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n treeShakingSharedExcludePlugins?: string[];\n}\n\nexport default class IndependentSharedPlugin {\n mfName: string;\n shared: moduleFederationPlugin.Shared;\n library?: moduleFederationPlugin.LibraryOptions;\n sharedOptions: NormalizedSharedOptions;\n outputDir: string;\n plugins: WebpackPluginInstance[];\n treeShaking?: boolean;\n manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'];\n injectTreeShakingUsedExports?: boolean;\n buildAssets: ShareFallback = {};\n treeShakingSharedExcludePlugins?: string[];\n\n name = 'IndependentSharedPlugin';\n constructor(options: IndependentSharePluginOptions) {\n const {\n outputDir,\n plugins,\n treeShaking,\n shared,\n name,\n manifest,\n injectTreeShakingUsedExports,\n library,\n treeShakingSharedExcludePlugins,\n } = options;\n this.shared = shared;\n this.treeShakingSharedExcludePlugins = treeShakingSharedExcludePlugins;\n this.mfName = name;\n this.outputDir = outputDir || 'independent-packages';\n this.plugins = plugins || [];\n this.treeShaking = treeShaking;\n this.manifest = manifest;\n this.injectTreeShakingUsedExports = injectTreeShakingUsedExports ?? true;\n this.library = library;\n this.sharedOptions = parseOptions(\n shared,\n (item, key) => {\n if (typeof item !== 'string')\n throw new Error(\n `Unexpected array in shared configuration for key \"${key}\"`,\n );\n const config: SharedConfig =\n item === key || !isRequiredVersion(item)\n ? {\n import: item,\n }\n : {\n import: key,\n requiredVersion: item,\n };\n\n return config;\n },\n (item) => {\n return item;\n },\n );\n }\n\n static IndependentShareBuildAssetsFilename =\n 'independent-share-build-assets.json';\n\n apply(compiler: Compiler) {\n const { manifest } = this;\n const collectSharedEntryPlugin = new CollectSharedEntryPlugin({\n sharedOptions: this.sharedOptions,\n });\n collectSharedEntryPlugin.apply(compiler);\n\n compiler.hooks.thisCompilation.tap(\n 'IndependentSharedPlugin',\n (compilation) => {\n compilation.hooks.finishModules.tapPromise(\n {\n name: 'IndependentSharedPlugin',\n stage: 20,\n },\n async () => {\n await this.createIndependentCompilers(\n compiler,\n collectSharedEntryPlugin.getData(),\n );\n },\n );\n compilation.hooks.additionalTreeRuntimeRequirements.tap(\n 'OptimizeDependencyReferencedExportsPlugin',\n (chunk) => {\n compilation.addRuntimeModule(\n chunk,\n new IndependentSharedRuntimeModule(\n this.buildAssets,\n this.library?.type || 'global',\n ),\n );\n },\n );\n // inject buildAssets to stats\n if (!manifest) {\n return;\n }\n compilation.hooks.processAssets.tapPromise(\n {\n name: 'injectReferenceExports',\n stage:\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n (compilation.constructor as any)\n .PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER,\n },\n async () => {\n const stats = compilation.getAsset(StatsFileName);\n if (!stats) {\n return;\n }\n const statsContent = JSON.parse(\n stats.source.source().toString(),\n ) as Stats;\n\n const { shared } = statsContent;\n Object.entries(this.buildAssets).forEach(([key, item]) => {\n const targetShared = shared.find((s) => s.name === key);\n if (!targetShared) {\n return;\n }\n item.forEach(([entry, version, globalName]) => {\n if (version === targetShared.version) {\n targetShared.fallback = entry;\n targetShared.fallbackName = globalName;\n }\n });\n });\n\n compilation.updateAsset(\n StatsFileName,\n new compiler.webpack.sources.RawSource(\n JSON.stringify(statsContent),\n ),\n );\n },\n );\n },\n );\n }\n\n private createEntry(context: string) {\n const { sharedOptions } = this;\n const entryContent = sharedOptions.reduce((acc, cur, index) => {\n return `${acc}import shared_${index} from '${cur[0]}';\\n`;\n }, '');\n const entryPath = path.resolve(\n context,\n 'node_modules',\n '.federation',\n // name,\n 'shared-entry.js',\n );\n if (!fs.existsSync(path.dirname(entryPath))) {\n fs.mkdirSync(path.dirname(entryPath), { recursive: true });\n }\n fs.writeFileSync(entryPath, entryContent);\n return entryPath;\n }\n\n private async createIndependentCompilers(\n parentCompiler: Compiler,\n shareRequestsMap: ShareRequestsMap,\n ) {\n const { sharedOptions, outputDir } = this;\n this.buildAssets = {};\n\n const hasShareRequests = sharedOptions.some(\n ([shareName, shareConfig]) =>\n Boolean(shareConfig.treeShaking) &&\n Boolean(shareRequestsMap[shareName]?.requests.length),\n );\n if (!hasShareRequests) {\n return;\n }\n\n console.log('Start building shared fallback resources ...');\n\n await Promise.all(\n sharedOptions.map(async ([shareName, shareConfig]) => {\n if (!shareConfig.treeShaking) {\n return;\n }\n const shareRequests = shareRequestsMap[shareName]?.requests ?? [];\n for (let index = 0; index < shareRequests.length; index++) {\n const [request, version] = shareRequests[index];\n const sharedConfig = sharedOptions.find(\n ([name]) => name === shareName,\n )?.[1];\n const [shareFileName, globalName, sharedVersion] =\n await this.createIndependentCompiler(parentCompiler, {\n cleanOutput: index === 0,\n currentShare: {\n shareName,\n version,\n request,\n independentShareFileName: sharedConfig?.treeShaking?.filename,\n },\n });\n if (typeof shareFileName === 'string') {\n this.buildAssets[shareName] ||= [];\n this.buildAssets[shareName].push([\n path.join(resolveOutputDir(outputDir, shareName), shareFileName),\n sharedVersion,\n globalName,\n ]);\n }\n }\n }),\n );\n\n console.log('All shared fallback have been compiled successfully');\n }\n\n private async createIndependentCompiler(\n parentCompiler: Compiler,\n extraOptions: {\n currentShare: Omit<SharedContainerPluginOptions, 'mfName'>;\n cleanOutput: boolean;\n },\n ) {\n const {\n treeShaking,\n plugins,\n outputDir,\n sharedOptions,\n mfName,\n library,\n treeShakingSharedExcludePlugins,\n } = this;\n const outputDirWithShareName = resolveOutputDir(\n outputDir,\n extraOptions.currentShare.shareName,\n );\n\n const parentConfig = parentCompiler.options;\n\n const finalPlugins = [];\n const extraPlugin = new SharedContainerPlugin({\n mfName: `${mfName}_${treeShaking ? 't' : 'f'}`,\n library: library,\n ...extraOptions.currentShare,\n });\n (parentConfig.plugins || []).forEach((plugin) => {\n if (\n plugin !== undefined &&\n typeof plugin !== 'string' &&\n filterPlugin(plugin, treeShakingSharedExcludePlugins)\n ) {\n finalPlugins.push(plugin);\n }\n });\n plugins.forEach((plugin) => {\n finalPlugins.push(plugin);\n });\n finalPlugins.push(\n new ConsumeSharedPlugin({\n consumes: sharedOptions\n .filter(\n ([key, options]) =>\n extraOptions.currentShare.shareName !== (options.shareKey || key),\n )\n .map(([key, options]) => ({\n [key]: {\n import: false,\n shareKey: options.shareKey || key,\n shareScope: options.shareScope,\n requiredVersion: options.requiredVersion,\n strictVersion: options.strictVersion,\n singleton: options.singleton,\n packageName: options.packageName,\n eager: options.eager,\n },\n })),\n }),\n );\n\n if (treeShaking) {\n finalPlugins.push(\n new SharedUsedExportsOptimizerPlugin(\n sharedOptions,\n this.injectTreeShakingUsedExports,\n [IGNORED_ENTRY],\n this.manifest,\n ),\n );\n }\n finalPlugins.push(extraPlugin);\n const fullOutputDir = path.resolve(\n parentCompiler.outputPath,\n outputDirWithShareName,\n );\n // @ts-ignore webpack version is not the same as the one used in the plugin\n const compilerConfig: Configuration = {\n ...parentConfig,\n mode: parentConfig.mode || 'development',\n ignoreWarnings: [],\n entry: {\n [IGNORED_ENTRY]: this.createEntry(parentCompiler.context),\n },\n\n // 输出配置\n output: {\n path: fullOutputDir,\n clean: extraOptions.cleanOutput,\n publicPath: parentConfig.output?.publicPath || 'auto',\n },\n\n // 插件继承\n plugins: finalPlugins,\n\n // 优化配置继承\n optimization: {\n ...parentConfig.optimization,\n splitChunks: false, // 每个包独立,不拆分\n },\n };\n\n // 创建独立的 webpack compiler 实例\n const webpack = parentCompiler.webpack;\n const compiler = webpack.webpack(compilerConfig as any);\n\n // 设置文件系统\n if (parentCompiler.inputFileSystem) {\n compiler.inputFileSystem = parentCompiler.inputFileSystem;\n }\n if (parentCompiler.outputFileSystem) {\n compiler.outputFileSystem = parentCompiler.outputFileSystem;\n }\n if (parentCompiler.intermediateFileSystem) {\n compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem;\n }\n\n const { currentShare } = extraOptions;\n\n return new Promise<any>((resolve, reject) => {\n compiler.run((err: any, stats: any) => {\n const shareName = currentShare?.shareName || 'unknown shared package';\n const hasStatsErrors =\n !!stats &&\n (stats.hasErrors?.() || stats.toJson?.()?.errors?.length > 0);\n if (err || hasStatsErrors) {\n const lines: string[] = [];\n if (err) {\n const errMsg = (err && (err.stack || err.message)) || String(err);\n lines.push(`Compiler error: ${errMsg}`);\n }\n if (stats?.toJson) {\n const json = stats.toJson({\n all: false,\n errors: true,\n warnings: false,\n errorDetails: true,\n moduleTrace: true,\n } as any);\n const errors = (json && json.errors) || [];\n if (errors.length) {\n lines.push(`Webpack errors (${errors.length}):`);\n const max = 5;\n for (let i = 0; i < Math.min(errors.length, max); i++) {\n const e: any = errors[i];\n const where =\n e.moduleName || e.file || e.moduleIdentifier || '';\n const loc = e.loc ? ` @ ${e.loc}` : '';\n const msg = e.message || e.details || String(e);\n lines.push(` [${i + 1}] ${where}${loc}`);\n lines.push(` ${msg}`);\n }\n if (errors.length > max) {\n lines.push(` ... and ${errors.length - max} more errors`);\n }\n }\n }\n console.error(\n `❌ Shared \"${shareName}\" compilation failed\\n${lines.join('\\n')}`,\n );\n reject(err || new Error(`Shared \"${shareName}\" compilation failed`));\n return;\n }\n\n console.log(`Shared \"${shareName}\" compilation succeeded`);\n\n resolve(extraPlugin.getData());\n });\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1967,7 +1967,7 @@ function D(o, { instancePath: i = "", parentData: a, parentDataProperty: p, root
|
|
|
1967
1967
|
if (void 0 !== r.family) {
|
|
1968
1968
|
let e = r.family;
|
|
1969
1969
|
const n = c;
|
|
1970
|
-
if (4 !== e && 6 !== e) {
|
|
1970
|
+
if (0 !== e && 4 !== e && 6 !== e) {
|
|
1971
1971
|
const e = { params: { allowedValues: t.properties.dts.anyOf[1].properties.consumeTypes.anyOf[1].properties.family.enum } };
|
|
1972
1972
|
null === u ? u = [e] : u.push(e), c++;
|
|
1973
1973
|
}
|
|
@@ -2799,7 +2799,11 @@ var init_ModuleFederationPlugin_check = require_runtime.__esmMin((() => {
|
|
|
2799
2799
|
}
|
|
2800
2800
|
}] },
|
|
2801
2801
|
timeout: { type: "number" },
|
|
2802
|
-
family: { enum: [
|
|
2802
|
+
family: { enum: [
|
|
2803
|
+
0,
|
|
2804
|
+
4,
|
|
2805
|
+
6
|
|
2806
|
+
] },
|
|
2803
2807
|
typesOnBuild: { type: "boolean" }
|
|
2804
2808
|
}
|
|
2805
2809
|
}] },
|