@fulgurjs/federation 5.9.3 → 6.1.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 +66 -0
- package/README.en.md +57 -416
- package/README.md +56 -446
- package/dist/bridge-app-vue.d.cts +1 -1
- package/dist/bridge-app-vue.d.ts +1 -1
- package/dist/bridge-core.cjs +1 -1
- package/dist/bridge-core.js +2 -2
- package/dist/bridge-errors.cjs +1 -1
- package/dist/bridge-errors.js +1 -1
- package/dist/bridge-host-react.cjs +1 -1
- package/dist/bridge-host-react.js +3 -3
- package/dist/bridge-host-vue.cjs +1 -1
- package/dist/bridge-host-vue.js +3 -3
- package/dist/bridge-router-react.d.ts +22 -3
- package/dist/bridge-router-react.js +107 -9
- package/dist/bridge-router-vue.d.ts +24 -5
- package/dist/bridge-router-vue.js +4 -5
- package/dist/{chunk-YKIFZIBH.js → chunk-77JZ6U6V.js} +1 -1
- package/dist/{chunk-Q6V5O5Y6.js → chunk-ENT3BOTX.js} +1 -1
- package/dist/{chunk-WRJG2YG6.js → chunk-ZAYNS7YQ.js} +1 -1
- package/dist/cli.js +460 -109
- package/dist/index.cjs +25 -38
- package/dist/index.js +25 -38
- package/dist/react-adapter.d.cts +7 -0
- package/dist/react-adapter.d.ts +7 -0
- package/dist/react.d.ts +229 -101
- package/dist/react.js +4 -0
- package/dist/runtime-entry.d.ts +27 -174
- package/dist/runtime-entry.js +0 -1
- package/dist/runtime.js +19 -17
- package/dist/vue-adapter.cjs +13 -1
- package/dist/vue-adapter.d.cts +1 -0
- package/dist/vue-adapter.d.ts +1 -0
- package/dist/vue-adapter.js +14 -2
- package/dist/vue.d.ts +594 -0
- package/dist/vue.js +8 -0
- package/docs/en/migration.md +210 -0
- package/docs/en/reference/api.md +555 -0
- package/docs/en/reference/errors.md +86 -0
- package/docs/{P5-vite7-8 → maintainers/P5-vite7-8}/345/205/274/345/256/271/347/237/251/351/230/265.md +7 -9
- package/docs/{webpack-mf- → maintainers/webpack-mf-}/345/257/271/347/205/247/344/270/216/347/274/272/345/217/243.md +10 -10
- package/docs/maintainers//346/262/231/347/256/261/350/276/271/347/225/214/345/256/241/350/256/241.md +43 -0
- package/docs/zh/migration.md +210 -0
- package/docs/zh/reference/api.md +551 -0
- package/docs/zh/reference/errors.md +86 -0
- package/examples/templates/README.md +1 -1
- package/examples/templates/react-host-vue-remote/pnpm-lock.yaml +7 -7
- package/examples/templates/react-host-vue-remote/pnpm-workspace.yaml +1 -1
- package/examples/templates/react-host-vue-remote/react-host/README.md +2 -2
- package/examples/templates/react-host-vue-remote/react-host/package.json +1 -1
- package/examples/templates/react-host-vue-remote/react-host/src/main.tsx +2 -2
- package/examples/templates/react-host-vue-remote/scripts/dev.config.json +11 -2
- package/examples/templates/react-host-vue-remote/vue-remote/package.json +1 -1
- package/examples/templates/react-host-vue-remote/vue-remote/src/bridge.ts +1 -1
- package/examples/templates/react-react/host/package.json +1 -1
- package/examples/templates/react-react/pnpm-lock.yaml +7 -7
- package/examples/templates/react-react/pnpm-workspace.yaml +1 -1
- package/examples/templates/react-react/remote/package.json +1 -1
- package/examples/templates/react-react/scripts/dev.config.json +11 -2
- package/examples/templates/showcase/README.md +6 -6
- package/examples/templates/showcase/pnpm-lock.yaml +11 -11
- package/examples/templates/showcase/pnpm-workspace.yaml +1 -1
- package/examples/templates/showcase/react-host/package.json +1 -1
- package/examples/templates/showcase/react-host/src/pages/BridgeVuePage.tsx +1 -1
- package/examples/templates/showcase/react-host/src/routing.ts +1 -1
- package/examples/templates/showcase/react-remote/package.json +1 -1
- package/examples/templates/showcase/react-remote/src/bridge.tsx +1 -1
- package/examples/templates/showcase/scripts/dev.config.json +22 -4
- package/examples/templates/showcase/vue-host/package.json +1 -1
- package/examples/templates/showcase/vue-host/src/pages/BridgeReactPage.vue +1 -1
- package/examples/templates/showcase/vue-host/src/routing.ts +3 -13
- package/examples/templates/showcase/vue-remote/package.json +1 -1
- package/examples/templates/showcase/vue-remote/src/bridge.ts +2 -2
- package/examples/templates/vue-host-react-remote/pnpm-lock.yaml +7 -7
- package/examples/templates/vue-host-react-remote/pnpm-workspace.yaml +1 -1
- package/examples/templates/vue-host-react-remote/react-remote/package.json +1 -1
- package/examples/templates/vue-host-react-remote/scripts/dev.config.json +11 -2
- package/examples/templates/vue-host-react-remote/vue-host/README.md +2 -2
- package/examples/templates/vue-host-react-remote/vue-host/package.json +1 -1
- package/examples/templates/vue-host-react-remote/vue-host/src/App.vue +2 -2
- package/examples/templates/vue-vue/host/package.json +1 -1
- package/examples/templates/vue-vue/host/src/main.ts +28 -21
- package/examples/templates/vue-vue/host/src/pages/HomePage.vue +1 -1
- package/examples/templates/vue-vue/pnpm-lock.yaml +7 -7
- package/examples/templates/vue-vue/pnpm-workspace.yaml +1 -1
- package/examples/templates/vue-vue/remote/package.json +1 -1
- package/examples/templates/vue-vue/scripts/dev.config.json +11 -2
- package/package.json +24 -37
- package/dist/bridge-core-D37VanBl.d.ts +0 -99
- package/dist/bridge-host-react-CGymCzD2.d.ts +0 -35
- package/dist/bridge-host-vue-B3GHaQAC.d.ts +0 -32
- package/dist/bridge-react.d.ts +0 -14
- package/dist/bridge-react.js +0 -3
- package/dist/bridge-vue.d.ts +0 -8
- package/dist/bridge-vue.js +0 -3
- package/dist/bridge.d.ts +0 -18
- package/dist/bridge.js +0 -5
- package/dist/chunk-GLASM5EX.js +0 -1730
- package/dist/chunk-V6EASSCR.js +0 -249
- package/dist/chunk-X34EJB4H.js +0 -207
- package/docs/API.en.md +0 -339
- package/docs/API.md +0 -914
- package/docs//346/262/231/347/256/261/350/276/271/347/225/214/345/256/241/350/256/241.md +0 -45
- package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +0 -179
package/README.md
CHANGED
|
@@ -1,490 +1,100 @@
|
|
|
1
1
|
# @fulgurjs/federation
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**让一个 Vite 应用使用另一个应用提供的组件、页面、函数或完整子应用。**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
例如:主系统加载独立部署的审批页面,Vue 页面中嵌入 React 子应用,多个应用共享同一套依赖版本。提供方与使用方可以分仓库开发、独立构建部署。支持 Vue 3 与 React 18/19,Vite 5.1–8。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
[English](README.en.md) | **[完整文档中心](docs/README.md)**(中文 [docs/zh](docs/zh/README.md) · English [docs/en](docs/en/README.md))
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## 快速开始
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## 先看你要做什么
|
|
14
|
-
|
|
15
|
-
| 你的需求 | 使用方法 | 示例 |
|
|
16
|
-
|---|---|---|
|
|
17
|
-
| Vue 加载另一个应用的 Vue 组件 | `remoteComponent` | [Vue 示例](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates/vue-vue) |
|
|
18
|
-
| React 加载另一个应用的 React 组件 | `/react` 的 `remoteComponent` | [React 示例](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates/react-react) |
|
|
19
|
-
| 加载远程 JS/TS 函数 | `loadRemote`;React 也可用 `useLoadRemote` | 见下方快速开始 |
|
|
20
|
-
| 一批宿主路由对应远程页面 | Vue 用 `createHostPages`;React 用 `createReactHostPages` | [页面接入示例](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/demos/pages-cli) |
|
|
21
|
-
| Vue 嵌 React,或 React 嵌 Vue | 子应用桥接:`defineBridgeApp` + 宿主桥接组件 | [双向嵌套示例](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates) |
|
|
22
|
-
| 刷新后仍打开子应用的详情页 | 在桥接上开启 URL 同步 | [路由同步示例](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates/showcase) |
|
|
23
|
-
| 远程页面需要用户、token 或初始化 | `AppContext` + 可选 `setup`/`onSession` | 见下方业务初始化 |
|
|
24
|
-
| 同页使用 React 18 和 React 19 | 将两组依赖和使用方放入不同 `shareScope` | [版本隔离示例](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/demos/react-versions) |
|
|
25
|
-
|
|
26
|
-
这些功能按需组合。**加载一个普通组件,不需要先配置桥接、页面表或登录初始化。**
|
|
27
|
-
|
|
28
|
-
## 几个名字是什么意思
|
|
29
|
-
|
|
30
|
-
| 名字 | 用普通话解释 |
|
|
31
|
-
|---|---|
|
|
32
|
-
| 宿主(host) | 显示远程内容的应用,例如主系统 |
|
|
33
|
-
| 远程(remote) | 提供组件、页面或函数的应用,例如审批系统 |
|
|
34
|
-
| `exposes` | 远程允许其他应用加载哪些文件 |
|
|
35
|
-
| `remotes` | 宿主要连接哪些远程、它们的地址是什么 |
|
|
36
|
-
| `shared` | 哪些依赖参与共享,例如 Vue、React |
|
|
37
|
-
| `singleton` | 同一个共享分组内只采用一个依赖实例;不保证所有库都能跨大版本兼容 |
|
|
38
|
-
| `shareScope` | 共享依赖的分组。不同组可以使用不同版本 |
|
|
39
|
-
| 桥接 | 为子应用准备一个 DOM 容器,让它在里面自行渲染和卸载 |
|
|
40
|
-
| URL 同步 | 把子应用的内部路径写进宿主地址,支持刷新、分享和前进后退 |
|
|
41
|
-
|
|
42
|
-
同一个应用可以既提供模块又使用其他应用的模块,不需要固定为单一角色。
|
|
43
|
-
|
|
44
|
-
## 安装
|
|
45
|
-
|
|
46
|
-
在每个参与联邦的 Vite 项目中安装:
|
|
11
|
+
**新建工程**(推荐):用 CLI 从完整模板创建可独立运行的联邦工程:
|
|
47
12
|
|
|
48
13
|
```bash
|
|
49
|
-
pnpm add -D @fulgurjs/federation
|
|
50
|
-
# 使用 npm 的项目:npm install -D @fulgurjs/federation
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
- 支持浏览器端 Vue 3、React 18/19,以及普通 JS/TS 模块。
|
|
54
|
-
- 支持 Vite 5.1 及以上的 5/6/7/8 系列;项目必须同时满足所用 Vite 和框架插件的版本要求。
|
|
55
|
-
- 本插件要求 Node.js ≥18,但 **Vite 7/8 要求 Node.js 20.19+ 或 22.12+**,不能只按插件的最低版本选 Node。
|
|
56
|
-
- 构建目标使用 `es2022` 或更新;浏览器基线为 Chrome 108+,其他浏览器需要相应的 ESM、动态导入和顶层 await 支持。
|
|
57
|
-
- 普通 Vue 项目安装 Vue 即可;普通 React 项目安装 React 和 react-dom 即可。双向跨框架桥接的宿主按下面说明安装两个框架。
|
|
58
|
-
|
|
59
|
-
## 从零开始:创建一个完整工程
|
|
60
|
-
|
|
61
|
-
没有可接入的存量项目时,用 CLI 从完整模板创建(需要 Node ≥ 20 和 pnpm ≥ 9):
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
npx @fulgurjs/federation create # 交互选择场景;也可显式指定:
|
|
65
14
|
npx @fulgurjs/federation create vue-vue --dir my-federation
|
|
15
|
+
cd my-federation
|
|
16
|
+
pnpm dev
|
|
66
17
|
```
|
|
67
18
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
模板源码在仓库 [examples/templates/](examples/templates/README.md);不改名称/端口时无需任何手工配置。改端口的固定修改点见模板指南。
|
|
71
|
-
|
|
72
|
-
## 快速开始:两个 Vue 应用
|
|
73
|
-
|
|
74
|
-
下面是在**已有 Vite + Vue 项目**中增加联邦功能。每个项目仍保留自己的 `index.html`、入口文件和原有插件。
|
|
75
|
-
|
|
76
|
-
我们使用两个项目:
|
|
77
|
-
|
|
78
|
-
```text
|
|
79
|
-
remote-vue/ 提供按钮和加法函数,开发端口 5174
|
|
80
|
-
host-vue/ 加载它们,开发端口 5173
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### 1. 远程声明要提供的文件
|
|
84
|
-
|
|
85
|
-
`remote-vue/fulgurjs.config.ts`:
|
|
86
|
-
|
|
87
|
-
```ts
|
|
88
|
-
import type { FederationOptions } from '@fulgurjs/federation'
|
|
89
|
-
|
|
90
|
-
export default {
|
|
91
|
-
name: 'remote-vue',
|
|
92
|
-
exposes: {
|
|
93
|
-
'./Button': './src/Button.vue',
|
|
94
|
-
'./math': './src/math.ts',
|
|
95
|
-
},
|
|
96
|
-
shared: { vue: { singleton: true, strictVersion: true } },
|
|
97
|
-
} satisfies FederationOptions
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
`remote-vue/src/Button.vue`:
|
|
101
|
-
|
|
102
|
-
```vue
|
|
103
|
-
<script setup lang="ts">
|
|
104
|
-
import { ref } from 'vue'
|
|
105
|
-
defineProps<{ label: string }>()
|
|
106
|
-
const count = ref(0)
|
|
107
|
-
</script>
|
|
108
|
-
|
|
109
|
-
<template>
|
|
110
|
-
<button @click="count++">{{ label }}:{{ count }}</button>
|
|
111
|
-
</template>
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
`remote-vue/src/math.ts`:
|
|
115
|
-
|
|
116
|
-
```ts
|
|
117
|
-
export function add(a: number, b: number): number {
|
|
118
|
-
return a + b
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### 2. 宿主声明远程地址
|
|
123
|
-
|
|
124
|
-
`host-vue/fulgurjs.config.ts`:
|
|
125
|
-
|
|
126
|
-
```ts
|
|
127
|
-
import type { FederationOptions } from '@fulgurjs/federation'
|
|
19
|
+
**已有工程接入**:安装后在 `vite.config.ts` 注册插件,应用代码按框架从统一入口导入:
|
|
128
20
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
remotes: {
|
|
132
|
-
'remote-vue': {
|
|
133
|
-
dev: 'http://localhost:5174',
|
|
134
|
-
prod: '/remote-vue',
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
shared: { vue: { singleton: true, strictVersion: true } },
|
|
138
|
-
} satisfies FederationOptions
|
|
21
|
+
```bash
|
|
22
|
+
npm add @fulgurjs/federation
|
|
139
23
|
```
|
|
140
24
|
|
|
141
|
-
`dev` 是开发地址,`prod` 是部署后的地址。这里的 `/remote-vue` 表示宿主所在域名下的远程目录,**不是磁盘文件夹路径**。
|
|
142
|
-
|
|
143
|
-
### 3. 两个项目都注册插件
|
|
144
|
-
|
|
145
|
-
两个项目的 `vite.config.ts` 都导入本项目的配置:
|
|
146
|
-
|
|
147
25
|
```ts
|
|
148
|
-
|
|
149
|
-
import vue from '@vitejs/plugin-vue'
|
|
26
|
+
// vite.config.ts —— 构建配置用包根
|
|
150
27
|
import federation from '@fulgurjs/federation'
|
|
151
|
-
import fulgurjsConfig from './fulgurjs.config'
|
|
152
|
-
|
|
153
|
-
export default defineConfig({
|
|
154
|
-
plugins: [vue(), federation(fulgurjsConfig)],
|
|
155
|
-
build: { target: 'es2022' },
|
|
156
|
-
})
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
保留项目已有的别名、代理等配置。远程与宿主应安装兼容的 Vue 版本;示例开启 `strictVersion`,不兼容时会报错,而不是继续使用错误版本。
|
|
160
|
-
|
|
161
|
-
### 4. 在宿主页中使用
|
|
162
|
-
|
|
163
|
-
`host-vue/src/App.vue`:
|
|
164
28
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const RemoteButton = remoteComponent('remote-vue/Button')
|
|
171
|
-
const result = ref('尚未计算')
|
|
172
|
-
|
|
173
|
-
async function calculate() {
|
|
174
|
-
try {
|
|
175
|
-
const math = await loadRemote<{ add(a: number, b: number): number }>('remote-vue/math')
|
|
176
|
-
result.value = String(math.add(1, 2))
|
|
177
|
-
} catch (error) {
|
|
178
|
-
result.value = error instanceof Error ? error.message : String(error)
|
|
179
|
-
}
|
|
29
|
+
export default {
|
|
30
|
+
plugins: [federation({
|
|
31
|
+
name: 'my-app',
|
|
32
|
+
// exposes / remotes / shared 按需配置,见文档「已有项目接入」
|
|
33
|
+
})],
|
|
180
34
|
}
|
|
181
|
-
</script>
|
|
182
|
-
|
|
183
|
-
<template>
|
|
184
|
-
<RemoteButton label="远程按钮" />
|
|
185
|
-
<button @click="calculate">调用远程加法函数</button>
|
|
186
|
-
<p>{{ result }}</p>
|
|
187
|
-
</template>
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
这里的名字一一对应:
|
|
191
|
-
|
|
192
|
-
```text
|
|
193
|
-
remote-vue/Button
|
|
194
|
-
└─ remotes 中的键 remote-vue
|
|
195
|
-
└─ 远程 exposes 中的键 ./Button(调用时省略 ./)
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
`loadRemote` 返回文件导出的内容。加载 `math.ts` 后,仍要调用 `math.add()` 才会执行加法。
|
|
199
|
-
|
|
200
|
-
### 5. 启动并检查结果
|
|
201
|
-
|
|
202
|
-
在两个终端分别运行:
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
# 终端一,remote-vue 项目内
|
|
206
|
-
npm run dev -- --port 5174 --strictPort
|
|
207
|
-
|
|
208
|
-
# 终端二,host-vue 项目内
|
|
209
|
-
npm run dev -- --port 5173 --strictPort
|
|
210
35
|
```
|
|
211
36
|
|
|
212
|
-
打开 `http://localhost:5173`,应看到能增加计数的远程按钮;点击计算按钮应显示 `3`。使用 pnpm 的项目也可用 `pnpm dev` 启动。
|
|
213
|
-
|
|
214
|
-
完整工程与生产部署配置见 [Vue examples](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates/vue-vue)。
|
|
215
|
-
|
|
216
|
-
## React 怎么接入
|
|
217
|
-
|
|
218
|
-
配置方式与 Vue 相同,只需换成 React 插件、共享依赖和浏览器导入入口。
|
|
219
|
-
|
|
220
|
-
在两个已有 React + Vite 项目中:
|
|
221
|
-
|
|
222
|
-
1. `vite.config.ts` 使用 `@vitejs/plugin-react`,后面注册 `federation(fulgurjsConfig)`。
|
|
223
|
-
2. 远程把 `./Button` 指向 `./src/Button.tsx`;宿主配置对应 `remotes` 地址。
|
|
224
|
-
3. 两边用兼容的 React/renderer 版本,并共享 `react`、`react-dom`:
|
|
225
|
-
|
|
226
37
|
```ts
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
}
|
|
38
|
+
// Vue 应用代码统一入口 @fulgurjs/federation/vue
|
|
39
|
+
import { loadRemote, remoteComponent } from '@fulgurjs/federation/vue'
|
|
40
|
+
const RemoteButton = remoteComponent('remote-a/Button')
|
|
41
|
+
const math = await loadRemote<{ add(a: number, b: number): number }>('remote-a/math')
|
|
231
42
|
```
|
|
232
43
|
|
|
233
|
-
远程的 `src/Button.tsx`:
|
|
234
|
-
|
|
235
44
|
```tsx
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
export default function Button({ label }: { label: string }) {
|
|
239
|
-
const [count, setCount] = useState(0)
|
|
240
|
-
return <button onClick={() => setCount(count + 1)}>{label}:{count}</button>
|
|
241
|
-
}
|
|
45
|
+
// React 应用代码统一入口 @fulgurjs/federation/react
|
|
46
|
+
import { remoteComponent, useLoadRemote, RemoteErrorBoundary } from '@fulgurjs/federation/react'
|
|
242
47
|
```
|
|
243
48
|
|
|
244
|
-
宿主的 `src/App.tsx`(假设 `remotes` 中配置的名字是 `remote-react`):
|
|
245
|
-
|
|
246
|
-
```tsx
|
|
247
|
-
import { remoteComponent } from '@fulgurjs/federation/react'
|
|
248
|
-
|
|
249
|
-
// 放在模块顶层,不要在每次组件渲染时重新创建。
|
|
250
|
-
const RemoteButton = remoteComponent<{ label: string }>('remote-react/Button', {
|
|
251
|
-
fallback: <p>正在加载…</p>,
|
|
252
|
-
})
|
|
253
|
-
|
|
254
|
-
export default function App() {
|
|
255
|
-
return <RemoteButton label="远程 React 按钮" />
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
React 加载普通 TS 模块时可以使用 `loadRemote` 或 `useLoadRemote`,都从 `/react` 导入。完整工程见 [React examples](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates/react-react)。
|
|
260
|
-
|
|
261
|
-
## Vue 和 React 怎么互相嵌套
|
|
262
|
-
|
|
263
|
-
**嵌入的是子应用:子应用创建自己的组件树,宿主提供显示区域。** 不需要把 React 组件转换成 Vue 组件。
|
|
264
|
-
|
|
265
|
-
以 Vue 宿主嵌入 React 为例:
|
|
266
|
-
|
|
267
|
-
1. React 远程创建 `src/bridge.tsx`,默认导出桥接对象:
|
|
268
|
-
|
|
269
|
-
```tsx
|
|
270
|
-
import { defineBridgeApp } from '@fulgurjs/federation/react'
|
|
271
|
-
|
|
272
|
-
export default defineBridgeApp((props) => (
|
|
273
|
-
<section>React 子应用:{String(props.message ?? '')}</section>
|
|
274
|
-
))
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
2. 在 React 远程的 `exposes` 中增加:
|
|
278
|
-
|
|
279
49
|
```ts
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
3. Vue 宿主配置该远程地址,然后在页面中使用:
|
|
284
|
-
|
|
285
|
-
```vue
|
|
286
|
-
<script setup lang="ts">
|
|
287
|
-
import { createVueBridgeApp } from '@fulgurjs/federation/bridge/vue'
|
|
288
|
-
const RemoteApp = createVueBridgeApp<{ message: string }>('remote-react/bridge')
|
|
289
|
-
</script>
|
|
290
|
-
|
|
291
|
-
<template>
|
|
292
|
-
<RemoteApp :app-props="{ message: '来自 Vue 宿主' }" />
|
|
293
|
-
</template>
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
跨框架宿主安装 `vue`、`react`、`react-dom`,共享这三个依赖。子应用只安装和共享自己的框架。React 与 react-dom 必须兼容;同页有多个 React 大版本时请按版本隔离 Demo 配置,不能只加 `singleton` 就认为兼容问题解决了。
|
|
297
|
-
|
|
298
|
-
反方向用 React 宿主的 `createReactBridgeApp`,Vue 子应用用 `/runtime` 的 `defineBridgeApp` 返回 `createApp(...)` 创建的应用。
|
|
299
|
-
|
|
300
|
-
### 跨框架桥接的最短理解
|
|
301
|
-
|
|
302
|
-
| 问题 | 答案 |
|
|
303
|
-
|---|---|
|
|
304
|
-
| 宿主和子应用各装什么框架? | 桥接宿主装并共享 `vue` + `react` + `react-dom`(三键全 `singleton: true`);子应用只装并共享自己的框架。这是硬性合同,缺一键就会出现双实例(Invalid hook call / 状态不互通) |
|
|
305
|
-
| `shared` 与 `singleton` 在这里的作用? | 让宿主与子应用拿到**同一个**框架实例;`singleton` 只是收敛实例,不把不兼容的大版本变成兼容 |
|
|
306
|
-
| 子应用入口怎么导出? | `exposes: { './bridge': … }` 指向的文件**默认导出** `defineBridgeApp(...)` 的返回值;缺 `mount/unmount` 会报 MFU-015 |
|
|
307
|
-
| 宿主怎么挂载? | `createVueBridgeApp('远程名/bridge')` / `createReactBridgeApp(...)` 返回一个组件,渲染它即挂载、移除即卸载;传 `appProps` 与可选 `sessionKey` |
|
|
308
|
-
| URL 同步什么时候需要? | 只有「刷新/分享/前进后退要恢复子应用内部页面」时才开(`routing` + `basePath`,两端都要配置);不开发同步时子应用内部跳转不影响宿主地址,这是正常行为 |
|
|
309
|
-
| 会话切换与卸载怎么处理? | 登录代次用 `sessionKey`(换号→新代次重跑 `onSession`;登出→`null` 即卸载清空);卸载由宿主组件生命周期驱动,子应用清理逻辑抛错会封锁该容器(只能整页刷新) |
|
|
310
|
-
|
|
311
|
-
### `appProps` 是挂载快照,不是响应式 props
|
|
312
|
-
|
|
313
|
-
挂载时顶层字段做浅拷贝传入;之后宿主替换字段**不会**自动更新子应用。三种实时数据通道按需选择:
|
|
314
|
-
|
|
315
|
-
| 场景 | 用什么 | 代价 |
|
|
316
|
-
|---|---|---|
|
|
317
|
-
| 子应用需要宿主的实时值(token、用户名等) | 传**稳定回调**(如 `getToken: () => store.token`),子应用调用时取到最新值 | 无重挂;适合“读” |
|
|
318
|
-
| 两边共享一块状态 | 把宿主 store 实例经 `appProps` 或 AppContext 传过去,双方订阅同一实例 | 框架响应式不跨 root,子应用需自行订阅 |
|
|
319
|
-
| 必须以新 props 重新初始化 | 宿主给桥接组件换 `key` 显式重挂(卸载→重新走完整加载链) | 全部状态重置;不要频繁触发 |
|
|
320
|
-
|
|
321
|
-
这与普通 Vue/React 组件的 props 语义不同,是跨 root 挂载的结构限制,不是 bug。两个组件树也不会自动共用 Context、provide/inject 或路由,需要显式传递或在子应用安装。普通组件加载用 `remoteComponent`;整个子应用嵌套用桥接工厂。Vue 不能直接用 Vue 的 `remoteComponent` 渲染 React 组件。
|
|
322
|
-
|
|
323
|
-
双向配置、登录切换和卸载示例见 [bridge examples](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates)。
|
|
324
|
-
|
|
325
|
-
## 子应用路由和浏览器地址怎么同步
|
|
326
|
-
|
|
327
|
-
桥接默认不改宿主地址。比如子应用从列表进入详情,地址不变,刷新就无法凭地址恢复这条详情。
|
|
328
|
-
|
|
329
|
-
开启 URL 同步后可以这样使用:
|
|
330
|
-
|
|
331
|
-
```text
|
|
332
|
-
宿主地址 /approval/list → 子应用 /list
|
|
333
|
-
宿主地址 /approval/detail/42 → 子应用 /detail/42
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
接入需要同时设置两端:
|
|
337
|
-
|
|
338
|
-
1. 宿主路由要接住 `/approval` 下的所有子路径,避免详情导航把子应用卸载。
|
|
339
|
-
2. 宿主桥接组件传 `routing`,其中 `basePath` 是 `/approval`,`navigation` 由宿主路由适配器创建。
|
|
340
|
-
3. 子应用声明 `defineBridgeApp(..., { routing: true })`,用受控的 memory 路由接入通道。
|
|
341
|
-
|
|
342
|
-
Vue 使用 `createVueBridgeNavigation` / `connectVueBridgeRouter`;React 使用 `createReactBridgeNavigation` / `createReactBridgeRouter`。React 宿主需要 data router(`createBrowserRouter` 或 `createHashRouter`),不能直接换成 `BrowserRouter`。内置适配支持 Vue Router 4、React Router ≥6.11。
|
|
343
|
-
|
|
344
|
-
这样刷新、分享链接、前进后退能恢复路由位置;**不会自动保存表单内容或业务数据**。详细步骤见 [URL 同步 API](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/API.md#url-sync),可运行工程见 [bridge-router Demo](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/templates/showcase)。
|
|
345
|
-
|
|
346
|
-
## 远程业务页需要用户信息或初始化时
|
|
347
|
-
|
|
348
|
-
这部分是可选功能。普通按钮、工具函数不需要它。
|
|
349
|
-
|
|
350
|
-
| 需求 | 使用什么 | 什么时候发生 |
|
|
351
|
-
|---|---|---|
|
|
352
|
-
| 宿主提供用户、取 token 的方法、store 等 | `provideAppContext` | 宿主加载远程业务模块前提供 |
|
|
353
|
-
| 远程读取这些值 | `getAppContext` / `requireAppContext` | 由远程业务代码调用 |
|
|
354
|
-
| 远程注册全局组件、样式或其他一次性内容 | 配置 `setup` 文件的默认导出 | 首次 `loadRemote('远程/模块')` 返回业务模块前执行 |
|
|
355
|
-
| 每次登录、换账号都要重新同步权限等 | 同文件具名导出 `onSession` | 按 `sessionKey` 区分登录次数 |
|
|
356
|
-
| 退出登录,清除共享的账号上下文 | `clearAppContext` | 由宿主退出流程调用;私有页面/缓存也须由宿主清理 |
|
|
357
|
-
|
|
358
|
-
`sessionKey` 是一次登录的编号,**不是 token,也不是权限凭证**。重新登录或换账号生成新编号,单纯刷新 token 不换编号。
|
|
359
|
-
|
|
360
|
-
桥接组件可以通过 `getContext` 在加载前取得最新信息;受控 `sessionKey` 为 `null` 表示退出,组件会卸载并停止加载。省略 `sessionKey` 表示未启用受控登录切换。
|
|
361
|
-
|
|
362
|
-
`setup` 不会由文件名或目录自动触发,必须写在联邦配置里。`preloadRemote` 只预载资源,不执行 `setup/onSession`。异步初始化写入状态前要检查 `context.signal.aborted`,避免退出后迟到的请求写回旧账号数据。
|
|
363
|
-
|
|
364
|
-
完整代码见 [初始化与上下文 API](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/API.md#context)。
|
|
365
|
-
|
|
366
|
-
## 多个远程页面怎么管理
|
|
367
|
-
|
|
368
|
-
宿主有很多路由对应远程页面时,可以维护一份页面表,再交给 `createHostPages`(Vue)或 `createReactHostPages`(React)。它们负责查找对应模块、缓存加载组件和显示加载/错误状态,**不会自动替你创建宿主 Router**。
|
|
369
|
-
|
|
370
|
-
页面表里 `route` 是宿主路径,`spec` 是远程的 exposes 键(通常省略 `./`,不要重复加远程名);`remotePrefixes` 指定这批路径属于哪个远程。例如 `/shop/home` + `spec: 'pages/Home'` + `remotePrefixes: { '/shop': 'shop' }`,最终加载的是 `shop/pages/Home`。Vue 可结合 KeepAlive 保存组件状态;React 不提供相同的保活承诺。
|
|
371
|
-
|
|
372
|
-
完整配置见 [页面 API](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/API.md#pages) 和 [pages-cli Demo](https://github.com/chenmingye/fulgurjs-federation/tree/master/examples/demos/pages-cli)。
|
|
373
|
-
|
|
374
|
-
## 构建与部署
|
|
375
|
-
|
|
376
|
-
宿主和远程分别执行自己的构建命令,然后分别部署:
|
|
377
|
-
|
|
378
|
-
```bash
|
|
379
|
-
npm run build
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
远程默认生成 `fulgurjs-remoteEntry.js` 和 `fulgurjs-manifest.json`,宿主通过配置的 `prod` 地址找到它们。远程可以部署到同域子目录,也可以部署到另一个域名。
|
|
383
|
-
|
|
384
|
-
部署时核对:
|
|
385
|
-
|
|
386
|
-
- **地址与 base 一致**:远程部署在 `/remote-vue/` 时,远程 Vite 构建的 `base` 也应为 `/remote-vue/`;宿主 `prod` 配置为 `/remote-vue`。
|
|
387
|
-
- **入口及时更新**:HTML、remoteEntry、manifest 使用 `Cache-Control: no-cache`,让浏览器重新验证最新内容。带内容哈希的 chunk 可以长缓存。
|
|
388
|
-
- **刷新能回到页面**:宿主和独立远程的页面路由分别配置 SPA 回退;资源请求不存在时应返回 404,不要把 JS 请求回退成 HTML。
|
|
389
|
-
- **跨域允许访问**:不同域名时,远程服务器要正确提供 CORS 响应头;开发配置不会自动替你修改生产服务器。
|
|
390
|
-
- **避免旧文件突然失效**:发布期间保留仍被旧页面引用的 chunk,或使用能避免版本混搭的部署流程。
|
|
391
|
-
|
|
392
|
-
生产部署样例见 [Vue 部署说明](https://github.com/chenmingye/fulgurjs-federation/blob/master/examples/templates/vue-vue/README.md) 与 [React 部署说明](https://github.com/chenmingye/fulgurjs-federation/blob/master/examples/templates/react-react/README.md)。
|
|
393
|
-
|
|
394
|
-
## 加载失败时怎么办
|
|
395
|
-
|
|
396
|
-
| 现象 | 先检查 | 插件提供的恢复方式 |
|
|
397
|
-
|---|---|---|
|
|
398
|
-
| 远程连不上 | 远程是否启动、remotes 地址和 CORS | 超时、重试、错误占位;可配置备用入口或 fallback 模块 |
|
|
399
|
-
| 提示模块不存在 | `远程名/模块名` 是否对应 remotes/exposes | 修正名称后重试 |
|
|
400
|
-
| 提示共享版本不兼容 | 两边依赖版本、requiredVersion、strictVersion、作用域 | 对齐依赖或隔离不同版本,不能靠忽略错误解决 |
|
|
401
|
-
| 远程静态依赖曾下载失败,服务恢复后仍失败 | 浏览器可能保留该依赖 URL 的失败记录 | 默认占位提供用户主动刷新,保留当前地址 |
|
|
402
|
-
| 子应用卸载失败 | 子应用清理逻辑、事件和定时器 | 该容器不再重新挂载,需刷新;同时修复清理逻辑 |
|
|
403
|
-
|
|
404
|
-
`remoteComponent` 和桥接组件有默认错误占位。直接调用 `loadRemote`,或使用 React 的 `useLoadRemote`,需要自己处理错误状态。`fallbackModule` 是你显式选择的备用模块,不会自动修复原远程。
|
|
405
|
-
|
|
406
|
-
错误中会给出代码、原因和处理建议;完整清单见 [错误码手册](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/API.md#error-codes)。
|
|
407
|
-
|
|
408
|
-
## Vite 8 和使用范围
|
|
409
|
-
|
|
410
|
-
**支持 Vite 8 开发和生产构建,已修复此前大型应用启动挂起的问题,并通过相关回归测试。**
|
|
411
|
-
|
|
412
|
-
还有两点与使用有关:
|
|
413
|
-
|
|
414
|
-
- **开发第一次打开可能重载**:Vite 在准备依赖,发现新依赖时可能重新优化并刷新页面。等准备完成后再判断页面是否正常;这不是生产页面每次都会发生的行为。
|
|
415
|
-
- **部分共享场景会多下载文件**:浏览器可能下载未采用的本地库副本。同一 singleton 作用域仍使用一个实例;你主动隔离 React 18/19 时,则可以各自使用一个实例。文件下载数量与运行时实例数量不是同一件事。
|
|
416
|
-
|
|
417
|
-
当前不提供 SSR/RSC、Node 服务端联邦、React Native、自动 JS 沙箱、自动 CSS 隔离,或 webpack `script/var` 产物互操作。远程全局样式和变量仍可能影响宿主;子应用内部错误也需要子应用自己的错误处理。
|
|
418
|
-
|
|
419
|
-
跨框架支持子应用级嵌套,不提供组件类型转换。多层桥接路由自动代理、跨窗口路由同步及其他路由库的内置适配也不在当前范围。完整说明及 webpack 的区别见 [能力对照](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/webpack-mf-对照与缺口.md)。
|
|
420
|
-
|
|
421
|
-
## 调试、类型和命令行
|
|
422
|
-
|
|
423
|
-
在应用根目录运行:
|
|
424
|
-
|
|
425
|
-
```bash
|
|
426
|
-
# 没有存量项目:从模板创建完整工程(见「从零开始」一节)
|
|
427
|
-
npx @fulgurjs/federation create
|
|
428
|
-
|
|
429
|
-
# 已有项目:生成联邦配置起步文件
|
|
430
|
-
npx fulgurjs init # --template <路径> 指定输出路径(是路径,不是模板编号)
|
|
431
|
-
npx fulgurjs explain # 查看当前应用的联邦配置
|
|
432
|
-
|
|
433
|
-
# 使用页面表时,核对宿主页面声明:
|
|
434
|
-
npx fulgurjs check-pages --site http://localhost:5173
|
|
435
|
-
|
|
436
|
-
# 部署到 /remote-vue/ 后,将域名替换为你的实际站点:
|
|
437
|
-
npx fulgurjs doctor --base https://your-site.example --apps remote-vue
|
|
50
|
+
// 框架无关的浏览器模块 @fulgurjs/federation/runtime(零 Vue/React 依赖)
|
|
51
|
+
import { loadRemote, loadShare } from '@fulgurjs/federation/runtime'
|
|
438
52
|
```
|
|
439
53
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
`init` 只生成联邦配置模板,不替你创建完整应用、路由或 Nginx 配置(新建完整工程用 `create`)。`check-pages` 核对页面表与远程模块声明;远程不可达会报告无法验证,不代表通过。
|
|
443
|
-
|
|
444
|
-
开发类型默认开启:插件为远程模块生成类型声明。能访问远程源码时可获得更精确的提示;不能访问时生成 `any` 声明,表示可以导入但没有准确类型。需要关闭时设 `dts: false`。详细规则见 API 手册。
|
|
445
|
-
|
|
446
|
-
高级排查可查看 `window.__FULGURJS_SCOPE__`、`window.__FULGURJS_INFO__`,或设置 `FULGURJS_DEBUG`。普通接入不需要修改这些对象。
|
|
54
|
+
## 入口一览(6.0.0)
|
|
447
55
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
不要猜接口,也不要照搬旧任务书中的签名。查参数时使用当前手册:
|
|
451
|
-
|
|
452
|
-
| 你要查什么 | 入口 |
|
|
56
|
+
| 使用位置 | 入口 |
|
|
453
57
|
|---|---|
|
|
454
|
-
|
|
|
455
|
-
|
|
|
456
|
-
|
|
|
457
|
-
|
|
|
458
|
-
| URL 同步、导航取消和部署 base | [路由 API](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/API.md#url-sync) |
|
|
459
|
-
| 英文参数说明 | [English API reference](https://github.com/chenmingye/fulgurjs-federation/blob/master/docs/API.en.md) |
|
|
58
|
+
| Vite 配置、`FederationOptions` 类型 | `@fulgurjs/federation` |
|
|
59
|
+
| Vue 应用代码(组件/页面/桥接/路由同步) | `@fulgurjs/federation/vue` |
|
|
60
|
+
| React 应用代码(组件/页面/桥接/路由同步) | `@fulgurjs/federation/react` |
|
|
61
|
+
| 框架无关浏览器模块 | `@fulgurjs/federation/runtime` |
|
|
460
62
|
|
|
461
|
-
|
|
63
|
+
6.0.0 起旧入口 `/bridge`、`/bridge/vue`、`/bridge/react`、`/bridge/router/{vue,react}` 已移除,功能并入 `/vue` 与 `/react`;迁移对照见 [迁移指南](docs/zh/migration.md)。
|
|
462
64
|
|
|
463
|
-
|
|
65
|
+
## 能力地图
|
|
464
66
|
|
|
465
|
-
|
|
67
|
+
- **组件与模块**:`remoteComponent`(Vue/React)、`useLoadRemote`、`RemoteErrorBoundary`、`loadRemote` —— 失败显式错误态可重试,不静默兜底。
|
|
68
|
+
- **逐页接入**:`definePages` + `createHostPages`(宿主页面路由表 → 远程页面),CLI `check-pages` 启动期契约核对。
|
|
69
|
+
- **完整子应用桥接**:`defineBridgeApp`(子应用)+ `createVueBridgeApp` / `createReactBridgeApp`(宿主);挂载/卸载、会话代次、卸载失败封锁。
|
|
70
|
+
- **URL 同步**:`createVueBridgeNavigation` / `createReactBridgeNavigation`(宿主)+ `connectVueBridgeRouter` / `createReactBridgeRouter`(子应用);深链刷新、守卫取消、query/hash 保留。
|
|
71
|
+
- **共享依赖**:singleton / requiredVersion / strictVersion / shareScope / eager,同步与异步裁决,React 18/19 多版本隔离。
|
|
72
|
+
- **CLI**:`create` / `init` / `explain` / `check-pages` / `doctor` / `port`。
|
|
466
73
|
|
|
467
74
|
## 文档
|
|
468
75
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
76
|
+
| 需求 | 入口 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| 新建工程 / 已有项目接入 | [快速开始](docs/zh/guide/getting-started.md) |
|
|
79
|
+
| Vue/React 组件与普通模块 | [组件与模块](docs/zh/guide/components-and-modules.md) |
|
|
80
|
+
| 完整子应用 / 跨框架嵌套 | [子应用桥接](docs/zh/guide/app-bridge.md) |
|
|
81
|
+
| 路由同步 / 刷新深链 | [URL 同步](docs/zh/guide/url-sync.md) |
|
|
82
|
+
| 全部配置项与默认值 | [配置参考](docs/zh/reference/configuration.md) |
|
|
83
|
+
| 全部 API 签名与语义 | [API 参考](docs/zh/reference/api.md) |
|
|
84
|
+
| CLI 命令与退出码 | [CLI 参考](docs/zh/reference/cli.md) |
|
|
85
|
+
| 错误码(现象/原因/修法) | [错误码总表](docs/zh/reference/errors.md) |
|
|
86
|
+
| 按症状排错 / 兼容范围 | [排错](docs/zh/troubleshooting/README.md) |
|
|
87
|
+
| 模板与示例运行 | [示例总览](examples/README.md) |
|
|
475
88
|
|
|
476
|
-
##
|
|
89
|
+
## 示例
|
|
477
90
|
|
|
478
|
-
|
|
91
|
+
五个完整模板(`vue-vue` / `react-react` / `vue-host-react-remote` / `react-host-vue-remote` / `showcase`)与功能 Demo 统一维护在 [examples/](examples/README.md),均可整目录复制后独立安装运行。
|
|
479
92
|
|
|
480
|
-
|
|
481
|
-
pnpm --dir packages/plugin install
|
|
482
|
-
pnpm --dir packages/plugin build
|
|
483
|
-
pnpm test:unit
|
|
484
|
-
```
|
|
93
|
+
## 贡献与安全
|
|
485
94
|
|
|
486
|
-
|
|
95
|
+
- 贡献流程见 [CONTRIBUTING.md](CONTRIBUTING.md);架构与发布见 [docs/maintainers/](docs/maintainers/README.md)。
|
|
96
|
+
- 安全问题请按 [SECURITY.md](SECURITY.md) 的渠道私下报告。
|
|
487
97
|
|
|
488
98
|
## License
|
|
489
99
|
|
|
490
|
-
[MIT](LICENSE)
|
|
100
|
+
[MIT](LICENSE)
|
|
@@ -47,7 +47,7 @@ interface DefineVueBridgeAppOptions {
|
|
|
47
47
|
*
|
|
48
48
|
* ```ts
|
|
49
49
|
* import { createApp } from 'vue'
|
|
50
|
-
* import { defineBridgeApp } from '@fulgurjs/federation/
|
|
50
|
+
* import { defineBridgeApp } from '@fulgurjs/federation/vue'
|
|
51
51
|
* export default defineBridgeApp((props) => { const app = createApp(App, props); app.use(router); return app })
|
|
52
52
|
* ```
|
|
53
53
|
*/
|
package/dist/bridge-app-vue.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ interface DefineVueBridgeAppOptions {
|
|
|
47
47
|
*
|
|
48
48
|
* ```ts
|
|
49
49
|
* import { createApp } from 'vue'
|
|
50
|
-
* import { defineBridgeApp } from '@fulgurjs/federation/
|
|
50
|
+
* import { defineBridgeApp } from '@fulgurjs/federation/vue'
|
|
51
51
|
* export default defineBridgeApp((props) => { const app = createApp(App, props); app.use(router); return app })
|
|
52
52
|
* ```
|
|
53
53
|
*/
|
package/dist/bridge-core.cjs
CHANGED
|
@@ -80,7 +80,7 @@ function invalidBridgeContractError(spec, mod) {
|
|
|
80
80
|
`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u6A21\u5757 "${spec}" \u7684\u9ED8\u8BA4\u5BFC\u51FA\u4E0D\u662F\u5408\u6CD5\u7684\u6865\u63A5\u5951\u7EA6\uFF08BridgeApp\uFF09\u3002
|
|
81
81
|
\u6839\u56E0: \u5BFC\u51FA\u503C\u4E3A ${actual}` + (missing.length ? `\uFF0C\u7F3A\u5C11\u51FD\u6570\u7C7B\u578B\u7684 ${missing.map((m) => `"${m}"`).join(" / ")} \u5BFC\u51FA\u3002` : "\u3002") + `
|
|
82
82
|
\u4FEE\u6CD5: \u8FDC\u7A0B\u4FA7\u7528 defineBridgeApp(...) \u521B\u5EFA\u5951\u7EA6\u5E76\u4F5C\u4E3A\u6A21\u5757\u9ED8\u8BA4\u5BFC\u51FA\u2014\u2014
|
|
83
|
-
Vue \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/
|
|
83
|
+
Vue \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/vue'\uFF1B
|
|
84
84
|
React \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/react'\u3002
|
|
85
85
|
\u5951\u7EA6\u5FC5\u987B\u5305\u542B mount(el, props?) \u4E0E unmount(el) \u4E24\u4E2A\u51FD\u6570\u3002`,
|
|
86
86
|
{ spec, missing, actual }
|
package/dist/bridge-core.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
releaseBridgeSession,
|
|
7
7
|
resolveBridgeContext,
|
|
8
8
|
withBridgeTimeout
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-ENT3BOTX.js";
|
|
10
|
+
import "./chunk-ZAYNS7YQ.js";
|
|
11
11
|
import "./chunk-TSYLDY6H.js";
|
|
12
12
|
import "./chunk-OF2JCXTZ.js";
|
|
13
13
|
export {
|
package/dist/bridge-errors.cjs
CHANGED
|
@@ -72,7 +72,7 @@ function invalidBridgeContractError(spec, mod) {
|
|
|
72
72
|
`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u6A21\u5757 "${spec}" \u7684\u9ED8\u8BA4\u5BFC\u51FA\u4E0D\u662F\u5408\u6CD5\u7684\u6865\u63A5\u5951\u7EA6\uFF08BridgeApp\uFF09\u3002
|
|
73
73
|
\u6839\u56E0: \u5BFC\u51FA\u503C\u4E3A ${actual}` + (missing.length ? `\uFF0C\u7F3A\u5C11\u51FD\u6570\u7C7B\u578B\u7684 ${missing.map((m) => `"${m}"`).join(" / ")} \u5BFC\u51FA\u3002` : "\u3002") + `
|
|
74
74
|
\u4FEE\u6CD5: \u8FDC\u7A0B\u4FA7\u7528 defineBridgeApp(...) \u521B\u5EFA\u5951\u7EA6\u5E76\u4F5C\u4E3A\u6A21\u5757\u9ED8\u8BA4\u5BFC\u51FA\u2014\u2014
|
|
75
|
-
Vue \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/
|
|
75
|
+
Vue \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/vue'\uFF1B
|
|
76
76
|
React \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/react'\u3002
|
|
77
77
|
\u5951\u7EA6\u5FC5\u987B\u5305\u542B mount(el, props?) \u4E0E unmount(el) \u4E24\u4E2A\u51FD\u6570\u3002`,
|
|
78
78
|
{ spec, missing, actual }
|
package/dist/bridge-errors.js
CHANGED
|
@@ -97,7 +97,7 @@ function invalidBridgeContractError(spec, mod) {
|
|
|
97
97
|
`\u73B0\u8C61\uFF1A\u8FDC\u7A0B\u6A21\u5757 "${spec}" \u7684\u9ED8\u8BA4\u5BFC\u51FA\u4E0D\u662F\u5408\u6CD5\u7684\u6865\u63A5\u5951\u7EA6\uFF08BridgeApp\uFF09\u3002
|
|
98
98
|
\u6839\u56E0: \u5BFC\u51FA\u503C\u4E3A ${actual}` + (missing.length ? `\uFF0C\u7F3A\u5C11\u51FD\u6570\u7C7B\u578B\u7684 ${missing.map((m) => `"${m}"`).join(" / ")} \u5BFC\u51FA\u3002` : "\u3002") + `
|
|
99
99
|
\u4FEE\u6CD5: \u8FDC\u7A0B\u4FA7\u7528 defineBridgeApp(...) \u521B\u5EFA\u5951\u7EA6\u5E76\u4F5C\u4E3A\u6A21\u5757\u9ED8\u8BA4\u5BFC\u51FA\u2014\u2014
|
|
100
|
-
Vue \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/
|
|
100
|
+
Vue \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/vue'\uFF1B
|
|
101
101
|
React \u5B50\u5E94\u7528: import { defineBridgeApp } from '@fulgurjs/federation/react'\u3002
|
|
102
102
|
\u5951\u7EA6\u5FC5\u987B\u5305\u542B mount(el, props?) \u4E0E unmount(el) \u4E24\u4E2A\u51FD\u6570\u3002`,
|
|
103
103
|
{ spec, missing, actual }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
RoutingChannel,
|
|
3
3
|
assertBridgeRoutingProtocol
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-77JZ6U6V.js";
|
|
5
5
|
import {
|
|
6
6
|
acquireBridgeSession,
|
|
7
7
|
assertBridgeContract,
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
releaseBridgeSession,
|
|
11
11
|
resolveBridgeContext,
|
|
12
12
|
withBridgeTimeout
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ENT3BOTX.js";
|
|
14
14
|
import {
|
|
15
15
|
bridgeHostError
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ZAYNS7YQ.js";
|
|
17
17
|
import {
|
|
18
18
|
provideAppContext
|
|
19
19
|
} from "./chunk-TSYLDY6H.js";
|