@fulgurjs/federation 4.3.0 → 4.3.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/CHANGELOG.md +6 -0
- package/README.md +9 -9
- package/dist/{chunk-FMV5BXGS.js → chunk-LU3MBKB2.js} +1 -1
- package/dist/{chunk-AD2XIMBJ.js → chunk-NOMYWDZN.js} +2 -2
- package/dist/cli.js +1 -1
- package/dist/context.cjs +5 -5
- package/dist/context.js +5 -5
- package/dist/index.cjs +74 -89
- package/dist/index.js +74 -89
- package/dist/runtime.js +22 -10
- package/dist/vue-adapter.cjs +2 -2
- package/dist/vue-adapter.js +1 -1
- package/dist/vue.cjs +68 -51
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.3.1(2026-09-26)
|
|
4
|
+
|
|
5
|
+
- 将插件自身的配置、共享依赖和远程加载诊断改为中文,保留错误码与原始底层异常;修复 `MFU-010` 将多个兼容候选版本误判为冲突的问题,真正不兼容时显示原因与修法,并对同一版本组合去重。
|
|
6
|
+
- 移除基于裸导入前缀猜测“漏配远程”的提示;它会将 `vite/modulepreload-polyfill`、`@vue/runtime-dom` 等普通依赖误报为远程配置问题。真正无法解析的导入仍由构建工具报错。
|
|
7
|
+
- 中文诊断使运行时 gzip 从 7547B 增至约 8649B;体积门禁由 8192B 调整为 9216B,仍限制无意增长。
|
|
8
|
+
|
|
3
9
|
## 4.3.0(2026-09-25)
|
|
4
10
|
|
|
5
11
|
### 修复(4.2.1 复核问题)
|
package/README.md
CHANGED
|
@@ -400,7 +400,7 @@ shared: {
|
|
|
400
400
|
}
|
|
401
401
|
```
|
|
402
402
|
|
|
403
|
-
版本裁决语义对齐 webpack:满足 requiredVersion 的最高版本胜出;已加载版本永不替换;singleton
|
|
403
|
+
版本裁决语义对齐 webpack:满足 requiredVersion 的最高版本胜出;已加载版本永不替换;singleton 收敛到唯一实例;strictVersion 冲突抛 MFU-003。`MFU-010` 仅在最终选中的单例版本不满足某个消费方的 `requiredVersion` 时告警。提示会列出候选版本、实际提供方、影响及修法;同一版本组合只提示一次。多个候选版本本身不是错误,例如 `^2.1.7` 包含 `2.3.1`,不能仅凭两个版本号不同就判定不兼容。
|
|
404
404
|
|
|
405
405
|
### 2. 运行时 API — `@fulgurjs/federation/runtime`
|
|
406
406
|
|
|
@@ -595,7 +595,7 @@ apps[] })` 形态自动识别并保持 4.1.0 行为;程序化加载 `loadRepoC
|
|
|
595
595
|
| | `MFU-007` | 预加载失败(不阻断业务) |
|
|
596
596
|
| | `MFU-008` | 未知远程 |
|
|
597
597
|
| | `MFU-009` | 加载到的模块没有任何导出 |
|
|
598
|
-
| | `MFU-010` |
|
|
598
|
+
| | `MFU-010` | 选中的共享单例版本不满足消费方要求;显示版本、提供方、影响和修法,同一组合只告警一次 |
|
|
599
599
|
| | `MFU-011` | setup 生命周期入口导出形态非法(默认导出/具名 onSession 不是函数;报实际类型/预期签名/修法) |
|
|
600
600
|
| | `MFU-012` | setup/onSession 执行抛错(该次 loadRemote 拒绝;仅清失败阶段缓存,可直接重试,已成功的阶段不重复) |
|
|
601
601
|
| | `MFU-013` | 远程声明 onSession 但宿主 AppContext 缺 sessionKey(登录代次;禁止用 token 充当) |
|
|
@@ -988,16 +988,16 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
988
988
|
所有配置问题在 `vite` 启动瞬间即报,固定三段式,可直接照抄修正:
|
|
989
989
|
|
|
990
990
|
```
|
|
991
|
-
[fulgurjs]
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
//
|
|
991
|
+
[fulgurjs] federation() 配置无效:remotes["remote-a"] 没有地址(external、dev、prod 至少填写一个)
|
|
992
|
+
当前值:{"dev":""}
|
|
993
|
+
预期值:至少一个地址;只填一个地址时开发与生产共用
|
|
994
|
+
修法示例:remotes: { 'remote-a': 'http://localhost:5101' }
|
|
995
|
+
// 或分别填写:{ 'remote-a': { dev: 'http://localhost:5101', prod: '/remote-a' } }
|
|
996
996
|
```
|
|
997
997
|
|
|
998
998
|
运行时加载失败同样给排查指引(remote dev server 未启动 / 地址配错 / CORS / NGINX 回退),并携带统一错误码:
|
|
999
999
|
|
|
1000
|
-
统一错误码体系(CFG/DEV/BLD/MFU/CC 五段共 41 个)——**完整总表见上方 [API 参考 §6](#6-错误码总表41-个)
|
|
1000
|
+
统一错误码体系(CFG/DEV/BLD/MFU/CC 五段共 41 个)——**完整总表见上方 [API 参考 §6](#6-错误码总表41-个)**。插件自身的诊断文案使用中文,保留 API 名、配置键、版本号及第三方底层异常原文,以便定位问题。`MFU-010` 只表示实际复用的单例版本不满足消费方要求;多个兼容版本共存不会触发该告警。浏览器中来自 qiankun/single-spa、vue-i18n 等第三方的告警不由 fulgurjs 生成,应按各自来源排查。
|
|
1001
1001
|
|
|
1002
1002
|
调试出口:`window.__FULGURJS_SCOPE__`(share 协商实时结果)、`window.__FULGURJS_INFO__`(remote 状态/耗时/错误)。
|
|
1003
1003
|
|
|
@@ -1023,7 +1023,7 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
1023
1023
|
pnpm --dir packages/plugin install && pnpm --dir packages/plugin build
|
|
1024
1024
|
for app in fixtures/host-vue fixtures/remote-a fixtures/remote-b e2e; do pnpm --dir "$app" install; done
|
|
1025
1025
|
|
|
1026
|
-
pnpm test:unit #
|
|
1026
|
+
pnpm test:unit # 单测(当前 385)
|
|
1027
1027
|
pnpm test:dev # dev e2e(10)
|
|
1028
1028
|
pnpm test:prod # prod e2e(8,需 NGINX,见 e2e/scripts/prod-setup.sh)
|
|
1029
1029
|
pnpm test # unit + dev + prod 全跑
|
|
@@ -53,7 +53,7 @@ function createHostPages(options, load) {
|
|
|
53
53
|
if (route.startsWith(prefix) || `${route}/` === prefix) return name;
|
|
54
54
|
}
|
|
55
55
|
throw new Error(
|
|
56
|
-
`[fulgurjs]
|
|
56
|
+
`[fulgurjs] \u9875\u9762\u8DEF\u7531 "${route}" \u672A\u5339\u914D\u4EFB\u4F55 remotePrefixes\uFF1A{ ${Object.entries(remotePrefixes).map(([k, v]) => `'${k}': '${v}'`).join(", ")} }
|
|
57
57
|
\u6839\u56E0: \u9875\u9762\u8868\u6761\u76EE\u7684\u8DEF\u7531\u4E0D\u5728\u4EFB\u4F55\u5DF2\u58F0\u660E\u7684\u8FDC\u7A0B\u524D\u7F00\u4E0B\u3002
|
|
58
58
|
\u4FEE\u6CD5: \u5728 remotePrefixes \u8865\u5145\u8BE5\u8DEF\u7531\u524D\u7F00 \u2192 \u8FDC\u7A0B\u540D\u7684\u6620\u5C04\uFF0C\u6216\u4FEE\u6B63\u9875\u9762\u8868 route\u3002`
|
|
59
59
|
);
|
|
@@ -115,7 +115,7 @@ function createHostPages(options, load) {
|
|
|
115
115
|
const inner = mod?.default ?? mod;
|
|
116
116
|
if (!inner) {
|
|
117
117
|
throw new Error(
|
|
118
|
-
`[fulgurjs]
|
|
118
|
+
`[fulgurjs] \u8FDC\u7A0B\u6A21\u5757 "${spec}" \u6CA1\u6709\u5BFC\u51FA\u53EF\u6E32\u67D3\u7EC4\u4EF6\uFF1B\u5F53\u524D\u503C\u7C7B\u578B\u4E3A ${inner === null ? "null" : typeof inner}\u3002
|
|
119
119
|
\u4FEE\u6CD5: \u6838\u5BF9\u8FDC\u7A0B exposes \u952E\u540D\u4E0E\u9875\u9762\u8868 spec \u662F\u5426\u4E00\u81F4\uFF08MFU-006 \u8BED\u4E49\uFF09`
|
|
120
120
|
);
|
|
121
121
|
}
|
package/dist/cli.js
CHANGED
|
@@ -448,7 +448,7 @@ async function loadAppConfig(configPath) {
|
|
|
448
448
|
build.onResolve({ filter: /^@fulgurjs\/federation(\/|$)/ }, (args) => {
|
|
449
449
|
const resolved = resolveSelfEntry(abs, args.path);
|
|
450
450
|
if (!resolved) {
|
|
451
|
-
return { errors: [{ text:
|
|
451
|
+
return { errors: [{ text: `\u65E0\u6CD5\u4ECE\u914D\u7F6E\u9879\u76EE\u6216 CLI \u81EA\u8EAB\u89E3\u6790 "${args.path}"\uFF1B\u8BF7\u5148\u5728\u5F53\u524D\u9879\u76EE\u5B89\u88C5 @fulgurjs/federation` }] };
|
|
452
452
|
}
|
|
453
453
|
return { path: resolved };
|
|
454
454
|
});
|
package/dist/context.cjs
CHANGED
|
@@ -53,7 +53,7 @@ function requireRuntime() {
|
|
|
53
53
|
if (!rt || typeof rt.loadRemote !== "function") {
|
|
54
54
|
throw new FgError(
|
|
55
55
|
ContextErrorCodes.CONTEXT_NO_RUNTIME,
|
|
56
|
-
"fulgurjs
|
|
56
|
+
"\u73B0\u8C61\uFF1A\u5F53\u524D\u9875\u9762\u627E\u4E0D\u5230 fulgurjs \u8FD0\u884C\u65F6\u5355\u4F8B\uFF08globalThis.__FULGURJS_RUNTIME__ \u672A\u5B9A\u4E49\uFF09\u3002\n \u6839\u56E0: \u5F53\u524D\u9875\u9762\u6CA1\u6709\u7ECF\u5BBF\u4E3B\u7684\u8054\u90A6\u8FD0\u884C\u65F6\u52A0\u8F7D\uFF08\u72EC\u7ACB\u76F4\u5F00\u8FDC\u7A0B\u9875\uFF0C\u6216\u5BBF\u4E3B\u6865\u665A\u4E8E\u672C\u8C03\u7528\u6267\u884C\uFF09\u3002\n \u4FEE\u6CD5: \u2460 \u4ECE\u5BBF\u4E3B\u5E94\u7528\u7684\u8054\u90A6\u8DEF\u7531\u6253\u5F00\u672C\u9875\u9762\uFF08\u5BBF\u4E3B\u6865\u4F1A\u5148\u52A0\u8F7D\u8FD0\u884C\u65F6\u5E76\u63D0\u4F9B context\uFF09\uFF1B\n \u2461 \u82E5\u4F60\u662F\u5BBF\u4E3B\u6865\u4F5C\u8005\uFF1A\u628A provideAppContext \u653E\u5728\u6865\u521D\u59CB\u5316\u5C3E\u90E8\uFF08\u65F6\u5E8F\u5951\u7EA6 bridge \u2192 \u8FDC\u7A0B setup \u2192 \u9875\u9762\u6A21\u5757\uFF09\u3002",
|
|
57
57
|
{ runtime: false }
|
|
58
58
|
);
|
|
59
59
|
}
|
|
@@ -83,10 +83,10 @@ function requireAppContext(...keys) {
|
|
|
83
83
|
const got = Object.keys(ctx);
|
|
84
84
|
const err = new FgError(
|
|
85
85
|
ContextErrorCodes.CONTEXT_MISSING_KEY,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
`\u73B0\u8C61\uFF1AAppContext \u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5 ${missing.map((k) => `"${k}"`).join("\u3001")}\u3002
|
|
87
|
+
\u5F53\u524D\u5B57\u6BB5\uFF1A${got.length ? got.map((k) => `"${k}"`).join("\u3001") : "\u7A7A\uFF08\u5BBF\u4E3B\u6865\u53EF\u80FD\u5C1A\u672A\u8C03\u7528 provideAppContext\uFF09"}\u3002
|
|
88
|
+
\u9884\u671F\uFF1A\u5BBF\u4E3B\u6865\u5E94\u5728\u8FDC\u7A0B\u9875\u9762\u52A0\u8F7D\u524D\u63D0\u4F9B ${missing.map((k) => `"${k}"`).join("\u3001")}\u3002
|
|
89
|
+
\u793A\u4F8B\uFF1Ahost/src/fulgurjs/host/bridge.ts \u2192 provideAppContext({ ${keys.join(", ")}, ... })
|
|
90
90
|
\u4FEE\u6CD5: \u68C0\u67E5\u5BBF\u4E3B\u5E94\u7528\u7684 fulgurjs \u6865\u662F\u5426\u5728 loadRemote \u9875\u9762\u524D\u5B8C\u6210 context provide\uFF08\u65F6\u5E8F\u5951\u7EA6 bridge \u2192 \u8FDC\u7A0B setup \u2192 \u9875\u9762\u6A21\u5757\uFF09`,
|
|
91
91
|
{ missing, got }
|
|
92
92
|
);
|
package/dist/context.js
CHANGED
|
@@ -15,7 +15,7 @@ function requireRuntime() {
|
|
|
15
15
|
if (!rt || typeof rt.loadRemote !== "function") {
|
|
16
16
|
throw new FgError(
|
|
17
17
|
ContextErrorCodes.CONTEXT_NO_RUNTIME,
|
|
18
|
-
"fulgurjs
|
|
18
|
+
"\u73B0\u8C61\uFF1A\u5F53\u524D\u9875\u9762\u627E\u4E0D\u5230 fulgurjs \u8FD0\u884C\u65F6\u5355\u4F8B\uFF08globalThis.__FULGURJS_RUNTIME__ \u672A\u5B9A\u4E49\uFF09\u3002\n \u6839\u56E0: \u5F53\u524D\u9875\u9762\u6CA1\u6709\u7ECF\u5BBF\u4E3B\u7684\u8054\u90A6\u8FD0\u884C\u65F6\u52A0\u8F7D\uFF08\u72EC\u7ACB\u76F4\u5F00\u8FDC\u7A0B\u9875\uFF0C\u6216\u5BBF\u4E3B\u6865\u665A\u4E8E\u672C\u8C03\u7528\u6267\u884C\uFF09\u3002\n \u4FEE\u6CD5: \u2460 \u4ECE\u5BBF\u4E3B\u5E94\u7528\u7684\u8054\u90A6\u8DEF\u7531\u6253\u5F00\u672C\u9875\u9762\uFF08\u5BBF\u4E3B\u6865\u4F1A\u5148\u52A0\u8F7D\u8FD0\u884C\u65F6\u5E76\u63D0\u4F9B context\uFF09\uFF1B\n \u2461 \u82E5\u4F60\u662F\u5BBF\u4E3B\u6865\u4F5C\u8005\uFF1A\u628A provideAppContext \u653E\u5728\u6865\u521D\u59CB\u5316\u5C3E\u90E8\uFF08\u65F6\u5E8F\u5951\u7EA6 bridge \u2192 \u8FDC\u7A0B setup \u2192 \u9875\u9762\u6A21\u5757\uFF09\u3002",
|
|
19
19
|
{ runtime: false }
|
|
20
20
|
);
|
|
21
21
|
}
|
|
@@ -45,10 +45,10 @@ function requireAppContext(...keys) {
|
|
|
45
45
|
const got = Object.keys(ctx);
|
|
46
46
|
const err = new FgError(
|
|
47
47
|
ContextErrorCodes.CONTEXT_MISSING_KEY,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
`\u73B0\u8C61\uFF1AAppContext \u7F3A\u5C11\u5FC5\u9700\u5B57\u6BB5 ${missing.map((k) => `"${k}"`).join("\u3001")}\u3002
|
|
49
|
+
\u5F53\u524D\u5B57\u6BB5\uFF1A${got.length ? got.map((k) => `"${k}"`).join("\u3001") : "\u7A7A\uFF08\u5BBF\u4E3B\u6865\u53EF\u80FD\u5C1A\u672A\u8C03\u7528 provideAppContext\uFF09"}\u3002
|
|
50
|
+
\u9884\u671F\uFF1A\u5BBF\u4E3B\u6865\u5E94\u5728\u8FDC\u7A0B\u9875\u9762\u52A0\u8F7D\u524D\u63D0\u4F9B ${missing.map((k) => `"${k}"`).join("\u3001")}\u3002
|
|
51
|
+
\u793A\u4F8B\uFF1Ahost/src/fulgurjs/host/bridge.ts \u2192 provideAppContext({ ${keys.join(", ")}, ... })
|
|
52
52
|
\u4FEE\u6CD5: \u68C0\u67E5\u5BBF\u4E3B\u5E94\u7528\u7684 fulgurjs \u6865\u662F\u5426\u5728 loadRemote \u9875\u9762\u524D\u5B8C\u6210 context provide\uFF08\u65F6\u5E8F\u5951\u7EA6 bridge \u2192 \u8FDC\u7A0B setup \u2192 \u9875\u9762\u6A21\u5757\uFF09`,
|
|
53
53
|
{ missing, got }
|
|
54
54
|
);
|