@fulgurjs/federation 1.0.0 → 2.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 +47 -0
- package/DESIGN.md +1 -1
- package/README.md +35 -25
- package/client.d.ts +11 -10
- package/dist/{chunk-CK42RK2O.js → chunk-3VBYOVH4.js} +3 -3
- package/dist/{chunk-B5ZMYRN5.js → chunk-5GZKZWP2.js} +1 -1
- package/dist/cli.js +5 -5
- package/dist/config.cjs +6 -6
- package/dist/config.d.cts +18 -18
- package/dist/config.d.ts +18 -18
- package/dist/config.js +4 -4
- package/dist/context.cjs +17 -17
- package/dist/context.d.cts +7 -7
- package/dist/context.d.ts +7 -7
- package/dist/context.js +14 -14
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/pages.cjs +7 -7
- package/dist/pages.d.cts +6 -6
- package/dist/pages.d.ts +6 -6
- package/dist/pages.js +5 -5
- package/dist/runtime.js +2 -2
- package/dist/vue.cjs +18 -18
- package/dist/vue.js +19 -19
- package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +10 -10
- package/examples/{fulgur.config.example.ts → fulgurjs.config.example.ts} +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,52 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.0(2026-09-22)
|
|
4
|
+
|
|
5
|
+
### 破坏性变更(公开 API 去掉冗余品牌前缀,无兼容别名)
|
|
6
|
+
|
|
7
|
+
背景:包名与子路径已承担命名空间职责(`@fulgurjs/federation/context` 等),标识符再挂 `Fulgurjs`
|
|
8
|
+
前缀属纯冗余,且长度失控(`provideFulgurjsAppContext` 达 26 字符)。本版统一去前缀,**旧名直接移除**。
|
|
9
|
+
|
|
10
|
+
| 子路径 | 旧名 | 新名 |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| `/context` | `provideFulgurjsAppContext` | `provideAppContext` |
|
|
13
|
+
| | `getFulgurjsAppContext` | `getAppContext` |
|
|
14
|
+
| | `requireFulgurjsAppContext` | `requireAppContext` |
|
|
15
|
+
| | `FulgurjsAppContext` | `AppContext` |
|
|
16
|
+
| `/pages` | `defineFulgurjsPages` | `definePages` |
|
|
17
|
+
| | `validateFulgurjsPages` | `validatePages` |
|
|
18
|
+
| | `FulgurjsPagesOptions` / `FulgurjsPageRouteLike` | `PagesOptions` / `PageRouteLike` |
|
|
19
|
+
| `/config` | `defineFulgurjsConfig` | `defineRepoConfig` |
|
|
20
|
+
| | `loadFulgurjsConfig` | `loadRepoConfig` |
|
|
21
|
+
| | `FulgurjsRepoConfig` / `FulgurjsAppConfig` / `FulgurjsUserConfig` | `RepoConfig` / `AppConfig` / `UserConfig` |
|
|
22
|
+
| | `FulgurjsHostConfig` / `FulgurjsRemoteConfig` / `FulgurjsDeployConfig` | `HostConfig` / `RemoteConfig` / `DeployConfig` |
|
|
23
|
+
| | `FulgurjsPageEntry` / `FulgurjsRemoteAddress` | `PageEntry` / `RemoteAddress` |
|
|
24
|
+
| 主入口 | `FulgurjsOptions` | `FederationOptions` |
|
|
25
|
+
| 运行时 | `FulgurjsRuntime`(类型) | `FgRuntime` |
|
|
26
|
+
| | `FulgurjsError`(内部类,仅经 `err.name` 可见) | `FgError` |
|
|
27
|
+
|
|
28
|
+
两处命名取舍:
|
|
29
|
+
|
|
30
|
+
- `defineRepoConfig` 而非 `defineConfig`——避开与 vite 的 `defineConfig` 撞名(`fulgurjs.config.ts`
|
|
31
|
+
描述的是「一个仓库的多个应用」)。
|
|
32
|
+
- 运行时错误 `err.name` 由 `FulgurjsError` 变为 `FgError`:该类不在导出面(用户从不 import,
|
|
33
|
+
只经 `err.code` / `err.name` 观察),若有按 `name` 匹配错误的监控配置需同步。`err.code`(MFU-xxx 等)
|
|
34
|
+
语义与取值不变。
|
|
35
|
+
|
|
36
|
+
### 刻意保持不变的品牌元素
|
|
37
|
+
|
|
38
|
+
- **跨应用单例键** `globalThis.__FULGURJS_RUNTIME__` / `__FULGURJS_APP_CONFIG__` / `__FULGURJS_SCOPE__`:
|
|
39
|
+
跨版本互操作契约——改了会让新旧版本互相看不见对方的运行时与 context 存储。
|
|
40
|
+
- 虚拟模块 `virtual:fulgurjs-runtime`、CLI `fulgurjs`、配置文件 `fulgurjs.config.ts`、错误码前缀 `[fulgurjs:MFU-001]`。
|
|
41
|
+
- 运行时函数名(`loadRemote` / `loadShare` / `preloadRemote` / `registerRemote(s)` / `initSharing` /
|
|
42
|
+
`getContainer` / `getRuntime` / `unwrapDefault` / `parseSpec`):对齐 webpack Module Federation 命名,便于迁移对照。
|
|
43
|
+
|
|
44
|
+
### 迁移
|
|
45
|
+
|
|
46
|
+
按上表把旧名替换为新名即可,语义一一对应、无行为变化。注意 `provide/get/requireFulgurjsAppContext`
|
|
47
|
+
三个是「含前缀的完整函数名」,新名为 `provide/get/requireAppContext`(去的是 `Fulgurjs` 与 `AppContext`
|
|
48
|
+
之间的品牌词,`AppContext` 保留)。
|
|
49
|
+
|
|
3
50
|
## 1.0.0(2026-09-22)
|
|
4
51
|
|
|
5
52
|
### 破坏性变更(正式定版,API 面冻结)
|
package/DESIGN.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **品牌**:fulgurjs,拉丁语「闪电 · 辉光」,取自作者名中「烨」字的意译。
|
|
4
4
|
> 系列规划:`@fulgurjs/federation`(模块联邦)→ `@fulgurjs/micro`、`@fulgurjs/dts` …
|
|
5
|
-
> 内外命名统一 `fulgurjs`(`virtual:fulgurjs-*` 虚拟模块、`window.__FULGURJS_*` 调试出口、`
|
|
5
|
+
> 内外命名统一 `fulgurjs`(`virtual:fulgurjs-*` 虚拟模块、`window.__FULGURJS_*` 调试出口、`FgError` / 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
|
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
- **HMR 全链路**:remote 改动 → host 页面热更,L1 组件热替换 / L2 状态保留 / L3 错误覆盖与恢复
|
|
33
33
|
- **零报错纪律**:配置问题启动瞬间三段式报错;联邦失败显式抛错(错误码 + 可执行修复建议),**无任何静默兜底路径**
|
|
34
34
|
- **CLI(主包内置 bin)**:`fulgurjs init`——`fulgurjs.config.ts` 单配置驱动的迁移生成器(模板 = 真实工程验证形态:vite 配置/路由表/桥/联邦启动器/NGINX conf 全量编码,锚点补丁幂等可续跑);`fulgurjs doctor`——部署面体检(remoteEntry/manifest/HTML 缓存头与形态、CORS、chunk 抽样可达、版本 skew 预演、`--dev` 端口探测)
|
|
35
|
-
- **跨应用传值与方法引用**:`@fulgurjs/federation/context` 子路径——`
|
|
35
|
+
- **跨应用传值与方法引用**:`@fulgurjs/federation/context` 子路径——`provideAppContext` / `getAppContext` / `requireAppContext`(缺键 `CC-001` 三段式、独立直开远程页 `CC-002` 显式)。宿主桥一次写入页面级单例(user/token/getToken/store/hostApp/locale/events 标准字段 + 项目扩展位),远程 boot 显式校验消费;方法引用两条通道 = context 携带函数引用(热路径直调)+ exposes 方法模块 `loadRemote('remote/api')`(低频重逻辑)。数据语义 = 传输层快照 + 函数引用,非响应式(与乾坤 props 同语义;"实时"靠函数引用拉取 / 宿主 pinia 共享 / 登录刷新三通道)
|
|
36
36
|
- **Vue 直渲染**:`remoteComponent('remote/X')`(`@fulgurjs/federation/vue` 子路径)——`defineAsyncComponent + loadRemote` 的标准封装,加载失败显式错误占位(错误码+根因+修法),runtime.js 零框架依赖零体积增量
|
|
37
37
|
- **CSP 友好**:原生 ESM 加载路径全程无 `eval` / `new Function`,可在严格 CSP(无 `unsafe-eval`)下运行
|
|
38
38
|
- **全链路错误码体系(30 码)**:CFG/DEV/BLD/MFU/CC 五段 + 手册 §8 码表防漂移校验
|
|
@@ -162,7 +162,7 @@ import { federation } from '@fulgurjs/federation'
|
|
|
162
162
|
| `name` | `string` **必填** | — | 容器名。同页面宿主/远程必须唯一(也是 uniqueName);须匹配 `/^[a-zA-Z][\w.-]*$/` |
|
|
163
163
|
| `filename` | `string` | `'fulgurjs-remoteEntry.js'` | prod 容器入口文件名(固定文件名,CDN 可长缓存) |
|
|
164
164
|
| `exposes` | `Record<string, string \| { import: string; name?: string }>` | — | 对外暴露模块:键 `'./X'`,值源文件路径;`name` 为稳定 chunk 文件名 |
|
|
165
|
-
| `remotes` | `Record<string, string \|
|
|
165
|
+
| `remotes` | `Record<string, string \| RemoteEntryConfig \| (() => Promise<any>)>` | — | 消费的远程,三种形态见下表 |
|
|
166
166
|
| `shared` | `string[] \| Record<string, string \| SharedHint>` | — | 共享依赖;字符串简写 = requiredVersion(缺省从本应用 package.json 推断) |
|
|
167
167
|
| `shareScope` | `string` | `'default'` | 默认共享作用域名 |
|
|
168
168
|
| `remoteType` | `string` | `'module'` | 仅支持 `'module'`(传其它值告警并回落) |
|
|
@@ -244,11 +244,11 @@ import { loadRemote } from 'virtual:fulgurjs-runtime'
|
|
|
244
244
|
| `loadShare` | `(name: string, opts?) => Promise<命名空间>` | 共享模块协商(最高版本胜出/已加载优先/singleton 收敛)。opts:`{ requiredVersion?, singleton?, strictVersion?, shareKey?, shareScope?, fallback? }` |
|
|
245
245
|
| `preloadRemote` | `(spec: string, opts?: { mode?: 'preload' \| 'prefetch' }) => Promise<void>` | 按 manifest 精确预载该远程全部 expose chunk + CSS(prefetch = 空闲时低优先级) |
|
|
246
246
|
| `getContainer` | `(name: string) => Promise<容器>` | 取远程容器(触发加载 + init),容器协议 `{ name, init, get }` |
|
|
247
|
-
| `registerRemote` / `registerRemotes` | `(config \| list) => void` | 运行时注册远程(promise remote /
|
|
247
|
+
| `registerRemote` / `registerRemotes` | `(config \| list) => void` | 运行时注册远程(promise remote / 动态地址)。`RemoteInput`:`{ name, entry, shareScope?, timeout?, retries?, fallback?, breaker? }` |
|
|
248
248
|
| `registerShare` | `(scope, name, version, get, opts?) => void` | 手工注册共享模块(一般由 init 模块自动完成) |
|
|
249
249
|
| `initSharing` | `(scopeName?) => ShareScopeMap` | 初始化共享作用域(一般由 init 模块自动完成) |
|
|
250
250
|
| `registerPlugins` | `(plugins: RuntimePlugin[]) => void` | 注册运行时插件(见下) |
|
|
251
|
-
| `getRuntime` | `() =>
|
|
251
|
+
| `getRuntime` | `() => FgRuntime` | 取运行时单例本体(与 `__FULGURJS_RUNTIME__` 同一实例) |
|
|
252
252
|
| `version` | `string` | 运行时/插件版本(跨源副本一致性诊断用) |
|
|
253
253
|
| `unwrapDefault` | `(ns: any) => any` | ESM/CJS default interop 工具 |
|
|
254
254
|
|
|
@@ -290,15 +290,15 @@ export default {
|
|
|
290
290
|
| `window.__FULGURJS_APP_CONFIG__` | W4 全局配置镜像 |
|
|
291
291
|
| `window` 事件 `fulgurjs:error` | `CustomEvent<{ remote, error }>`,所有远程加载/共享错误都会发出 |
|
|
292
292
|
|
|
293
|
-
### 3. `
|
|
293
|
+
### 3. `definePages` — 宿主页面路由表(`@fulgurjs/federation/pages`)
|
|
294
294
|
|
|
295
295
|
宿主把「URL 路径 → 远程 exposes 键」的映射表交给它校验,带参路由的静默冲突在启动期报错而不是运行时加载错组件:
|
|
296
296
|
|
|
297
297
|
```ts
|
|
298
|
-
import {
|
|
298
|
+
import { definePages } from '@fulgurjs/federation/pages'
|
|
299
299
|
import remoteSchema from 'virtual:fulgurjs-remote-schema' // dev 自动生成;build 恒为空(诚实降级)
|
|
300
300
|
|
|
301
|
-
export const PAGES =
|
|
301
|
+
export const PAGES = definePages(
|
|
302
302
|
[
|
|
303
303
|
{ route: '/remote-a/home', name: 'RemoteAHome', title: '首页' },
|
|
304
304
|
// 带参路由:缺省推导 spec = 去首段 + 剥 :参 段;与其它条目冲突时 ERROR,
|
|
@@ -324,14 +324,14 @@ export const PAGES = defineFulgurjsPages(
|
|
|
324
324
|
| R4 | ERROR | 静态路由被更靠前的带参路由遮蔽(先到先得)/路由完全重复 |
|
|
325
325
|
| R5 | WARN | name 重复(vue-router 命名跳转歧义) |
|
|
326
326
|
|
|
327
|
-
`
|
|
327
|
+
`validatePages(pages, options)` 为独立导出:返回违例清单不抛错,便于自测。
|
|
328
328
|
|
|
329
329
|
### 4. `fulgurjs.config.ts` — CLI 单配置文件(`@fulgurjs/federation/config`)
|
|
330
330
|
|
|
331
331
|
```ts
|
|
332
|
-
import {
|
|
332
|
+
import { defineRepoConfig } from '@fulgurjs/federation/config'
|
|
333
333
|
|
|
334
|
-
export default
|
|
334
|
+
export default defineRepoConfig({
|
|
335
335
|
root: process.cwd(), // 工程根(monorepo 根或单应用仓库根)
|
|
336
336
|
apps: [
|
|
337
337
|
{
|
|
@@ -396,7 +396,7 @@ export default defineFulgurjsConfig({
|
|
|
396
396
|
| | `MFU-008` | 未知远程 |
|
|
397
397
|
| | `MFU-009` | 加载到的模块没有任何导出 |
|
|
398
398
|
| | `MFU-010` | singleton 共享版本漂移(使用作用域版本,告警) |
|
|
399
|
-
| CC 跨应用上下文 | `CC-001` | AppContext 必需字段缺失(三段式:got/expected/example,修法指向宿主桥 `
|
|
399
|
+
| CC 跨应用上下文 | `CC-001` | AppContext 必需字段缺失(三段式:got/expected/example,修法指向宿主桥 `provideAppContext`) |
|
|
400
400
|
| | `CC-002` | 运行时单例不可用(独立直开远程页;修法 = 经宿主联邦加载,时序契约 bridge → federatedBoot → loadRemote) |
|
|
401
401
|
|
|
402
402
|
错误排查三段式文案见「配置出错?报错看得懂」一节(下文);`fulgurjs doctor` 可提前把部署面的 MFU-001 类问题拦在上线前。
|
|
@@ -441,15 +441,15 @@ const FederatedAmisForm = remoteComponent('demo-host/AmisFormRouterPage', {
|
|
|
441
441
|
- `vue` 为**可选 peerDependency**(`peerDependenciesMeta.optional`):仅使用 `./vue` 子路径时才需要安装 Vue;runtime.js 保持框架无关(不 import vue),体积零增量;
|
|
442
442
|
- 运行时实例经 `globalThis.__FULGURJS_RUNTIME__` 页面级单例复用,与 `virtual:fulgurjs-runtime` 的导入殊途同归,无需额外接线。
|
|
443
443
|
|
|
444
|
-
### 9. `
|
|
444
|
+
### 9. `AppContext` — 跨应用传值与方法引用(`@fulgurjs/federation/context`)
|
|
445
445
|
|
|
446
446
|
宿主向子应用传值、子应用向宿主反向注册方法,一律走这条一等公民通道(对标乾坤 `props`,但带类型与错误契约)——不再各自挂 `window.*` 裸口子。
|
|
447
447
|
|
|
448
448
|
```ts
|
|
449
449
|
// —— 宿主桥(host/src/fulgurjs/host/bridge.ts):登录完成后一次性提供 ——
|
|
450
|
-
import {
|
|
450
|
+
import { provideAppContext } from '@fulgurjs/federation/context'
|
|
451
451
|
|
|
452
|
-
|
|
452
|
+
provideAppContext({
|
|
453
453
|
user, // 宿主登录用户原始形态
|
|
454
454
|
getToken, // 取最新 token(拉取式防过期)
|
|
455
455
|
store: piniaInstance, // 宿主 pinia:子应用 useUserStore(ctx.store) 共享响应式状态
|
|
@@ -460,18 +460,18 @@ provideFulgurjsAppContext({
|
|
|
460
460
|
})
|
|
461
461
|
|
|
462
462
|
// —— 远程 boot(exposes/federatedBoot.ts):显式校验消费 ——
|
|
463
|
-
import {
|
|
463
|
+
import { requireAppContext } from '@fulgurjs/federation/context'
|
|
464
464
|
|
|
465
|
-
const { store, user, hostApp } =
|
|
465
|
+
const { store, user, hostApp } = requireAppContext('store', 'user', 'hostApp')
|
|
466
466
|
// 缺任一键 → [fulgurjs:CC-001] 三段式抛错(got / expected / example 指向宿主桥);
|
|
467
467
|
// 页面无运行时单例(独立直开远程页)→ [fulgurjs:CC-002] 显式,修法 = 经宿主联邦加载。
|
|
468
468
|
|
|
469
469
|
// —— 远程页面读点 ——
|
|
470
|
-
import {
|
|
471
|
-
const dict =
|
|
470
|
+
import { getAppContext } from '@fulgurjs/federation/context'
|
|
471
|
+
const dict = getAppContext().events?.main?.getDictItems?.('sex')
|
|
472
472
|
|
|
473
473
|
// —— 子应用反向注册方法给宿主(页面 onUnmounted 时记得摘除,见迁移指南「页面卸载清理清单」)——
|
|
474
|
-
|
|
474
|
+
getAppContext().events!.bpm = { formEvent, formSubmitEvent }
|
|
475
475
|
```
|
|
476
476
|
|
|
477
477
|
标准字段表:
|
|
@@ -709,15 +709,25 @@ const Panel = await loadRemote('shop/Panel', {
|
|
|
709
709
|
## 开发与测试
|
|
710
710
|
|
|
711
711
|
```bash
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
pnpm
|
|
715
|
-
|
|
716
|
-
|
|
712
|
+
# 各子项目独立安装(根目录不是 workspace);插件需先 build,
|
|
713
|
+
# fixtures 经 link: 消费插件 dist,而 dist 运行时依赖就地安装在插件目录
|
|
714
|
+
pnpm --dir packages/plugin install && pnpm --dir packages/plugin build
|
|
715
|
+
for app in fixtures/host-vue fixtures/remote-a fixtures/remote-b e2e; do pnpm --dir "$app" install; done
|
|
716
|
+
|
|
717
|
+
pnpm test:unit # 单测(188)
|
|
718
|
+
pnpm test:dev # dev e2e(10)
|
|
719
|
+
pnpm test:prod # prod e2e(8,需 NGINX,见 e2e/scripts/prod-setup.sh)
|
|
720
|
+
pnpm test # unit + dev + prod 全跑
|
|
721
|
+
pnpm --dir e2e exec playwright test --project=dev --project=fault # dev + 容错 e2e(12)
|
|
717
722
|
bash e2e/h7-install-test.sh # H7 装后实测:pack → 干净目录 → dev+prod 双引擎断言
|
|
718
723
|
```
|
|
719
724
|
|
|
720
|
-
CI(GitHub Actions
|
|
725
|
+
CI(GitHub Actions,每次推送/PR 自动运行)两个作业:
|
|
726
|
+
|
|
727
|
+
- `test`:单测 + 双口径 typecheck(pinned / latest)+ build 门禁(runtime gzip ≤ 6144B、错误码三方一致性);
|
|
728
|
+
- `e2e`:fixtures e2e(dev + fault 共 12 例)× Vite 6.4.3 / 7.3.6 / 8.3.0 兼容矩阵。
|
|
729
|
+
|
|
730
|
+
prod e2e 需 NGINX,不进 CI(本地或真实项目 testbed 验证)。
|
|
721
731
|
|
|
722
732
|
## License
|
|
723
733
|
|
package/client.d.ts
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* virtual:fulgurjs-runtime 客户端类型声明。
|
|
3
3
|
*
|
|
4
4
|
* 用法(二选一):
|
|
5
|
-
* 1. dev
|
|
6
|
-
*
|
|
5
|
+
* 1. dev 启动后插件自动在类型目录(默认 src/fulgurjs/types/,无 src 布局回退 .fulgurjs/types/)
|
|
6
|
+
* 生成 fulgurjs-runtime.d.ts 加载垫片——只要 tsconfig include 了该目录
|
|
7
|
+
* (远程模块类型直连本就要求),运行时类型零配置生效;
|
|
7
8
|
* 2. tsconfig.json → compilerOptions.types 加 "@fulgurjs/federation/client"(对齐 vite/client 模式)。
|
|
8
9
|
*
|
|
9
10
|
* ⚠️ 本文件必须是 script 形态(顶层不得出现 import/export)——环境模块声明
|
|
@@ -64,7 +65,7 @@ declare module 'virtual:fulgurjs-runtime' {
|
|
|
64
65
|
* 此处仅类型随虚拟模块声明供 type-only import);读写约定:宿主桥先写标准字段,
|
|
65
66
|
* 远程 boot 只增不改宿主键;嵌套对象(如 events)引用共享。
|
|
66
67
|
*/
|
|
67
|
-
export interface
|
|
68
|
+
export interface AppContext {
|
|
68
69
|
/** 宿主登录用户原始形态(只读约定) */
|
|
69
70
|
user: Record<string, any>
|
|
70
71
|
/** 取最新 token(拉取式防过期;0.8.2 起 bridge 不再传一次性 token 快照) */
|
|
@@ -82,9 +83,9 @@ declare module 'virtual:fulgurjs-runtime' {
|
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
/** 运行时单例(与 globalThis.__FULGURJS_RUNTIME__ 同一实例,方法面冻结) */
|
|
85
|
-
export interface
|
|
86
|
+
export interface FgRuntime {
|
|
86
87
|
shareScopeMap: Record<string, Record<string, Record<string, ShareEntry>>>
|
|
87
|
-
initSharing(scopeName?: string):
|
|
88
|
+
initSharing(scopeName?: string): FgRuntime['shareScopeMap']
|
|
88
89
|
registerShare(
|
|
89
90
|
scopeName: string,
|
|
90
91
|
name: string,
|
|
@@ -103,10 +104,10 @@ declare module 'virtual:fulgurjs-runtime' {
|
|
|
103
104
|
}
|
|
104
105
|
|
|
105
106
|
export const version: string
|
|
106
|
-
export const runtime:
|
|
107
|
-
export const shareScopeMap:
|
|
108
|
-
export function getRuntime():
|
|
109
|
-
export function initSharing(scopeName?: string):
|
|
107
|
+
export const runtime: FgRuntime
|
|
108
|
+
export const shareScopeMap: FgRuntime['shareScopeMap']
|
|
109
|
+
export function getRuntime(): FgRuntime
|
|
110
|
+
export function initSharing(scopeName?: string): FgRuntime['shareScopeMap']
|
|
110
111
|
export function registerShare(
|
|
111
112
|
scopeName: string,
|
|
112
113
|
name: string,
|
|
@@ -127,6 +128,6 @@ declare module 'virtual:fulgurjs-runtime' {
|
|
|
127
128
|
/** 兜底解包:命名空间有 default 取 default,否则原样返回 */
|
|
128
129
|
export function unwrapDefault<T>(ns: { default?: T } | T): T
|
|
129
130
|
/** 与 globalThis.__FULGURJS_RUNTIME__ 同一实例(方法面冻结) */
|
|
130
|
-
const runtimeDefault:
|
|
131
|
+
const runtimeDefault: FgRuntime
|
|
131
132
|
export default runtimeDefault
|
|
132
133
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// src/runtime/errors.ts
|
|
2
|
-
var
|
|
2
|
+
var FgError = class extends Error {
|
|
3
3
|
code;
|
|
4
4
|
details;
|
|
5
5
|
constructor(code, message, details) {
|
|
6
6
|
super(`[fulgurjs:${code}] ${message}`);
|
|
7
|
-
this.name = "
|
|
7
|
+
this.name = "FgError";
|
|
8
8
|
this.code = code;
|
|
9
9
|
this.details = details;
|
|
10
10
|
}
|
|
@@ -33,6 +33,6 @@ var ErrorCodes = {
|
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
export {
|
|
36
|
-
|
|
36
|
+
FgError,
|
|
37
37
|
ErrorCodes
|
|
38
38
|
};
|
package/dist/cli.js
CHANGED
|
@@ -10,7 +10,7 @@ var __export = (target, all) => {
|
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
// src/config.ts
|
|
13
|
-
async function
|
|
13
|
+
async function loadRepoConfig(configPath) {
|
|
14
14
|
const { pathToFileURL, fileURLToPath } = await import("node:url");
|
|
15
15
|
const { createRequire } = await import("node:module");
|
|
16
16
|
const fs2 = await import("node:fs");
|
|
@@ -187,7 +187,7 @@ function appSummary(app) {
|
|
|
187
187
|
return lines.join("\n");
|
|
188
188
|
}
|
|
189
189
|
async function inspectConfig(configPath) {
|
|
190
|
-
const cfg = await
|
|
190
|
+
const cfg = await loadRepoConfig(configPath);
|
|
191
191
|
const out = [];
|
|
192
192
|
out.push(`${MARK} \u914D\u7F6E\u6821\u9A8C\u901A\u8FC7\uFF1Aroot=${cfg.root}\uFF0Capps=${cfg.apps.length}`);
|
|
193
193
|
out.push("\u5E94\u7528\u6458\u8981\uFF1A");
|
|
@@ -205,7 +205,7 @@ async function inspectConfig(configPath) {
|
|
|
205
205
|
out.push("2. expose \u4E00\u5F8B\u6307\u5411\u72EC\u7ACB\u9875\uFF08\u9875\u9762\u4ECE\u8DEF\u7531\u53D6\u53C2\uFF09\uFF1B\u7EC4\u4EF6\u9700\u8981\u5FC5\u586B props \u65F6\u7ED9\u9ED8\u8BA4\u503C\uFF08BLD-003\uFF09");
|
|
206
206
|
out.push("3. shared \u91CC vue / vue-router / pinia \u5EFA\u8BAE singleton: true\u2014\u2014\u8DE8\u5E94\u7528\u5FC5\u987B\u540C\u5B9E\u4F8B\uFF08\u5168\u5C40\u54CD\u5E94\u6027\u3001getActivePinia\u3001\u8DEF\u7531\u6CE8\u5165\uFF09");
|
|
207
207
|
out.push("4. \u8FDC\u7A0B\u7684\u5168\u5C40\u526F\u4F5C\u7528\uFF08\u5168\u5C40\u7EC4\u4EF6/\u6307\u4EE4/\u542F\u52A8\u671F\u521D\u59CB\u5316\uFF09\u5C01\u88C5\u4E3A\u542F\u52A8\u5668\u6A21\u5757\u5E76 expose\uFF0C\u5BBF\u4E3B\u5728 loadRemote \u9875\u9762\u524D\u8C03\u7528\uFF1B");
|
|
208
|
-
out.push(" \u8DE8\u5E94\u7528\u4F20\u503C\uFF08locale/store/\u4E8B\u4EF6\u7B49\uFF09\u7EDF\u4E00\u8D70 @fulgurjs/federation/context\uFF1A\u5BBF\u4E3B
|
|
208
|
+
out.push(" \u8DE8\u5E94\u7528\u4F20\u503C\uFF08locale/store/\u4E8B\u4EF6\u7B49\uFF09\u7EDF\u4E00\u8D70 @fulgurjs/federation/context\uFF1A\u5BBF\u4E3B provideAppContext \u4E00\u6B21\u5199\u5165\uFF0C\u8FDC\u7A0B boot \u7528 getAppContext / requireAppContext \u6D88\u8D39");
|
|
209
209
|
out.push("5. \u8FDC\u7A0B\u9875\u9762\u53EF\u76F4\u63A5\u9759\u6001\u5BFC\u5165 virtual:fulgurjs-runtime\uFF08\u63D2\u4EF6\u81EA\u52A8\u6539\u5199\u4E3A\u60F0\u6027\u5355\u4F8B\u59D4\u6258\uFF09\uFF1B\u7279\u9700\u76F4\u53D6\u5168\u5C40\u5355\u4F8B\u65F6\u7528 getRuntime()");
|
|
210
210
|
out.push('6. dev \u51B7\u542F\u52A8\u9996\u8F6E 30~60s \u6709\u9884\u6784\u5EFA\u7A97\u53E3\uFF08\u77AC\u65F6 504/"ce"\uFF0CDEV-010\uFF09\uFF1A\u5148\u771F\u5B9E\u6253\u5F00\u9875\u9762\u9884\u70ED\u518D\u505A\u65AD\u8A00');
|
|
211
211
|
out.push("7. \u90E8\u7F72\u540E\u4F53\u68C0\uFF1Afulgurjs doctor --base <URL> --apps <\u5E94\u7528...>\uFF08\u7F13\u5B58\u5934/\u8D44\u6E90\u5F62\u6001/CORS/chunk \u53EF\u8FBE/\u7248\u672C skew\uFF09");
|
|
@@ -221,9 +221,9 @@ var init_init = __esm({
|
|
|
221
221
|
STARTER_CONFIG = `// fulgurjs.config.ts \u2014\u2014 @fulgurjs/federation \u63A5\u5165\u914D\u7F6E\uFF08\u5355\u6587\u4EF6\u9A71\u52A8\uFF0C\u53EF\u5165\u5E93\u3001\u53EF\u590D\u8DD1\uFF09
|
|
222
222
|
// \u7528\u6CD5\uFF1Anpx fulgurjs init --config fulgurjs.config.ts \u6821\u9A8C\u914D\u7F6E\u5E76\u8F93\u51FA\u53EF\u7C98\u8D34\u6837\u677F\u4E0E\u6838\u5BF9\u6E05\u5355
|
|
223
223
|
// npx fulgurjs doctor --base http://<\u7AD9\u70B9> --apps <\u5E94\u7528\u76EE\u5F55\u540D...> \u90E8\u7F72\u4F53\u68C0
|
|
224
|
-
import {
|
|
224
|
+
import { defineRepoConfig } from '@fulgurjs/federation/config'
|
|
225
225
|
|
|
226
|
-
export default
|
|
226
|
+
export default defineRepoConfig({
|
|
227
227
|
// \u5DE5\u7A0B\u6839\u76EE\u5F55\uFF08monorepo \u6839\u6216\u5355\u5E94\u7528\u4ED3\u5E93\u6839\uFF09
|
|
228
228
|
root: process.cwd(),
|
|
229
229
|
apps: [
|
package/dist/config.cjs
CHANGED
|
@@ -30,15 +30,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/config.ts
|
|
31
31
|
var config_exports = {};
|
|
32
32
|
__export(config_exports, {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
defineRepoConfig: () => defineRepoConfig,
|
|
34
|
+
loadRepoConfig: () => loadRepoConfig
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(config_exports);
|
|
37
37
|
var import_meta = {};
|
|
38
|
-
function
|
|
38
|
+
function defineRepoConfig(config) {
|
|
39
39
|
return config;
|
|
40
40
|
}
|
|
41
|
-
async function
|
|
41
|
+
async function loadRepoConfig(configPath) {
|
|
42
42
|
const { pathToFileURL, fileURLToPath } = await import("url");
|
|
43
43
|
const { createRequire } = await import("module");
|
|
44
44
|
const fs = await import("fs");
|
|
@@ -109,6 +109,6 @@ async function loadFulgurjsConfig(configPath) {
|
|
|
109
109
|
}
|
|
110
110
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
111
|
0 && (module.exports = {
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
defineRepoConfig,
|
|
113
|
+
loadRepoConfig
|
|
114
114
|
});
|
package/dist/config.d.cts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 主包内置 bin + 单配置文件驱动,可入库可复跑)。
|
|
4
4
|
* init 只消费该配置生成通用样板(见 init.ts);插件运行时(federation())不读取本文件。
|
|
5
5
|
*/
|
|
6
|
-
interface
|
|
6
|
+
interface PageEntry {
|
|
7
7
|
/** 宿主路由路径(参数段用 :xx) */
|
|
8
8
|
route: string;
|
|
9
9
|
/** 路由 name(命名跳转依赖) */
|
|
@@ -13,25 +13,25 @@ interface FulgurjsPageEntry {
|
|
|
13
13
|
/** 页签标题 */
|
|
14
14
|
title?: string;
|
|
15
15
|
}
|
|
16
|
-
interface
|
|
16
|
+
interface RemoteAddress {
|
|
17
17
|
dev: string;
|
|
18
18
|
prod: string;
|
|
19
19
|
}
|
|
20
|
-
interface
|
|
20
|
+
interface HostConfig {
|
|
21
21
|
/** 页面路由表 */
|
|
22
|
-
pages:
|
|
22
|
+
pages: PageEntry[];
|
|
23
23
|
/** 路由前缀 → 远程名 */
|
|
24
24
|
remotePrefixes: Record<string, string>;
|
|
25
25
|
/** 消费的远程地址(键 = import 前缀;裸 URL,对象形式不支持 name@ 前缀) */
|
|
26
|
-
remotes: Record<string,
|
|
26
|
+
remotes: Record<string, RemoteAddress>;
|
|
27
27
|
}
|
|
28
|
-
interface
|
|
28
|
+
interface RemoteConfig {
|
|
29
29
|
/** exposes:./键 → 源文件(独立页) */
|
|
30
30
|
exposes: Record<string, string>;
|
|
31
31
|
/** 反向消费的远程(双向联邦时;dev 下自身源码参与协商需 devSharedSelf: true) */
|
|
32
|
-
remotes?: Record<string,
|
|
32
|
+
remotes?: Record<string, RemoteAddress>;
|
|
33
33
|
}
|
|
34
|
-
interface
|
|
34
|
+
interface AppConfig {
|
|
35
35
|
/** 相对 root 的应用目录 */
|
|
36
36
|
path: string;
|
|
37
37
|
/** 联邦容器名 */
|
|
@@ -43,30 +43,30 @@ interface FulgurjsAppConfig {
|
|
|
43
43
|
/** 部署目录名(缺省取 base 去斜杠) */
|
|
44
44
|
deployDir?: string;
|
|
45
45
|
/** 宿主角色 */
|
|
46
|
-
host?:
|
|
46
|
+
host?: HostConfig;
|
|
47
47
|
/** 远程角色 */
|
|
48
|
-
remote?:
|
|
48
|
+
remote?: RemoteConfig;
|
|
49
49
|
/** 该应用的 shared 表(缺省建议 vue/vue-router/pinia singleton,见 init 输出的样板) */
|
|
50
50
|
shared?: Record<string, {
|
|
51
51
|
singleton?: boolean;
|
|
52
52
|
requiredVersion?: string;
|
|
53
53
|
}>;
|
|
54
54
|
}
|
|
55
|
-
interface
|
|
55
|
+
interface DeployConfig {
|
|
56
56
|
/** NGINX 站点根(样板输出用,可选) */
|
|
57
57
|
webRoot?: string;
|
|
58
58
|
/** 监听端口(样板输出用,可选) */
|
|
59
59
|
listen?: number;
|
|
60
60
|
}
|
|
61
|
-
interface
|
|
61
|
+
interface RepoConfig {
|
|
62
62
|
/** 工程根(monorepo 根或单应用仓库根) */
|
|
63
63
|
root: string;
|
|
64
|
-
apps:
|
|
65
|
-
deploy?:
|
|
64
|
+
apps: AppConfig[];
|
|
65
|
+
deploy?: DeployConfig;
|
|
66
66
|
}
|
|
67
|
-
type
|
|
67
|
+
type UserConfig = Partial<RepoConfig>;
|
|
68
68
|
/** 用户配置文件入口:仅做类型收窄(identity),不引入运行时逻辑 */
|
|
69
|
-
declare function
|
|
69
|
+
declare function defineRepoConfig(config: UserConfig): UserConfig;
|
|
70
70
|
/**
|
|
71
71
|
* 加载 fulgurjs.config.ts(或 .js/.json)。
|
|
72
72
|
* - 配置内的 `@fulgurjs/federation/config` 导入被重写为本包 dist/config.js 绝对路径——
|
|
@@ -74,6 +74,6 @@ declare function defineFulgurjsConfig(config: FulgurjsUserConfig): FulgurjsUserC
|
|
|
74
74
|
* - TS 走 Node 原生类型剥离(Node ≥23.6 默认开启;配置文件须用可擦除语法——纯对象无 enum/namespace);
|
|
75
75
|
* 老版本 Node 回退 esbuild 转译(先试配置工程,再试 CLI 自带依赖树)。
|
|
76
76
|
*/
|
|
77
|
-
declare function
|
|
77
|
+
declare function loadRepoConfig(configPath: string): Promise<RepoConfig>;
|
|
78
78
|
|
|
79
|
-
export { type
|
|
79
|
+
export { type AppConfig, type DeployConfig, type HostConfig, type PageEntry, type RemoteAddress, type RemoteConfig, type RepoConfig, type UserConfig, defineRepoConfig, loadRepoConfig };
|
package/dist/config.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* 主包内置 bin + 单配置文件驱动,可入库可复跑)。
|
|
4
4
|
* init 只消费该配置生成通用样板(见 init.ts);插件运行时(federation())不读取本文件。
|
|
5
5
|
*/
|
|
6
|
-
interface
|
|
6
|
+
interface PageEntry {
|
|
7
7
|
/** 宿主路由路径(参数段用 :xx) */
|
|
8
8
|
route: string;
|
|
9
9
|
/** 路由 name(命名跳转依赖) */
|
|
@@ -13,25 +13,25 @@ interface FulgurjsPageEntry {
|
|
|
13
13
|
/** 页签标题 */
|
|
14
14
|
title?: string;
|
|
15
15
|
}
|
|
16
|
-
interface
|
|
16
|
+
interface RemoteAddress {
|
|
17
17
|
dev: string;
|
|
18
18
|
prod: string;
|
|
19
19
|
}
|
|
20
|
-
interface
|
|
20
|
+
interface HostConfig {
|
|
21
21
|
/** 页面路由表 */
|
|
22
|
-
pages:
|
|
22
|
+
pages: PageEntry[];
|
|
23
23
|
/** 路由前缀 → 远程名 */
|
|
24
24
|
remotePrefixes: Record<string, string>;
|
|
25
25
|
/** 消费的远程地址(键 = import 前缀;裸 URL,对象形式不支持 name@ 前缀) */
|
|
26
|
-
remotes: Record<string,
|
|
26
|
+
remotes: Record<string, RemoteAddress>;
|
|
27
27
|
}
|
|
28
|
-
interface
|
|
28
|
+
interface RemoteConfig {
|
|
29
29
|
/** exposes:./键 → 源文件(独立页) */
|
|
30
30
|
exposes: Record<string, string>;
|
|
31
31
|
/** 反向消费的远程(双向联邦时;dev 下自身源码参与协商需 devSharedSelf: true) */
|
|
32
|
-
remotes?: Record<string,
|
|
32
|
+
remotes?: Record<string, RemoteAddress>;
|
|
33
33
|
}
|
|
34
|
-
interface
|
|
34
|
+
interface AppConfig {
|
|
35
35
|
/** 相对 root 的应用目录 */
|
|
36
36
|
path: string;
|
|
37
37
|
/** 联邦容器名 */
|
|
@@ -43,30 +43,30 @@ interface FulgurjsAppConfig {
|
|
|
43
43
|
/** 部署目录名(缺省取 base 去斜杠) */
|
|
44
44
|
deployDir?: string;
|
|
45
45
|
/** 宿主角色 */
|
|
46
|
-
host?:
|
|
46
|
+
host?: HostConfig;
|
|
47
47
|
/** 远程角色 */
|
|
48
|
-
remote?:
|
|
48
|
+
remote?: RemoteConfig;
|
|
49
49
|
/** 该应用的 shared 表(缺省建议 vue/vue-router/pinia singleton,见 init 输出的样板) */
|
|
50
50
|
shared?: Record<string, {
|
|
51
51
|
singleton?: boolean;
|
|
52
52
|
requiredVersion?: string;
|
|
53
53
|
}>;
|
|
54
54
|
}
|
|
55
|
-
interface
|
|
55
|
+
interface DeployConfig {
|
|
56
56
|
/** NGINX 站点根(样板输出用,可选) */
|
|
57
57
|
webRoot?: string;
|
|
58
58
|
/** 监听端口(样板输出用,可选) */
|
|
59
59
|
listen?: number;
|
|
60
60
|
}
|
|
61
|
-
interface
|
|
61
|
+
interface RepoConfig {
|
|
62
62
|
/** 工程根(monorepo 根或单应用仓库根) */
|
|
63
63
|
root: string;
|
|
64
|
-
apps:
|
|
65
|
-
deploy?:
|
|
64
|
+
apps: AppConfig[];
|
|
65
|
+
deploy?: DeployConfig;
|
|
66
66
|
}
|
|
67
|
-
type
|
|
67
|
+
type UserConfig = Partial<RepoConfig>;
|
|
68
68
|
/** 用户配置文件入口:仅做类型收窄(identity),不引入运行时逻辑 */
|
|
69
|
-
declare function
|
|
69
|
+
declare function defineRepoConfig(config: UserConfig): UserConfig;
|
|
70
70
|
/**
|
|
71
71
|
* 加载 fulgurjs.config.ts(或 .js/.json)。
|
|
72
72
|
* - 配置内的 `@fulgurjs/federation/config` 导入被重写为本包 dist/config.js 绝对路径——
|
|
@@ -74,6 +74,6 @@ declare function defineFulgurjsConfig(config: FulgurjsUserConfig): FulgurjsUserC
|
|
|
74
74
|
* - TS 走 Node 原生类型剥离(Node ≥23.6 默认开启;配置文件须用可擦除语法——纯对象无 enum/namespace);
|
|
75
75
|
* 老版本 Node 回退 esbuild 转译(先试配置工程,再试 CLI 自带依赖树)。
|
|
76
76
|
*/
|
|
77
|
-
declare function
|
|
77
|
+
declare function loadRepoConfig(configPath: string): Promise<RepoConfig>;
|
|
78
78
|
|
|
79
|
-
export { type
|
|
79
|
+
export { type AppConfig, type DeployConfig, type HostConfig, type PageEntry, type RemoteAddress, type RemoteConfig, type RepoConfig, type UserConfig, defineRepoConfig, loadRepoConfig };
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/config.ts
|
|
2
|
-
function
|
|
2
|
+
function defineRepoConfig(config) {
|
|
3
3
|
return config;
|
|
4
4
|
}
|
|
5
|
-
async function
|
|
5
|
+
async function loadRepoConfig(configPath) {
|
|
6
6
|
const { pathToFileURL, fileURLToPath } = await import("url");
|
|
7
7
|
const { createRequire } = await import("module");
|
|
8
8
|
const fs = await import("fs");
|
|
@@ -72,6 +72,6 @@ async function loadFulgurjsConfig(configPath) {
|
|
|
72
72
|
return cfg;
|
|
73
73
|
}
|
|
74
74
|
export {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
defineRepoConfig,
|
|
76
|
+
loadRepoConfig
|
|
77
77
|
};
|