@fulgurjs/federation 0.4.2 → 0.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/CHANGELOG.md +30 -7
- package/DESIGN.md +8 -8
- package/README.md +55 -55
- package/dist/cli.js +43 -43
- package/dist/config.cjs +13 -13
- package/dist/config.d.cts +20 -20
- package/dist/config.d.ts +20 -20
- package/dist/config.js +11 -11
- package/dist/index.cjs +524 -518
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +524 -518
- package/dist/pages.cjs +9 -9
- package/dist/pages.d.cts +7 -7
- package/dist/pages.d.ts +7 -7
- package/dist/pages.js +7 -7
- package/dist/runtime.js +2 -2
- package/docs/manual.html +23 -23
- package/docs/webpack-mf-/345/257/271/347/205/247/344/270/216/347/274/272/345/217/243.md +1 -1
- package/docs//346/262/231/347/256/261/350/276/271/347/225/214/345/256/241/350/256/241.md +1 -1
- package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +8 -8
- package/examples/fulgur.config.example.ts +4 -4
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.1(2026-09-19)
|
|
4
|
+
|
|
5
|
+
### 修复
|
|
6
|
+
|
|
7
|
+
- **宿主页面「虚拟运行时导入 + 远程动态导入」混用漏改写(真实 npm 用户验证轮发现)**:post 阶段防双重生成守卫原先按「代码含 `virtual:fulgurjs-runtime` 字样」一刀切跳过,导致同一文件里合法导入 `loadRemote`(README §2 标准用法)后再写 `import('remote-a/X')`(README §1 标准用法)时远程导入漏改写,dev 下 vite:import-analysis 直接 500。现改为按插件生成物特征精确判定(代理化导入 `virtual:fulgurjs-runtime-proxy` / 改写助手 `__fulgurjs_loadRemote`·`__fulgurjs_loadShare` / 构建入口注入标识 `/* fulgurjs:init */`),用户混用照常工作;补 4 组单测(157/157)。
|
|
8
|
+
|
|
9
|
+
### 变更(发布面)
|
|
10
|
+
|
|
11
|
+
- **README 双端导航统一**:README 内 8 处文档相对链接(manual.html×4 / 迁移指南 / webpack MF 对照 / 沙箱边界审计 / DESIGN)改为 GitHub 绝对 URL——npm 页面与 GitHub 点击行为一致(npm 不解析包内相对链接,此前在 npm 上全部 404)。
|
|
12
|
+
|
|
13
|
+
## 0.5.0(2026-09-19)
|
|
14
|
+
|
|
15
|
+
### 变更(品牌全面对齐,breaking)
|
|
16
|
+
|
|
17
|
+
- 全品牌从 `fulgur` 对齐为 **`fulgurjs`**(npm 上 fulgur 组织名被占用):
|
|
18
|
+
- CLI 命令:`fulgur` → **`fulgurjs`**(`npx fulgurjs init` / `npx fulgurjs doctor`)
|
|
19
|
+
- 虚拟模块:`virtual:fulgur-runtime` → **`virtual:fulgurjs-runtime`**(代理模块同步更名)
|
|
20
|
+
- 全局单例:`__FULGUR_RUNTIME__` → **`__FULGURJS_RUNTIME__`**(`__FULGURJS_APP_CONFIG__` / `__FULGURJS_SCOPE__` / `__FULGURJS_INFO__` 同步)
|
|
21
|
+
- 产物文件名:`fulgur-remoteEntry.js` / `fulgur-manifest.json` → **`fulgurjs-remoteEntry.js`** / **`fulgurjs-manifest.json`**(NGINX 规则同步更名)
|
|
22
|
+
- 配置文件:`fulgur.config.ts` → **`fulgurjs.config.ts`**;错误前缀 `[fulgur:*]` → `[fulgurjs:*]`;运行时事件 `fulgur:error` → `fulgurjs:error`
|
|
23
|
+
- GitHub 仓库:**fulgurjs-federation**(旧地址自动重定向)
|
|
24
|
+
- 升级方式:0.4.x 用户全局替换 `fulgur` → `fulgurjs`(导入/全局名/NGINX 文件名/CLI 命令)即可。
|
|
25
|
+
|
|
3
26
|
## 0.4.2(2026-09-19)
|
|
4
27
|
|
|
5
28
|
### 修复(npm 发布面)
|
|
@@ -13,7 +36,7 @@
|
|
|
13
36
|
|
|
14
37
|
### 变更(规则自动化)
|
|
15
38
|
|
|
16
|
-
- **任何文件都可以直接 `import { ... } from 'virtual:
|
|
39
|
+
- **任何文件都可以直接 `import { ... } from 'virtual:fulgurjs-runtime'`**(原 DEV-008 规则自动化):
|
|
17
40
|
exposes 目标文件(远程页面)里的静态导入,dev 下由插件自动改写为惰性单例委托模块
|
|
18
41
|
(求值期零副作用、调用期转发页面级运行时单例)。用户不再需要知道
|
|
19
42
|
「宿主/远程页面取运行时的不同姿势」,0.4.0 的手工 globalThis 写法已无需使用。
|
|
@@ -22,22 +45,22 @@
|
|
|
22
45
|
|
|
23
46
|
### 修复
|
|
24
47
|
|
|
25
|
-
- runtime 两个存量 TS 断言错误(as Error → as
|
|
48
|
+
- runtime 两个存量 TS 断言错误(as Error → as FulgurjsError)与 fallback 源码契约断言同步。
|
|
26
49
|
|
|
27
50
|
## 0.4.0(2026-09-18)
|
|
28
51
|
|
|
29
52
|
开箱即用批次(A→E)全部落地;W7 发布链按用户指示顺延(未发布 npm)。
|
|
30
53
|
|
|
31
54
|
### 新增
|
|
32
|
-
- **CLI(主包内置 bin `
|
|
33
|
-
- `
|
|
55
|
+
- **CLI(主包内置 bin `fulgurjs`)**
|
|
56
|
+
- `fulgurjs init`:起步模板(带注释的 `fulgurjs.config.ts`:宿主/远程/页面路由表/部署形态,
|
|
34
57
|
单文件可入库可复跑)+ 配置校验(CFG 三段式报错)+ 输出可直接粘贴的样板
|
|
35
58
|
(各应用 federation() vite 块、NGINX no-cache 站点模板、通用接入核对清单);
|
|
36
59
|
**项目无关**——不内置任何具体项目的模板、锚点或文件改写
|
|
37
|
-
- `
|
|
60
|
+
- `fulgurjs doctor`:部署面体检——remoteEntry/manifest/index.html 的 200/no-cache/JS 形态、
|
|
38
61
|
CORS、chunk 抽样可达(含 index.html 引用与一跳下钻、200-HTML 回退伪装识别)、
|
|
39
62
|
版本协商 skew 预演、`--dev` 模式端口/容器入口探测;`--json` 供 CI
|
|
40
|
-
- **W4 跨应用全局配置协商**:runtime 新增 `
|
|
63
|
+
- **W4 跨应用全局配置协商**:runtime 新增 `provideFulgurjsAppConfig` / `getFulgurjsAppConfig`
|
|
41
64
|
(页面级单例、浅合并、globalThis 镜像)——EP locale/size 类跨副本配置的机制化收编
|
|
42
65
|
- **W5 诊断补码**:CFG-007(remotes 对象形式误用 name@ 前缀)、CFG-008(shared 非法组合)、
|
|
43
66
|
DEV-010(dev 冷启动预构建窗口提示);BLD-003 必填 props 扫描器(按实测降级为手册核对项)
|
|
@@ -51,6 +74,6 @@
|
|
|
51
74
|
|
|
52
75
|
### 变更
|
|
53
76
|
- **插件去项目化(2026-09-19 定调)**:移除 init 中曾内置的具体项目集成模板/锚点/补丁
|
|
54
|
-
(历史实现见 git 历史);`
|
|
77
|
+
(历史实现见 git 历史);`fulgurjs init` 重写为纯通用脚手架,配置 schema 同步精简。
|
|
55
78
|
插件为所有项目服务,不做任何单一项目的形状。
|
|
56
79
|
- runtime gzip 5212 B(红线 ≤5250 内);单测 148/148;错误码 30 个全量文档对齐
|
package/DESIGN.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @fulgurjs/federation 设计方案 v0.2(全量对齐 Webpack MF 版)
|
|
2
2
|
|
|
3
|
-
> **品牌**:
|
|
3
|
+
> **品牌**:fulgurjs,拉丁语「闪电 · 辉光」,取自作者名中「烨」字的意译。
|
|
4
4
|
> 系列规划:`@fulgurjs/federation`(模块联邦)→ `@fulgurjs/micro`、`@fulgurjs/dts` …
|
|
5
|
-
> 内外命名统一 `
|
|
5
|
+
> 内外命名统一 `fulgurjs`(`virtual:fulgurjs-*` 虚拟模块、`window.__FULGURJS_*` 调试出口、`FulgurjsError` / MFU 错误码)。
|
|
6
6
|
|
|
7
7
|
> 状态:已实现并验证(2026-09-13)。测试结果:单测 76/76、fixtures dev e2e 10/10、容错/HMR-L3 2/2、fixtures prod e2e 8/8(隔离 NGINX 8999)、testbed dev 实测全通、testbed prod(本地 NGINX 测试站点)最小宿主消费真实远程产物实测通过;runtime gzip 4.4KB。已知问题见手册 §7。
|
|
8
8
|
> 日期:2026-09-12
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
|
|
31
31
|
### 2A. 核心配置(webpack 官方文档全部选项)
|
|
32
32
|
|
|
33
|
-
| # | webpack 选项 |
|
|
33
|
+
| # | webpack 选项 | fulgurjs | 实现方式与语义说明 |
|
|
34
34
|
|---|---|---|---|
|
|
35
35
|
| 1 | `name` | ✅ | 容器名;同时作为 uniqueName 决胜来源。重名冲突构建期检测并警告(对齐 webpack 对 `output.uniqueName` 的要求) |
|
|
36
36
|
| 2 | `filename` | ✅ | remoteEntry 文件名,稳定命名,利于 CDN 长缓存 |
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
### 2B. 运行时行为语义("效果一模一样"的实体,逐条 e2e 验收)
|
|
52
52
|
|
|
53
|
-
| # | webpack 行为 |
|
|
53
|
+
| # | webpack 行为 | fulgurjs 验收语义 |
|
|
54
54
|
|---|---|---|
|
|
55
55
|
| 1 | 版本协商:消费方拿到 scope 中**满足其 requiredVersion 的最高版本** | e2e 断言双版本场景加载的是高版本 |
|
|
56
56
|
| 2 | 多版本共存(非 singleton、不同 requiredVersion 可并存) | e2e 断言两版本模块图并存且各自正常 |
|
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
| 15 | 静态 remote 自动加载;加载失败 → 等价 `ScriptExternalLoadError` 的统一错误码(MFU-0xx 体系) | e2e:kill remote 断言错误码 + UI 错误边界 |
|
|
70
70
|
| 16 | `import('app1/Button')` 语法 + default/named unwrap 语义 | 所有用例的基础断言 |
|
|
71
71
|
| 17 | exposed 模块的样式自动随模块注入(dev / prod 都生效) | e2e:远程组件样式生效断言 |
|
|
72
|
-
| 18 | 异步边界:
|
|
72
|
+
| 18 | 异步边界:fulgurjs **自动注入**(等效 `automaticAsyncBoundary: true` 默认开启),用户不需要 webpack 的 bootstrap.js 手工模式;提供开关可关 | e2e:不写 bootstrap 直接跑通 |
|
|
73
73
|
|
|
74
74
|
### 2C. MF 2.0 / @module-federation/enhanced 配置
|
|
75
75
|
|
|
76
|
-
| # | 选项 |
|
|
76
|
+
| # | 选项 | fulgurjs | 说明 |
|
|
77
77
|
|---|---|---|---|
|
|
78
78
|
| 1 | `manifest` | ✅ | `mf-manifest.json`(资源清单 + 版本 + 公共路径),部署回滚 = 切 manifest 指针 |
|
|
79
79
|
| 2 | `runtimePlugins` | ✅ | runtime 钩子 API(init / get / loadShare 前后钩子) |
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
|
|
85
85
|
## 3. 比 webpack 更进一步的点
|
|
86
86
|
|
|
87
|
-
1. **自动异步边界**——webpack 要求手工 `import('./bootstrap')`,
|
|
87
|
+
1. **自动异步边界**——webpack 要求手工 `import('./bootstrap')`,fulgurjs 自动注入,配置零改动
|
|
88
88
|
2. **类型直连**——dev 下 remote 的补全与跳转是真源码级(webpack 需要额外 dts 工具链折腾)
|
|
89
89
|
3. **runtime 内核 gzip < 5KB**(CI 硬指标,对比 @module-federation/runtime 的 40KB+)
|
|
90
90
|
4. **一套配置 dev/prod 自动切换**——webpack 的 dev/prod 配置经常分裂两份
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
|
|
93
93
|
## 4. HMR 对齐承诺(dev 体验)
|
|
94
94
|
|
|
95
|
-
webpack 里 remote 模块 HMR 天然可用(同一构建系统)。
|
|
95
|
+
webpack 里 remote 模块 HMR 天然可用(同一构建系统)。fulgurjs 通过 host↔remote 双 dev-server HMR 桥对齐,分三档自动化验收:
|
|
96
96
|
|
|
97
97
|
- L1 组件热替换成功(页面不整页刷新)
|
|
98
98
|
- L2 状态保留(组件热替换后 local state 不丢,对齐 vue HMR 行为)
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @fulgurjs/federation
|
|
2
2
|
|
|
3
|
-
> **
|
|
3
|
+
> **fulgurjs** — 拉丁语「闪电 · 辉光」。
|
|
4
4
|
> 一个把 Vite 模块联邦做到开箱即用的插件:**一套配置,dev / prod 双引擎,语义对齐 Webpack Module Federation**。
|
|
5
5
|
|
|
6
6
|
  
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
- **exposes / remotes / shared 全语义**:`name@url` 语法、键重命名、promise-based remote、semver 全语法 requiredVersion、版本协商(最高版本胜出)、singleton / strictVersion、已加载版本永不替换、多版本共存、shareKey 重定向、多 shareScope
|
|
27
27
|
- **UMD / CJS-only 依赖开箱即用**:element-plus、avue 等只有 UMD/CJS 产物的依赖直接进 `optimizeDeps.include` 即可——dev 期插件自动把预构建产物内的 shared 键改道协商门面;build 期自动把 CJS `require(<shared>)` 重定向到垫片,双运行时免疫
|
|
28
28
|
- **自动异步边界**:top-level await 自动注入(es2022+),无需 webpack 式手工 `import('./bootstrap')`
|
|
29
|
-
- **稳定产物**:remoteEntry 固定文件名利于 CDN 长缓存;`
|
|
29
|
+
- **稳定产物**:remoteEntry 固定文件名利于 CDN 长缓存;`fulgurjs-manifest.json` 资源清单;expose 独立 chunk
|
|
30
30
|
- **容错(对齐 webpack MF 2.0 errorLoadRemote)**:加载重试 / 熔断 / 超时内置;`loadRemote(spec, { retries, fallbackModule })` 单次调用级覆盖——失败时返回 fallback 模块,错误事件仍显式发出(**绝不静默兜底**,不传则照旧抛错)
|
|
31
31
|
- **增强能力**:dts 类型直连(dev 补全直达 remote 源码)、`preloadRemote()` manifest 驱动精确预载、runtimePlugins 钩子
|
|
32
32
|
- **HMR 全链路**:remote 改动 → host 页面热更,L1 组件热替换 / L2 状态保留 / L3 错误覆盖与恢复
|
|
33
33
|
- **零报错纪律**:配置问题启动瞬间三段式报错;联邦失败显式抛错(错误码 + 可执行修复建议),**无任何静默兜底路径**
|
|
34
|
-
- **CLI(主包内置 bin)**:`
|
|
35
|
-
- **跨应用全局配置协商(W4)**:`
|
|
34
|
+
- **CLI(主包内置 bin)**:`fulgurjs init`——`fulgurjs.config.ts` 单配置驱动的迁移生成器(模板 = 真实工程验证形态:vite 配置/路由表/桥/联邦启动器/NGINX conf 全量编码,锚点补丁幂等可续跑);`fulgurjs doctor`——部署面体检(remoteEntry/manifest/HTML 缓存头与形态、CORS、chunk 抽样可达、版本 skew 预演、`--dev` 端口探测)
|
|
35
|
+
- **跨应用全局配置协商(W4)**:`provideFulgurjsAppConfig({ locale, size, ... })` 一次写入运行时页面级单例,各远程副本经 `getFulgurjsAppConfig()` 消费注入(EP locale/size 类问题的机制化收编)
|
|
36
36
|
- **全链路错误码体系(30 码)**:CFG/DEV/BLD/MFU 四段 + 手册 §8 码表防漂移校验
|
|
37
37
|
|
|
38
38
|
## 安装
|
|
@@ -97,7 +97,7 @@ export default defineConfig({
|
|
|
97
97
|
import Button from 'remote-a/Button'
|
|
98
98
|
|
|
99
99
|
// 动态导入 / 运行时 API
|
|
100
|
-
import { loadRemote, registerRemote, preloadRemote } from 'virtual:
|
|
100
|
+
import { loadRemote, registerRemote, preloadRemote } from 'virtual:fulgurjs-runtime'
|
|
101
101
|
|
|
102
102
|
const Chart = defineAsyncComponent(() => loadRemote('remote-a/Chart').then(m => m.default))
|
|
103
103
|
|
|
@@ -114,26 +114,26 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
114
114
|
```
|
|
115
115
|
|
|
116
116
|
> **在任何文件都可以直接这样导入**——包括 exposes 目标文件(远程页面)。插件会自动把远程页面里的
|
|
117
|
-
> 该导入改写为惰性单例委托(0.4.1 起,原 0.4.0 要求手工改用 `globalThis.
|
|
117
|
+
> 该导入改写为惰性单例委托(0.4.1 起,原 0.4.0 要求手工改用 `globalThis.__FULGURJS_RUNTIME__` 的规则已废除),
|
|
118
118
|
> 求值期零副作用、调用期自动转发页面级运行时单例,无需关心宿主/远程的区别。
|
|
119
119
|
|
|
120
120
|
> 以上只是最小面。**全部选项(remotes 四形态/shared 九个开关/dts/runtimePlugins…)、运行时 API、CLI、错误码见下方 [API 参考](#api-参考)。**
|
|
121
121
|
|
|
122
|
-
**没有别的步骤了。** dev 下 remote 跑它自己的 `vite dev`(容器入口 `/@
|
|
122
|
+
**没有别的步骤了。** dev 下 remote 跑它自己的 `vite dev`(容器入口 `/@fulgurjs-entry.js` 由插件中间件直出);build 下 expose 自动拆独立 chunk、shared 自动剥离——同一份配置两端通用。
|
|
123
123
|
|
|
124
124
|
## CLI:init 起步模板 + doctor 部署体检
|
|
125
125
|
|
|
126
126
|
```bash
|
|
127
|
-
# 1) 生成带注释的
|
|
128
|
-
npx
|
|
129
|
-
# 样例:examples/
|
|
127
|
+
# 1) 生成带注释的 fulgurjs.config.ts 起步模板(宿主/远程/页面路由表/部署形态,单文件可入库)
|
|
128
|
+
npx fulgurjs init # 已存在则拒绝,--force 覆盖
|
|
129
|
+
# 样例:examples/fulgurjs.config.example.ts(通用字段示例)
|
|
130
130
|
|
|
131
131
|
# 2) 校验配置并输出可直接粘贴的样板:各应用 federation() 块、NGINX no-cache 站点模板、接入核对清单
|
|
132
|
-
npx
|
|
132
|
+
npx fulgurjs init --config fulgurjs.config.ts
|
|
133
133
|
|
|
134
134
|
# 3) 部署体检(CI 可嵌):缓存头/资源形态/CORS/chunk 可达/版本 skew
|
|
135
|
-
npx
|
|
136
|
-
npx
|
|
135
|
+
npx fulgurjs doctor --base http://your-site --apps app-a,app-b
|
|
136
|
+
npx fulgurjs doctor --base http://localhost:5173 --apps app-a --dev
|
|
137
137
|
```
|
|
138
138
|
|
|
139
139
|
**插件保持项目无关**:init 不改写任何项目文件,不内置任何具体项目的模板或补丁;权限路由、
|
|
@@ -141,7 +141,7 @@ npx fulgur doctor --base http://localhost:5173 --apps app-a --dev
|
|
|
141
141
|
|
|
142
142
|
## API 参考
|
|
143
143
|
|
|
144
|
-
以下覆盖插件的全部公开 API,签名与默认值与源码一致;完整语义细节与实测截图见 [`docs/manual.html`](
|
|
144
|
+
以下覆盖插件的全部公开 API,签名与默认值与源码一致;完整语义细节与实测截图见 [`docs/manual.html`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/manual.html)。
|
|
145
145
|
|
|
146
146
|
### 1. `federation(options)` — Vite 插件(宿主/远程同一份 API)
|
|
147
147
|
|
|
@@ -154,7 +154,7 @@ import { federation } from '@fulgurjs/federation'
|
|
|
154
154
|
| 选项 | 类型 | 默认 | 说明 |
|
|
155
155
|
|---|---|---|---|
|
|
156
156
|
| `name` | `string` **必填** | — | 容器名。同页面宿主/远程必须唯一(也是 uniqueName);须匹配 `/^[a-zA-Z][\w.-]*$/` |
|
|
157
|
-
| `filename` | `string` | `'
|
|
157
|
+
| `filename` | `string` | `'fulgurjs-remoteEntry.js'` | prod 容器入口文件名(固定文件名,CDN 可长缓存) |
|
|
158
158
|
| `exposes` | `Record<string, string \| { import: string; name?: string }>` | — | 对外暴露模块:键 `'./X'`,值源文件路径;`name` 为稳定 chunk 文件名 |
|
|
159
159
|
| `remotes` | `Record<string, string \| RemoteConfig \| (() => Promise<any>)>` | — | 消费的远程,三种形态见下表 |
|
|
160
160
|
| `shared` | `string[] \| Record<string, string \| SharedHint>` | — | 共享依赖;字符串简写 = requiredVersion(缺省从本应用 package.json 推断) |
|
|
@@ -163,7 +163,7 @@ import { federation } from '@fulgurjs/federation'
|
|
|
163
163
|
| `library` | `{ type?: string }` | — | 仅接受 esm/module(webpack 宿主 interop 尚未支持,告警) |
|
|
164
164
|
| `runtime` | `string \| false` | 内置运行时 | 自定义运行时模块路径;`false` 禁用内置运行时 |
|
|
165
165
|
| `runtimeChunk` | `boolean \| 'single'` | — | 运行时是否拆独立 chunk |
|
|
166
|
-
| `manifest` | `boolean` | `true` | prod 构建生成 `
|
|
166
|
+
| `manifest` | `boolean` | `true` | prod 构建生成 `fulgurjs-manifest.json`(preloadRemote 依赖它) |
|
|
167
167
|
| `runtimePlugins` | `string[]` | `[]` | 运行时插件模块路径列表(写法见「运行时插件」) |
|
|
168
168
|
| `dts` | `boolean \| { dir?: string }` | `true` | dev 下拉取远程 manifest 生成类型声明——宿主写 `import X from 'remote-a/X'` 补全直达远程源码 |
|
|
169
169
|
| `devSharedSelf` | `boolean` | 纯远程 `true`;有 `remotes` 的宿主 `false` | dev 下自身源码(含依赖)是否参与 shared 协商改写。**双向联邦**(既 expose 又消费 remote)的宿主/远程需显式 `true`,否则 prod 双 vue 实例 |
|
|
@@ -175,7 +175,7 @@ import { federation } from '@fulgurjs/federation'
|
|
|
175
175
|
|
|
176
176
|
```ts
|
|
177
177
|
remotes: {
|
|
178
|
-
// ① 字符串单地址:dev 自动拼 /@
|
|
178
|
+
// ① 字符串单地址:dev 自动拼 /@fulgurjs-entry.js,prod 自动拼 filename
|
|
179
179
|
'remote-a': 'http://localhost:5101',
|
|
180
180
|
// ② '自报名@url':重命名语义(仅字符串形式支持;对象形式不支持 name@,配置期即报 CFG-007)
|
|
181
181
|
'checkout': 'shop@http://localhost:5102',
|
|
@@ -217,16 +217,16 @@ shared: {
|
|
|
217
217
|
|
|
218
218
|
版本裁决语义对齐 webpack:满足 requiredVersion 的最高版本胜出;已加载版本永不替换;singleton 收敛到唯一实例(skew 告警 MFU-010);strictVersion 不满足抛 MFU-003。
|
|
219
219
|
|
|
220
|
-
### 2. 运行时 API — `virtual:
|
|
220
|
+
### 2. 运行时 API — `virtual:fulgurjs-runtime`
|
|
221
221
|
|
|
222
222
|
**任何文件都直接静态导入**——宿主页面、exposes 目标文件(远程页面)都一样,插件自动保证同一页面只有一个运行时实例(远程页面里的导入会被自动改写为惰性单例委托,0.4.1 起):
|
|
223
223
|
|
|
224
224
|
```ts
|
|
225
225
|
// 宿主页面、远程页面,写法完全一致
|
|
226
|
-
import { loadRemote,
|
|
226
|
+
import { loadRemote, provideFulgurjsAppConfig } from 'virtual:fulgurjs-runtime'
|
|
227
227
|
```
|
|
228
228
|
|
|
229
|
-
> 仍可绕过代理直取全局单例(等价,调试用):`(globalThis as any).
|
|
229
|
+
> 仍可绕过代理直取全局单例(等价,调试用):`(globalThis as any).__FULGURJS_RUNTIME__`。
|
|
230
230
|
|
|
231
231
|
#### 函数总表
|
|
232
232
|
|
|
@@ -240,9 +240,9 @@ import { loadRemote, provideFulgurAppConfig } from 'virtual:fulgur-runtime'
|
|
|
240
240
|
| `registerShare` | `(scope, name, version, get, opts?) => void` | 手工注册共享模块(一般由 init 模块自动完成) |
|
|
241
241
|
| `initSharing` | `(scopeName?) => ShareScopeMap` | 初始化共享作用域(一般由 init 模块自动完成) |
|
|
242
242
|
| `registerPlugins` | `(plugins: RuntimePlugin[]) => void` | 注册运行时插件(见下) |
|
|
243
|
-
| `
|
|
244
|
-
| `
|
|
245
|
-
| `getRuntime` | `() =>
|
|
243
|
+
| `provideFulgurjsAppConfig` | `(config: Record<string, any>) => void` | **跨应用全局配置写入**(宿主桥一次写入;浅合并;镜像到 `globalThis.__FULGURJS_APP_CONFIG__`) |
|
|
244
|
+
| `getFulgurjsAppConfig` | `() => Record<string, any>` | 读取全局配置(远程 federatedBoot 消费注入 locale/size 等) |
|
|
245
|
+
| `getRuntime` | `() => FulgurjsRuntime` | 取运行时单例本体(与 `__FULGURJS_RUNTIME__` 同一实例) |
|
|
246
246
|
| `version` | `string` | 运行时/插件版本(跨源副本一致性诊断用) |
|
|
247
247
|
| `unwrapDefault` | `(ns: any) => any` | ESM/CJS default interop 工具 |
|
|
248
248
|
|
|
@@ -257,10 +257,10 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
257
257
|
})
|
|
258
258
|
```
|
|
259
259
|
|
|
260
|
-
#### 运行时插件(`runtimePlugins: ['./src/
|
|
260
|
+
#### 运行时插件(`runtimePlugins: ['./src/fulgurjsPlugin.ts']`)
|
|
261
261
|
|
|
262
262
|
```ts
|
|
263
|
-
import type { RuntimePlugin } from 'virtual:
|
|
263
|
+
import type { RuntimePlugin } from 'virtual:fulgurjs-runtime'
|
|
264
264
|
|
|
265
265
|
export default {
|
|
266
266
|
name: 'my-plugin',
|
|
@@ -279,20 +279,20 @@ export default {
|
|
|
279
279
|
|
|
280
280
|
| 出口 | 内容 |
|
|
281
281
|
|---|---|
|
|
282
|
-
| `window.
|
|
283
|
-
| `window.
|
|
284
|
-
| `window.
|
|
285
|
-
| `window` 事件 `
|
|
282
|
+
| `window.__FULGURJS_SCOPE__` | share scope 实时协商结果(键 → 版本 → `{ get, from, loaded }`) |
|
|
283
|
+
| `window.__FULGURJS_INFO__` | `{ remotes: { [名]: { entry, status, lastLoadMs, error } }, errors: [] }` |
|
|
284
|
+
| `window.__FULGURJS_APP_CONFIG__` | W4 全局配置镜像 |
|
|
285
|
+
| `window` 事件 `fulgurjs:error` | `CustomEvent<{ remote, error }>`,所有远程加载/共享错误都会发出 |
|
|
286
286
|
|
|
287
|
-
### 3. `
|
|
287
|
+
### 3. `defineFulgurjsPages` — 宿主页面路由表(`@fulgurjs/federation/pages`)
|
|
288
288
|
|
|
289
289
|
宿主把「URL 路径 → 远程 exposes 键」的映射表交给它校验,带参路由的静默冲突在启动期报错而不是运行时加载错组件:
|
|
290
290
|
|
|
291
291
|
```ts
|
|
292
|
-
import {
|
|
293
|
-
import remoteSchema from 'virtual:
|
|
292
|
+
import { defineFulgurjsPages } from '@fulgurjs/federation/pages'
|
|
293
|
+
import remoteSchema from 'virtual:fulgurjs-remote-schema' // dev 自动生成;build 恒为空(诚实降级)
|
|
294
294
|
|
|
295
|
-
export const PAGES =
|
|
295
|
+
export const PAGES = defineFulgurjsPages(
|
|
296
296
|
[
|
|
297
297
|
{ route: '/remote-a/home', name: 'RemoteAHome', title: '首页' },
|
|
298
298
|
// 带参路由:缺省推导 spec = 去首段 + 剥 :参 段;与其它条目冲突时 ERROR,
|
|
@@ -318,14 +318,14 @@ export const PAGES = defineFulgurPages(
|
|
|
318
318
|
| R4 | ERROR | 静态路由被更靠前的带参路由遮蔽(先到先得)/路由完全重复 |
|
|
319
319
|
| R5 | WARN | name 重复(vue-router 命名跳转歧义) |
|
|
320
320
|
|
|
321
|
-
`
|
|
321
|
+
`validateFulgurjsPages(pages, options)` 为独立导出:返回违例清单不抛错,便于自测。
|
|
322
322
|
|
|
323
|
-
### 4. `
|
|
323
|
+
### 4. `fulgurjs.config.ts` — CLI 单配置文件(`@fulgurjs/federation/config`)
|
|
324
324
|
|
|
325
325
|
```ts
|
|
326
|
-
import {
|
|
326
|
+
import { defineFulgurjsConfig } from '@fulgurjs/federation/config'
|
|
327
327
|
|
|
328
|
-
export default
|
|
328
|
+
export default defineFulgurjsConfig({
|
|
329
329
|
root: process.cwd(), // 工程根(monorepo 根或单应用仓库根)
|
|
330
330
|
apps: [
|
|
331
331
|
{
|
|
@@ -354,9 +354,9 @@ export default defineFulgurConfig({
|
|
|
354
354
|
|
|
355
355
|
| 命令 | 说明 |
|
|
356
356
|
|---|---|
|
|
357
|
-
| `
|
|
358
|
-
| `
|
|
359
|
-
| `
|
|
357
|
+
| `fulgurjs init` | 在当前目录生成带注释的 `fulgurjs.config.ts` 起步模板;`--template <path>` 指定输出路径;已存在拒绝覆盖,`--force` 强制 |
|
|
358
|
+
| `fulgurjs init --config <path>` | 校验配置(CFG 三段式报错)+ 输出各应用 `federation()` 粘贴块、NGINX no-cache 站点模板、8 条通用核对清单 |
|
|
359
|
+
| `fulgurjs doctor --base <URL> --apps <a,b,c>` | 部署体检:remoteEntry/manifest/index.html 的 200/no-cache/JS 形态、CORS、chunk 抽样可达、版本 skew 预演。`--dev` 检查 dev 容器入口;`--json` 输出 JSON(CI 断言);`--chunk-sample N` 控制抽样数(默认 16)。**退出码:有 FAIL 即 1**,可直接做 CI 门禁 |
|
|
360
360
|
|
|
361
361
|
### 6. 错误码总表(30 个)
|
|
362
362
|
|
|
@@ -376,7 +376,7 @@ export default defineFulgurConfig({
|
|
|
376
376
|
| | `DEV-004` | 已知 UMD-only 依赖不在 optimizeDeps.include(预构建内联本地 vue 风险) |
|
|
377
377
|
| | `DEV-005` | remotes dev URL 端口无监听 |
|
|
378
378
|
| | `DEV-006` | 宿主/远程插件版本不一致 |
|
|
379
|
-
| | `DEV-008` | 远程页面静态导入 virtual:
|
|
379
|
+
| | `DEV-008` | 远程页面静态导入 virtual:fulgurjs-runtime(破坏渲染上下文) |
|
|
380
380
|
| | `DEV-009` | 门面/虚拟模块 404(.vite 缓存漂移,需清缓存重启) |
|
|
381
381
|
| | `DEV-010` | dev 冷启动预构建窗口提示(首轮 30~60s 瞬态,非故障) |
|
|
382
382
|
| BLD 构建期 | `BLD-001` | expose 源文件解析失败 |
|
|
@@ -393,18 +393,18 @@ export default defineFulgurConfig({
|
|
|
393
393
|
| | `MFU-009` | 加载到的模块没有任何导出 |
|
|
394
394
|
| | `MFU-010` | singleton 共享版本漂移(使用作用域版本,告警) |
|
|
395
395
|
|
|
396
|
-
每个码的完整排查文案见 [`docs/manual.html`](
|
|
396
|
+
每个码的完整排查文案见 [`docs/manual.html`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/manual.html) §8;`fulgurjs doctor` 可提前把部署面的 MFU-001 类问题拦在上线前。
|
|
397
397
|
|
|
398
398
|
### 7. 产物与端点约定
|
|
399
399
|
|
|
400
400
|
| 环境 | 路径 | 说明 |
|
|
401
401
|
|---|---|---|
|
|
402
|
-
| dev | `/<base>/@
|
|
403
|
-
| dev | `/<base>/@
|
|
404
|
-
| prod | `/<base>/
|
|
405
|
-
| prod | `/<base>/
|
|
402
|
+
| dev | `/<base>/@fulgurjs-entry.js` | 远程容器入口(插件中间件直出,自包含) |
|
|
403
|
+
| dev | `/<base>/@fulgurjs-manifest.json` | dev manifest(宿主 dts / preloadRemote 消费) |
|
|
404
|
+
| prod | `/<base>/fulgurjs-remoteEntry.js` | 固定文件名容器入口(内容每次构建变——**必须 no-cache**) |
|
|
405
|
+
| prod | `/<base>/fulgurjs-manifest.json` | expose chunk/CSS 清单(preloadRemote 消费,**no-cache**) |
|
|
406
406
|
|
|
407
|
-
NGINX 部署模板(no-cache 规则 + 深链回退)用 `
|
|
407
|
+
NGINX 部署模板(no-cache 规则 + 深链回退)用 `fulgurjs init --config` 自动生成,样例见 [`docs/manual.html`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/manual.html)。
|
|
408
408
|
|
|
409
409
|
## ⚠️ 首次使用避坑指南(真实迁移项目踩坑实录)
|
|
410
410
|
|
|
@@ -467,7 +467,7 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
467
467
|
所有配置问题在 `vite` 启动瞬间即报,固定三段式,可直接照抄修正:
|
|
468
468
|
|
|
469
469
|
```
|
|
470
|
-
[
|
|
470
|
+
[fulgurjs] Invalid federation() config — remotes["remote-a"] has no address (need one of external / dev / prod)
|
|
471
471
|
got: {"dev":""}
|
|
472
472
|
expected: at least one address; with only one URL it is used for both dev and prod
|
|
473
473
|
example: remotes: { 'remote-a': 'http://localhost:5101' }
|
|
@@ -478,22 +478,22 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
478
478
|
|
|
479
479
|
统一错误码体系(CFG/DEV/BLD/MFU 四段共 30 个)——**完整总表见上方 [API 参考 §6](#6-错误码总表30-个)**;报错文案一律「现象 → 根因 → 修法」三段式。
|
|
480
480
|
|
|
481
|
-
调试出口:`window.
|
|
481
|
+
调试出口:`window.__FULGURJS_SCOPE__`(share 协商实时结果)、`window.__FULGURJS_INFO__`(remote 状态/耗时/错误)。
|
|
482
482
|
|
|
483
483
|
## 边界(明确不支持)
|
|
484
484
|
|
|
485
485
|
- 仅 Vue 3 生态(React 适配不在当前范围);不兼容 originjs 的 `virtual:__federation__` 旧写法
|
|
486
486
|
- 不支持 SSR(检测到即警告并禁用钩子)
|
|
487
|
-
- 无浏览器 DevTools 扩展(提供 `window.
|
|
487
|
+
- 无浏览器 DevTools 扩展(提供 `window.__FULGURJS_SCOPE__ / __FULGURJS_INFO__` 调试面)
|
|
488
488
|
- 无 JS 沙箱 / CSS 隔离——联邦是同 realm 共存架构,靠 shared 单例协商防止双运行时(详见 `docs/沙箱边界审计.md` 的三维度实测)
|
|
489
489
|
|
|
490
490
|
## 文档
|
|
491
491
|
|
|
492
|
-
- [`docs/manual.html`](
|
|
493
|
-
- [`docs/迁移指南.md`](
|
|
494
|
-
- [`docs/webpack-mf-对照与缺口.md`](
|
|
495
|
-
- [`docs/沙箱边界审计.md`](
|
|
496
|
-
- [`DESIGN.md`](
|
|
492
|
+
- [`docs/manual.html`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/manual.html) — 完整使用手册:webpack 逐项对齐总表、每个功能的配置代码 + dev/prod 实测截图、错误码排查、NGINX 部署样例
|
|
493
|
+
- [`docs/迁移指南.md`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/迁移指南.md) — qiankun 微前端 → 联邦的真实迁移案例(七步法 + 验收清单)
|
|
494
|
+
- [`docs/webpack-mf-对照与缺口.md`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/webpack-mf-对照与缺口.md) — webpack MF 逐项对照与明确不支持清单
|
|
495
|
+
- [`docs/沙箱边界审计.md`](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/沙箱边界审计.md) — CSS / 全局变量 / 公共依赖三维度互扰实测
|
|
496
|
+
- [`DESIGN.md`](https://github.com/chenmingye/fulgurjs-federation/blob/master/DESIGN.md) — 架构设计、对齐总表、测试与验收方案
|
|
497
497
|
|
|
498
498
|
## 开发与测试
|
|
499
499
|
|