@fulgurjs/federation 4.3.1 → 5.0.0

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 CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.0.0(2026-09-26)
4
+
5
+ 有意破坏公开 API 的清理版(插件尚无外部用户,公开使用面只描述真实可用能力)。旧 API 传入时给出「当前值 → 原因 → 迁移写法」的中文错误,不静默接受。
6
+
7
+ ### 删除:4.1.0 聚合配置整条兼容链
8
+
9
+ - **`@fulgurjs/federation/config` 子路径**:`defineRepoConfig` / `loadRepoConfig` / `federationOptionsForApp` 与 `RepoConfig`/`UserConfig`/`AppConfig`/`HostConfig`/`RemoteConfig`/`DeployConfig`/`RemoteAddress` 聚合类型不再发布(exports/typesVersions/构建入口同步移除)。替代:每个应用根目录一份 `fulgurjs.config.ts`,默认导出直接 `satisfies FederationOptions`。配置内导入旧子路径或旧形状(`root + apps[]`)时,CLI 输出「拆分到各项目根」的中文迁移指引。
10
+ - **CLI `--app` 选择器**:从 help 移除;传入报中文错误(说明其为聚合链选择器并给出单项目替代)。`explain`/`check-pages` 只接受单项目配置。
11
+ - **check-pages 旧聚合形态的本地 dist 回退**:删除。显式 `--manifest`/`--site` 来源失败如实报「无法验证」,无本地 dist 兜底。
12
+ - **`init --config` 聚合输出分支**(各应用 Vite 粘贴块、NGINX 样板)删除;单项目输出保留。`PageEntry` 类型迁至单项目契约模块(`app-config.ts`)继续服务 `hostPages`,页面表功能不受影响。
13
+
14
+ ### 删除:无实际效果的配置选项(传入报 `CFG-011`)
15
+
16
+ - `remoteType`(只接受唯一值 `module`)、`library`(从未参与输出)、`automaticAsyncBoundary`(恒为 true)、`dataPrefetch`(恒为 true,预载用 `preloadRemote()`)、`usedExports` / `ignoreUnusedSharedExports`(no-op,打包器原生 tree-shaking 已覆盖)。`CFG-011` 重定义为「已删除选项的迁移报错」;类型层不再允许这些字段,JS/`as any` 传入由运行时校验兜底。
17
+
18
+ ### 删除:无消费者的导出键
19
+
20
+ - `exports['./internal/vue.js']`:生成门面实际引用 `./internal/vue-adapter.js`(保留),`remoteComponent`/`createHostPages` 由 `/runtime` 提供(`src/vue.ts` 保留,供 runtime-entry 内联消费);`dist/vue.*` 不再随包发布。
21
+
22
+ ### 不变(本轮明确保留)
23
+
24
+ `/runtime` 全部导出(含 `getRuntime`/`shareScopeMap`/`getContainer`/`parseSpec`/`unwrapDefault` 低层 API)、`./internal/context.js`、`./internal/pages.js`、`./internal/vue-adapter.js`、`exposes`/`loadRemote`/`preloadRemote`、`setup`/`onSession` 生命周期、`createHostPages`/`remoteComponent`、虚拟模块机制、dev/prod 双引擎与懒加载。
25
+
3
26
  ## 4.3.1(2026-09-26)
4
27
 
5
28
  - 将插件自身的配置、共享依赖和远程加载诊断改为中文,保留错误码与原始底层异常;修复 `MFU-010` 将多个兼容候选版本误判为冲突的问题,真正不兼容时显示原因与修法,并对同一版本组合去重。
package/DESIGN.md CHANGED
@@ -4,6 +4,7 @@
4
4
  > 系列规划:`@fulgurjs/federation`(模块联邦)→ `@fulgurjs/micro`、`@fulgurjs/dts` …
5
5
  > 内外命名统一 `fulgurjs`(`virtual:fulgurjs-*` 虚拟模块、`window.__FULGURJS_*` 调试出口、`FgError` / MFU 错误码)。
6
6
 
7
+ > **5.0.0 注意**:本文档是历史设计记录;§2 选项对齐表中的 `remoteType`/`library`/`automaticAsyncBoundary`/`dataPrefetch`/`usedExports`/`ignoreUnusedSharedExports` 与 4.1.0 聚合配置链已在 5.0.0 从公开面删除(传入报 CFG-011 迁移错误)。当前可用选项以 README 为准。
7
8
  > 状态:已实现并验证(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
9
  > 日期:2026-09-12
9
10
 
package/README.md CHANGED
@@ -31,7 +31,7 @@
31
31
  - **增强能力**:dts 类型直连(dev 补全直达 remote 源码)、`preloadRemote()` manifest 驱动精确预载、runtimePlugins 钩子
32
32
  - **HMR 全链路**:remote 改动 → host 页面热更,L1 组件热替换 / L2 状态保留 / L3 错误覆盖与恢复
33
33
  - **零报错纪律**:配置问题启动瞬间三段式报错;联邦失败显式抛错(错误码 + 可执行修复建议),**无任何静默兜底路径**
34
- - **CLI(主包内置 bin)**:`fulgurjs init`——**单项目** `fulgurjs.config.ts` 起步模板与校验(默认导出直接是 `federation()` 选项;输出 `federation(fulgurjsConfig)` 接入块与核对清单,**不改写任何项目文件**);`fulgurjs explain`——本应用有效联邦形态与加载链解释器(纯本地,按实际选项判角色,免 `--app`);`fulgurjs check-pages`——宿主页面表 ↔ 远程 manifest exposes 契约核对(`--manifest`/`--site` 指定来源并如实报告;CI 可嵌,确定性错误与 `--require-verified` 均非零退出);`fulgurjs doctor`——部署面体检(remoteEntry/manifest/HTML 缓存头与形态、CORS、chunk 抽样可达、版本 skew 预演、`--dev` 端口探测)
34
+ - **CLI(主包内置 bin)**:`fulgurjs init`——**单项目** `fulgurjs.config.ts` 起步模板与校验(默认导出直接是 `federation()` 选项;输出 `federation(fulgurjsConfig)` 接入块与核对清单,**不改写任何项目文件**);`fulgurjs explain`——本应用有效联邦形态与加载链解释器(纯本地,按实际选项判角色);`fulgurjs check-pages`——宿主页面表 ↔ 远程 manifest exposes 契约核对(`--manifest`/`--site` 指定来源并如实报告;CI 可嵌,确定性错误与 `--require-verified` 均非零退出);`fulgurjs doctor`——部署面体检(remoteEntry/manifest/HTML 缓存头与形态、CORS、chunk 抽样可达、版本 skew 预演、`--dev` 端口探测)
35
35
  - **远程初始化生命周期(可选)**:`federation({ setup })` 显式声明初始化入口——默认导出 `setup(context)` 应用级执行一次、可选具名导出 `onSession(context)` 按宿主 `sessionKey` 去重执行(换账号/重登自动重跑,退出 `clearAppContext` 清理会话状态);失败显式报错可重试(`MFU-011~014`),`preloadRemote`/`getContainer` 无副作用。不配置 `setup` 时零行为零体积
36
36
  - **宿主页面适配器(可选)**:`createHostPages({ pages, remotePrefixes, ... })`——一份页面表供宿主路由与布局共用;URL 解析(含 base 剥离)、最长前缀远程归属、`definePages` R1–R5 校验、异步组件缓存(会话切换自动重建)、骨架屏/错误占位、保活名称内置
37
37
  - **跨应用传值与方法引用**:`@fulgurjs/federation/runtime` 导出 `provideAppContext` / `getAppContext` / `requireAppContext` / `clearAppContext`(缺键 `CC-001` 三段式、独立直开远程页 `CC-002` 显式)。宿主桥写入页面级单例(user/getToken/store/hostApp/locale/sessionKey/events 标准字段 + 项目扩展位),远程 setup/onSession 显式校验消费;方法引用两条通道 = context 携带函数引用(热路径直调)+ exposes 方法模块 `loadRemote('remote/api')`(低频重逻辑)。数据语义 = 传输层快照 + 函数引用,非响应式(与乾坤 props 同语义;"实时"靠函数引用拉取 / 宿主 pinia 共享承担,同页换账号由 onSession 会话同步承担,不依赖页面刷新)
@@ -211,7 +211,7 @@ clearAppContext() // 清 context + 作废会话信号/onSession 去重(下次
211
211
 
212
212
  **数据从哪里来**:`context.appContext` 就是宿主 `provideAppContext` 写入的同一页面级对象(同浏览器页面直接共享,无网络传输);`user` 是提供时快照、`getToken()` 每次调用取最新值、`store` 是宿主 pinia 实例引用。dev/prod 行为一致。
213
213
 
214
- > 只有配置在 `setup` 的文件才是生命周期入口。插件**不扫描目录、不按文件名猜测、不执行其他 TS exposes**——普通 TS 模块仍按路径 ① 的语义「加载不等于调用」。旧的「expose 启动器 + 宿主手动 loadRemote 并调用」写法继续可用(便于分批迁移),但不再是推荐接法(见[迁移指南](#文档))。
214
+ > 只有配置在 `setup` 的文件才是生命周期入口。插件**不扫描目录、不按文件名猜测、不执行其他 TS exposes**——普通 TS 模块仍按路径 ① 的语义「加载不等于调用」。「expose 一个普通 TS 模块 + 宿主手动 `loadRemote` 并调用」本质是普通 expose 的通用语义,始终可以做;但它不是插件的生命周期机制,也没有应用级一次 / 会话级去重 / 失败重试——初始化请用 `setup`/`onSession`(见[迁移指南](#文档))。
215
215
 
216
216
  ### 通用边界(三条路径都适用)
217
217
 
@@ -221,7 +221,7 @@ clearAppContext() // 清 context + 作废会话信号/onSession 去重(下次
221
221
  import { loadRemote, provideAppContext, getAppContext, requireAppContext, clearAppContext, definePages, createHostPages, remoteSchema, remoteComponent } from '@fulgurjs/federation/runtime'
222
222
  ```
223
223
 
224
- `/runtime` 是 ESM 应用入口,导出 `remoteComponent`/`createHostPages`,所以**使用该入口的应用需要安装 Vue**(Vue 为可选 peer:只用包根或 `/config` 时无需安装;`runtime.js` 内核本身零 Vue 依赖零体积增量)。`remoteSchema` 必须以具名静态导入取得 dev 探针结果;命名空间导入、动态导入和 re-export 不触发探针拆写,未经过插件转换时该值是空表。dev 下 remote 跑它自己的 `vite dev`(容器入口 `/@fulgurjs-entry.js` 由插件中间件直出);build 下 expose 自动拆独立 chunk、shared 自动剥离——同一份配置两端通用。
224
+ `/runtime` 是 ESM 应用入口,导出 `remoteComponent`/`createHostPages`,所以**使用该入口的应用需要安装 Vue**(Vue 为可选 peer:只用包根(Vite 插件)时无需安装;`runtime.js` 内核本身零 Vue 依赖零体积增量)。`remoteSchema` 必须以具名静态导入取得 dev 探针结果;命名空间导入、动态导入和 re-export 不触发探针拆写,未经过插件转换时该值是空表。dev 下 remote 跑它自己的 `vite dev`(容器入口 `/@fulgurjs-entry.js` 由插件中间件直出);build 下 expose 自动拆独立 chunk、shared 自动剥离——同一份配置两端通用。
225
225
 
226
226
  **导入改写边界**:宿主/远程的任何普通源码文件都可以直接静态导入 `/runtime`——包括 exposes 目标文件(远程页面),其导入会被插件自动改写为惰性单例委托(求值期零副作用)。**构建入口文件是边界**:Vite 的 HTML module entry 在 build 时由插件优先内联 init 并直接返回,入口文件自身的 remote import 不会进入改写管线;把 remote 动态导入放在入口导入的普通模块中,不要写在 `main.ts` / `main.js` 里。
227
227
 
@@ -240,8 +240,8 @@ npx fulgurjs init
240
240
  npx fulgurjs init --config fulgurjs.config.ts
241
241
 
242
242
  # 3) 配置解释器(纯本地无网络):角色(按实际选项判定,双向联邦显示「双角色」)/remotes/exposes/
243
- # setup/shared/页面映射/devSharedSelf 来源/加载链;单项目形态免 --app
244
- npx fulgurjs explain # --json 供 CI;聚合配置需 --config <聚合文件> --app <应用名>
243
+ # setup/shared/页面映射/devSharedSelf 来源/加载链
244
+ npx fulgurjs explain # --json 供 CI(在应用根目录运行,默认读 ./fulgurjs.config.ts)
245
245
 
246
246
  # 4) 页面契约核对:宿主页面表 ↔ 远程 manifest exposes(宿主项目内运行;manifest 来源
247
247
  # 优先级 --manifest > --site/prod 推导,输出实际命中来源;确定性错误非零退出,
@@ -254,9 +254,8 @@ npx fulgurjs doctor --base http://your-site --apps app-a,app-b
254
254
  npx fulgurjs doctor --base http://localhost:5173 --apps app-a --dev
255
255
  ```
256
256
 
257
- **插件保持项目无关**:init 不改写任何项目文件、不生成项目源码(不生成桥/路由/启动器/NGINX 文件——
258
- NGINX 内容仅作为**打印样板**随旧聚合配置输出);权限路由、项目侧桥与页面表等集成细节由各项目
259
- 按 init 输出的通用核对清单自行落地。
257
+ **插件保持项目无关**:init 不改写任何项目文件、不生成项目源码(不生成桥/路由/启动器/NGINX 文件);
258
+ 权限路由、项目侧桥与页面表等集成细节由各项目按 init 输出的通用核对清单自行落地。
260
259
 
261
260
  ### 每项目一份配置:`fulgurjs.config.ts` + `federation(fulgurjsConfig)`(默认主路径)
262
261
 
@@ -284,8 +283,8 @@ import fulgurjsConfig from './fulgurjs.config'
284
283
 
285
284
  规则与边界:
286
285
 
287
- - 各项目 `vite.config.ts` 中**不得也不需要**出现 `loadRepoConfig` / `federationOptionsForApp` /
288
- `fileURLToPath(new URL(...))` / 父目录配置路径 / 按字符串查应用名——CLI 内部有自己的加载器,
286
+ - 各项目 `vite.config.ts` 中**不得也不需要**出现 `fileURLToPath(new URL(...))` / 父目录配置路径 /
287
+ 按字符串查应用名(4.1.0 聚合链 `loadRepoConfig`/`federationOptionsForApp` 已在 5.0.0 删除)——CLI 内部有自己的加载器,
289
288
  项目侧永远只见「导入一个常量、调用一次插件」;
290
289
  - 宿主应用的页面核对数据以**具名导出 `hostPages`**(`{ pages, remotePrefixes, deriveSpec? }`)提供,
291
290
  与运行时 `createHostPages` 消费同一份数据模块(页面表唯一手工维护位置);Vite 只消费默认导出,
@@ -293,11 +292,12 @@ import fulgurjsConfig from './fulgurjs.config'
293
292
  - base / dev 端口 / 代理 / 插件顺序等继续归各项目 `vite.config.ts`,不复制进第二套配置;
294
293
  - 同一 monorepo 中的应用也各自持有配置;宿主与远程分属不同仓库时各自独立构建、部署、诊断。
295
294
 
296
- > **历史兼容(不推荐)**:4.1.0 的聚合配置(`root + apps[]`,`defineRepoConfig` /
297
- > `loadRepoConfig` / `federationOptionsForApp` 三层转换)保留一段兼容期——CLI 自动识别旧形状
298
- > 并保持 4.1.0 行为(`explain`/`check-pages` 需 `--app`),已使用聚合配置的项目升级不会立即报错,
299
- > 但文档主路径、`init` 模板与本节示例一律是单项目形态。迁移 = 拆出各应用的 `name/remotes/
300
- > exposes/setup/shared` 到各自项目根,删除父目录聚合文件。
295
+ > **5.0.0 已删除旧聚合配置**:4.1.0 的聚合配置(`root + apps[]`,`@fulgurjs/federation/config`
296
+ > 子路径的 `defineRepoConfig` / `loadRepoConfig` / `federationOptionsForApp` 三层转换)与 CLI
297
+ > `--app` 选择器已删除——传入旧形状会得到「当前形状 → 期望形状 → 迁移写法」的中文错误
298
+ > (`explain`/`check-pages` 传 `--app` 也报同类错误)。迁移 = 拆出各应用的 `name/remotes/
299
+ > exposes/setup/shared` 到各自项目根的 `fulgurjs.config.ts`,`host.pages`/`remotePrefixes`/
300
+ > `deriveSpec` 改为具名导出 `hostPages`,然后删除父目录聚合文件。
301
301
 
302
302
  ## API 参考
303
303
 
@@ -322,8 +322,6 @@ import { federation, type FederationOptions } from '@fulgurjs/federation'
322
322
  | `remotes` | `Record<string, string \| RemoteEntryConfig \| (() => Promise<any>)>` | — | 消费的远程,三种形态见下表 |
323
323
  | `shared` | `string[] \| Record<string, string \| SharedHint>` | — | 共享依赖;字符串简写 = requiredVersion(缺省从本应用 package.json 推断) |
324
324
  | `shareScope` | `string` | `'default'` | 默认共享作用域名 |
325
- | `remoteType` | `'module'` | `'module'` | 仅支持 `'module'`(类型即字面量);传其它值配置期报 CFG-011(webpack script/var 互操作未实现,不产出看似成功实为 module 的构建) |
326
- | `library` | `{ type?: 'module' \| 'esm' }` | — | 仅接受 esm/module;其它值配置期报 CFG-011(webpack UMD/var 输出互操作未实现) |
327
325
  | `runtime` | `string \| false` | 内置运行时 | 自定义运行时模块路径;`false` 禁用内置运行时 |
328
326
  | `runtimeChunk` | `boolean \| 'single'` | — | 运行时是否拆独立 chunk |
329
327
  | `manifest` | `boolean` | `true` | prod 构建生成 `fulgurjs-manifest.json`(preloadRemote 依赖它) |
@@ -332,9 +330,6 @@ import { federation, type FederationOptions } from '@fulgurjs/federation'
332
330
  | `devSharedSelf` | `boolean` | 提供 `exposes`(或 `setup`)的应用 `true`;纯宿主(只消费)`false`;显式配置永远优先 | dev 下自身源码(含依赖)是否参与 shared 协商改写。双向联邦(既 expose 又消费 remote)默认即 `true`——无需再背诵显式配置(4.1.0 起按角色推断,§12.4;此前默认 false 曾是已知错误配置的来源)。build 下该路径的协商门面自动隔离进插件专属 chunk(`fulgurjs-runtime` + `fulgurjs-shared-<key>`),与用户 `manualChunks` 强制分组正交、不产生 chunk 循环依赖(D6 修复) |
333
331
  | `devCorsOrigins` | `string[] \| '*'` | `'*'`(现状兼容) | dev 跨源访问策略:插件端点(`/@fulgurjs-entry.js`、`/@fulgurjs-manifest.json`)与 `server.cors` 使用同一来源。缺省或 `'*'` 全放开(非 loopback host 时提醒 DEV-011);数组按 Origin 反射 allowlist(未命中省略头)。用户显式配置的 `server.cors` 永远优先。开/关/自定义三态示例见下方 |
334
332
  | `devFsRoot` | `boolean` | `true`(现状兼容) | dev manifest 是否携带 `fsRoot`(remote 根目录本机绝对路径,宿主 dts 类型直连用)。`false` 不写入(本机路径不外发),宿主 dts 降级 any 桩并提示;该字段永不进入 prod manifest。非 loopback host 下默认值会提醒 DEV-012 |
335
- | `automaticAsyncBoundary` | — | 恒为 `true` | 传 `false` 配置期报 CFG-011(TLA 自动异步边界无手工 bootstrap 模式可关闭);缺省或 `true` 接受 |
336
- | `dataPrefetch` | — | 恒为 `true` | 接受任意值:`preloadRemote` 始终可用 |
337
- | `usedExports` / `ignoreUnusedSharedExports` | — | no-op | 接受并忽略(Rollup/Rolldown 原生 tree-shaking 已覆盖) |
338
333
 
339
334
  #### remotes 的三种形态
340
335
 
@@ -539,12 +534,10 @@ CLI 内部加载器(`loadAppConfig`)以**原配置文件为解析基准** es
539
534
  `name`、字段形状不对、expose/setup 指向项目外或不存在文件等均三段式报错。运行时(Vite)与
540
535
  CLI 解析同一份配置值;dev/prod 的 URL 选择规则与 `federation({ remotes })` 一致(§1)。
541
536
 
542
- **历史兼容(4.1.0 聚合配置,`@fulgurjs/federation/config` 子路径)**:`defineRepoConfig({ root,
543
- apps[] })` 形态自动识别并保持 4.1.0 行为;程序化加载 `loadRepoConfig(configPath): Promise<RepoConfig>`
544
- 与转换 `federationOptionsForApp(config, appPathOrName): FederationOptions` 继续可用(应用不存在时
545
- 报出可用清单;同键不同地址冲突报错)。同子路径类型:`RepoConfig`/`UserConfig`/`AppConfig`/
546
- `HostConfig`/`RemoteConfig`/`DeployConfig`/`PageEntry`/`RemoteAddress`。兼容不等于推荐——
547
- 新项目一律用上方单项目形态。
537
+ **已删除(5.0.0)**:4.1.0 聚合配置入口 `@fulgurjs/federation/config`(`defineRepoConfig` /
538
+ `loadRepoConfig` / `federationOptionsForApp` 及 `RepoConfig` 等聚合类型)不再发布——导入该子路径
539
+ 会得到 exports 解析错误;CLI 读到旧形状(`root + apps[]`)会输出「拆分到各项目根」的中文迁移
540
+ 指引。`PageEntry` 仍是现行类型(宿主页面表记录,随单项目契约从主入口类型面使用)。
548
541
 
549
542
 
550
543
  ### 5. CLI 命令参考
@@ -552,9 +545,9 @@ apps[] })` 形态自动识别并保持 4.1.0 行为;程序化加载 `loadRepoC
552
545
  | 命令 | 说明 |
553
546
  |---|---|
554
547
  | `fulgurjs init` | 在当前目录生成**单项目** `fulgurjs.config.ts` 起步模板(默认导出 = `federation()` 选项 + 可选 `hostPages` 具名导出示例);`--template <path>` 指定输出路径;已存在拒绝覆盖,`--force` 强制。init **只生成配置起步模板**,不生成桥/路由/启动器/NGINX 文件 |
555
- | `fulgurjs init --config <path>` | 校验配置(CFG 三段式报错)+ 输出 `federation(fulgurjsConfig)` 接入块与通用核对清单(纯打印)。旧聚合配置自动识别,保持 4.1.0 输出(各应用粘贴块 + NGINX no-cache **打印样板**) |
556
- | `fulgurjs explain [--config <path>] [--app <名>]` | 配置解释器(纯本地、无网络、不读 token/环境秘密):应用角色(**按实际 federation 选项判定**——配 `remotes` 即消费、配 `exposes`/`setup` 即提供,两者均有=双角色,如双向联邦的 BPM)、有效 remotes、公开 exposes、内部 setup、shared、页面 spec 映射与数据来源、`devSharedSelf` 最终值及来源、加载链。单项目形态免 `--app`;聚合配置需 `--app <应用目录名或容器名>`。`--json` 供 CI |
557
- | `fulgurjs check-pages [--config <path>] [--app <宿主名>] [--site <URL>] [--manifest <r>=<路径\|URL>]... [--require-verified]` | 页面契约核对:宿主页面表(单项目 = `hostPages` 具名导出;聚合 = `host.pages`)↔ 远程 manifest exposes。manifest 来源优先级 **`--manifest`(可多次、文件路径或 URL) > `--site`/消费方 prod 地址推导 > 本地 dist(仅聚合形态回退)**,输出每个 remote 的实际命中来源(防止旧本地 dist 冒充线上核对)。报告未知 remote、映射到未消费远程、缺失 expose、路由冲突(R1–R5);**确定性错误退出码 1**,远程不可达报「无法验证」,`--require-verified` 时无法验证也非零(CI 严格模式,避免 0 条核对显示通过)。`--json` 供 CI |
548
+ | `fulgurjs init --config <path>` | 校验配置(CFG 三段式报错)+ 输出 `federation(fulgurjsConfig)` 接入块与通用核对清单(纯打印)。旧聚合形状报中文迁移错误 |
549
+ | `fulgurjs explain [--config <path>] [--json]` | 配置解释器(纯本地、无网络、不读 token/环境秘密):应用角色(**按实际 federation 选项判定**——配 `remotes` 即消费、配 `exposes`/`setup` 即提供,两者均有=双角色,如双向联邦的 BPM)、有效 remotes、公开 exposes、内部 setup、shared、页面 spec 映射与数据来源、`devSharedSelf` 最终值及来源、加载链。`--json` 供 CI。传 `--app`(5.0.0 已删除的聚合选择器)报中文迁移错误 |
550
+ | `fulgurjs check-pages [--config <path>] [--site <URL>] [--manifest <r>=<路径\|URL>]... [--require-verified]` | 页面契约核对:宿主页面表(`hostPages` 具名导出)↔ 远程 manifest exposes。manifest 来源优先级 **`--manifest`(可多次、文件路径或 URL) > `--site`/消费方 prod 地址推导**(显式来源失败不回退、无本地 dist 兜底),输出每个 remote 的实际命中来源(防止旧本地 dist 冒充线上核对)。报告未知 remote、映射到未消费远程、缺失 expose、路由冲突(R1–R5);**确定性错误退出码 1**,远程不可达报「无法验证」,`--require-verified` 时无法验证也非零(CI 严格模式,避免 0 条核对显示通过)。`--json` 供 CI |
558
551
  | `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 门禁 |
559
552
 
560
553
  ### 6. 错误码总表(41 个)
@@ -571,7 +564,7 @@ apps[] })` 形态自动识别并保持 4.1.0 行为;程序化加载 `loadRepoC
571
564
  | | `CFG-008` | shared 非法组合(eager+import:false / shareKey 重复声明) |
572
565
  | | `CFG-009` | remotes 运行参数非法(timeout/retries/breaker 非有限正数/超上限) |
573
566
  | | `CFG-010` | devCorsOrigins 形态非法(须为 "*" 或 http(s) 来源数组) |
574
- | | `CFG-011` | 不支持的互操作选项硬报错(remoteType/library.type 非 module 系、automaticAsyncBoundary=false——不再静默回落) |
567
+ | | `CFG-011` | 已删除的 webpack 兼容/无效选项(remoteType/library/automaticAsyncBoundary/dataPrefetch/usedExports/ignoreUnusedSharedExports——传入任何值报错并给出迁移写法) |
575
568
  | | `CFG-012` | setup 配置非法(路径为空/非字符串,或 exposes 占用内部保留键 `./__fulgurjs_setup__`) |
576
569
  | DEV 开发期 | `DEV-001` | remote dev server 不可达(manifest 拉取失败) |
577
570
  | | `DEV-002` | remote dev manifest 为空或格式不识别 |
@@ -614,7 +607,7 @@ apps[] })` 形态自动识别并保持 4.1.0 行为;程序化加载 `loadRepoC
614
607
  | prod | `/<base>/fulgurjs-remoteEntry.js` | 固定文件名容器入口(内容每次构建变——**必须 no-cache**) |
615
608
  | prod | `/<base>/fulgurjs-manifest.json` | expose chunk/CSS 清单(preloadRemote 消费,**no-cache**) |
616
609
 
617
- NGINX no-cache 规则(remoteEntry/manifest/index.html)与深链回退是联邦部署通用知识:`fulgurjs init --config` 在**旧聚合配置形态**下把它作为打印样板输出(不写文件),单项目形态按下方规则自行落位。
610
+ NGINX no-cache 规则(remoteEntry/manifest/index.html)与深链回退是联邦部署通用知识,按下方规则自行落位(`init` 核对清单第 8 条同步提示)。
618
611
 
619
612
  ### 8. `remoteComponent` — Vue 远程组件直渲染(`@fulgurjs/federation/runtime`)
620
613
 
@@ -642,7 +635,7 @@ const FederatedAmisForm = remoteComponent('demo-host/AmisFormRouterPage', {
642
635
  - 内部 = `defineAsyncComponent({ loader: () => loadRemote(spec, opts).then(m => m.default ?? m) })`,返回标准 Vue 异步组件,`props`(如 `form-params`)在使用处直接透传;
643
636
  - **无任何兜底/降级**(H3 零兜底):加载失败显式进错误态;不传 `errorComponent` 时渲染内置占位(错误码 + 根因 + 修法三段式文案),`window` 的 `fulgurjs:error` 事件由 runtime 层照常发出;
644
637
  - 模块去重沿用 `loadRemote` 内部 Promise 缓存——同 spec 多组件实例只加载一次容器模块;
645
- - `vue` 为**可选 peerDependency**(`peerDependenciesMeta.optional`):只使用包根或 `/config` 时无需安装;应用使用 `/runtime` 时需要安装 Vue,因为该入口导出 `remoteComponent`。内部 `runtime.js` 仍不导入 Vue,体积零增量;
638
+ - `vue` 为**可选 peerDependency**(`peerDependenciesMeta.optional`):只使用包根(Vite 插件)时无需安装;应用使用 `/runtime` 时需要安装 Vue,因为该入口导出 `remoteComponent`。内部 `runtime.js` 仍不导入 Vue,体积零增量;
646
639
  - 运行时实例经 `globalThis.__FULGURJS_RUNTIME__` 页面级单例复用,与 `@fulgurjs/federation/runtime` 的导入殊途同归,无需额外接线。
647
640
 
648
641
  ### 9. `AppContext` — 跨应用传值与方法引用(`@fulgurjs/federation/runtime`)
@@ -908,7 +901,7 @@ export async function onSession(context: RemoteSetupContext) {
908
901
  | dev/prod 一致 | dev 容器(中间件直出)与 prod 容器(构建产物)携带同一 setup 元数据(容器上的 `__fulgurjsSetup` 字段 + manifest 的 `setup` 字段);内部 expose 键 `./__fulgurjs_setup__` 不出现在 dts 类型与公开文档 exposes 清单中 |
909
902
  | 错误码 | MFU-011 导出非法 / MFU-012 执行失败 / MFU-013 缺 sessionKey / MFU-014 自递归;全部带 remote 名、模块路径/阶段、实际结果、预期与修法,不记录 token |
910
903
 
911
- 旧的「`exposes: { './federatedBoot': ... }` + 宿主手动 `loadRemote` 并调用」写法**继续可用**(旧项目分批迁移),但不再是推荐接法——见[迁移指南](#文档)的兼容说明。
904
+ 「`exposes` 一个普通 TS 启动模块 + 宿主手动 `loadRemote` 并调用」只是普通 expose + `loadRemote` 的通用用法,不是插件 API,也无 `setup`/`onSession` 的应用级一次、会话级去重、失败重试语义——初始化一律改用 `federation({ setup })`(见[迁移指南](#文档))。
912
905
 
913
906
 
914
907