@fulgurjs/federation 6.11.7 → 6.12.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 +11 -0
- package/README.en.md +2 -0
- package/README.md +3 -3
- package/dist/{application-core-DWI3eKme.d.ts → application-core-C72tVRT7.d.ts} +1 -1
- package/dist/{application-core-BuhXQmLF.d.cts → application-core-Coa0CIre.d.cts} +1 -1
- package/dist/bridge-app-react.d.cts +2 -2
- package/dist/bridge-app-react.d.ts +2 -2
- package/dist/bridge-app-react.js +1 -1
- package/dist/bridge-app-vue.d.cts +2 -2
- package/dist/bridge-app-vue.d.ts +2 -2
- package/dist/bridge-app-vue.js +1 -1
- package/dist/{bridge-core-77BT1__I.d.cts → bridge-core-CGFET9Qi.d.cts} +2 -1
- package/dist/{bridge-core-CoQRVgnZ.d.ts → bridge-core-Dm6ABUxQ.d.ts} +2 -1
- package/dist/bridge-core.cjs +4 -1
- package/dist/bridge-core.d.cts +1 -1
- package/dist/bridge-core.d.ts +1 -1
- package/dist/bridge-core.js +1 -1
- package/dist/bridge-host-react.cjs +4 -1
- package/dist/bridge-host-react.d.cts +2 -2
- package/dist/bridge-host-react.d.ts +2 -2
- package/dist/bridge-host-react.js +1 -1
- package/dist/bridge-host-vue.cjs +42 -5
- package/dist/bridge-host-vue.d.cts +12 -4
- package/dist/bridge-host-vue.d.ts +12 -4
- package/dist/bridge-host-vue.js +40 -5
- package/dist/bridge-session-auto.cjs +121 -0
- package/dist/bridge-session-auto.d.cts +21 -0
- package/dist/bridge-session-auto.d.ts +21 -0
- package/dist/bridge-session-auto.js +88 -0
- package/dist/{chunk-HDRZBSND.js → chunk-2MWIIRQZ.js} +4 -1
- package/dist/cli.js +53 -10
- package/dist/index.cjs +4 -3
- package/dist/index.js +4 -3
- package/dist/react-adapter.d.cts +2 -2
- package/dist/react-adapter.d.ts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/{remote-types-COmBhjRc.d.ts → remote-types-CMtfvLcH.d.ts} +1 -1
- package/dist/{remote-types-CStGOJwu.d.cts → remote-types-Cf4SSzus.d.cts} +1 -1
- package/dist/runtime-entry.d.ts +2 -2
- package/dist/runtime.js +13 -13
- package/dist/vue-adapter.d.cts +2 -2
- package/dist/vue-adapter.d.ts +2 -2
- package/dist/vue.d.ts +10 -3
- package/dist/vue.js +2 -1
- package/docs/en/reference/api.md +15 -4
- package/docs/en/reference/errors.md +1 -1
- package/docs/en/reference/types.md +4 -2
- package/docs/zh/reference/api.md +16 -6
- package/docs/zh/reference/errors.md +1 -1
- package/docs/zh/reference/types.md +4 -2
- package/examples/templates/README.md +2 -0
- 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/package.json +1 -1
- package/examples/templates/react-host-vue-remote/vue-remote/package.json +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/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-remote/package.json +1 -1
- package/examples/templates/showcase/vue-host/package.json +1 -1
- package/examples/templates/showcase/vue-remote/package.json +1 -1
- package/examples/templates/vue-host-react-remote/README.md +5 -1
- 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/vue-host/README.md +9 -5
- 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 +14 -45
- package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/host/context.ts +28 -0
- package/examples/templates/vue-vue/host/package.json +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/package.json +6 -2
- package/examples/templates/vue-host-react-remote/vue-host/src/fulgurjs/host/session.ts +0 -29
|
@@ -1,68 +1,37 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
* 先启动 examples/templates/react-remote(5303)再启动本宿主。
|
|
5
|
-
*/
|
|
6
|
-
import { ref } from 'vue'
|
|
7
|
-
import { clearAppContext } from '@fulgurjs/federation/runtime'
|
|
2
|
+
/** Vue宿主嵌React完整应用:只绑定业务身份与上下文,不手写联邦登录代次。 */
|
|
3
|
+
import { computed, ref } from 'vue'
|
|
8
4
|
import { createVueBridgeApp } from '@fulgurjs/federation/vue'
|
|
9
|
-
import { getLatestHostContext, login, logout } from './fulgurjs/host/
|
|
5
|
+
import { currentUser, sessionIdentity, getLatestHostContext, login, logout, refreshToken } from './fulgurjs/host/context'
|
|
10
6
|
|
|
11
|
-
// 工厂选项:retries 透传 loadRemote;getContext 在每次实际加载前同步取最新快照
|
|
12
7
|
const RemoteReactApp = createVueBridgeApp('bridge-react-remote/bridge', {
|
|
13
8
|
retries: 1,
|
|
14
|
-
|
|
9
|
+
session: sessionIdentity,
|
|
10
|
+
getContext: getLatestHostContext,
|
|
15
11
|
})
|
|
16
|
-
|
|
17
|
-
// sessionKey 是桥接控制参数(非敏感登录代次 ID),不是业务 props
|
|
18
|
-
const sessionKey = ref<string | null>('login-1-alice')
|
|
19
|
-
const userName = ref('Alice')
|
|
12
|
+
const userName = computed(() => currentUser()?.name ?? '')
|
|
20
13
|
const label = ref('来自 Vue 宿主')
|
|
21
14
|
const readyCount = ref(0)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function nextFrame(): Promise<void> {
|
|
28
|
-
return new Promise((r) => requestAnimationFrame(() => r()))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// 换账号推荐顺序(§4.3):受控 prop 置 null → 等卸载 → clearAppContext 清 A 残留
|
|
32
|
-
// → 登录 B → 更新受控 prop 触发新代次(getContext + loadRemote + onSession 全走一遍)
|
|
33
|
-
async function switchUser(): Promise<void> {
|
|
34
|
-
sessionKey.value = null
|
|
35
|
-
await nextFrame()
|
|
36
|
-
clearAppContext()
|
|
37
|
-
login('login-2-bob', { id: 2, name: 'Bob' })
|
|
38
|
-
userName.value = 'Bob'
|
|
39
|
-
sessionKey.value = 'login-2-bob'
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// 登出:prop 置 null → 桥接立即卸载且不再请求 → 宿主清理全局 context
|
|
43
|
-
async function doLogout(): Promise<void> {
|
|
44
|
-
sessionKey.value = null
|
|
45
|
-
await nextFrame()
|
|
46
|
-
clearAppContext()
|
|
47
|
-
logout()
|
|
48
|
-
userName.value = ''
|
|
49
|
-
}
|
|
15
|
+
function handleReady(): void { readyCount.value++ }
|
|
16
|
+
// 这些函数只改业务状态;换代、清理旧上下文与卸载顺序由插件负责。
|
|
17
|
+
function switchUser(): void { login({ id: 2, name: 'Bob' }) }
|
|
18
|
+
function doLogout(): void { logout() }
|
|
50
19
|
</script>
|
|
51
20
|
|
|
52
21
|
<template>
|
|
53
22
|
<div style="font-family: sans-serif; padding: 16px; max-width: 720px">
|
|
54
23
|
<h1>Vue 宿主 × React 子应用(@fulgurjs/federation/vue)</h1>
|
|
55
|
-
<p data-testid="demo-session"
|
|
24
|
+
<p data-testid="demo-session">当前用户:{{ userName || '未登录' }}· onReady 次数:{{ readyCount }}</p>
|
|
56
25
|
|
|
57
26
|
<p>
|
|
58
|
-
<button data-testid="demo-switch" @click="switchUser">切换到 Bob
|
|
59
|
-
<button data-testid="demo-
|
|
27
|
+
<button data-testid="demo-switch" @click="switchUser">切换到 Bob(自动重挂)</button>
|
|
28
|
+
<button data-testid="demo-refresh-token" @click="refreshToken">刷新 token(不重挂)</button>
|
|
29
|
+
<button data-testid="demo-logout" @click="doLogout">登出(自动卸载)</button>
|
|
60
30
|
</p>
|
|
61
31
|
|
|
62
32
|
<!-- 外层元素控制桥接区域外观;appProps 是挂载时浅拷贝快照,换引用不重挂,重挂用 :key -->
|
|
63
33
|
<section style="margin-top: 12px">
|
|
64
34
|
<RemoteReactApp
|
|
65
|
-
:session-key="sessionKey"
|
|
66
35
|
:app-props="{ label, onReady: handleReady }"
|
|
67
36
|
/>
|
|
68
37
|
</section>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 演示宿主的业务登录状态与上下文。真实工程复用已有登录 store,不复制本示例的假账号。
|
|
3
|
+
* session getter 仅返回非敏感用户ID;插件负责代次/恢复/卸载,token刷新不触发重挂。
|
|
4
|
+
* 一个响应式快照让用户与token同时提交,避免在换号中间态把旧用户配上新凭据。
|
|
5
|
+
*/
|
|
6
|
+
import { shallowRef } from 'vue'
|
|
7
|
+
|
|
8
|
+
interface HostUser { id: number; name: string }
|
|
9
|
+
const current = shallowRef<{ user: HostUser; token: string } | null>({
|
|
10
|
+
user: { id: 1, name: 'Alice' }, token: 'demo-alice-token',
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const currentUser = () => current.value?.user ?? null
|
|
14
|
+
export const sessionIdentity = () => current.value?.user.id ?? null
|
|
15
|
+
|
|
16
|
+
/** 业务快照不填sessionKey;桥接层从自动会话补入,函数每次读取当前登录状态。 */
|
|
17
|
+
export function getLatestHostContext() {
|
|
18
|
+
return { user: current.value?.user ?? {}, getToken: () => current.value?.token }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function login(user: HostUser): void {
|
|
22
|
+
current.value = { user, token: `demo-token-${user.id}-${Date.now()}` }
|
|
23
|
+
}
|
|
24
|
+
export function logout(): void { current.value = null }
|
|
25
|
+
/** 只换凭据:身份不变,插件保持同一个子应用实例。 */
|
|
26
|
+
export function refreshToken(): void {
|
|
27
|
+
if (current.value) current.value = { ...current.value, token: `demo-refresh-${Date.now()}` }
|
|
28
|
+
}
|
|
@@ -11,8 +11,8 @@ importers:
|
|
|
11
11
|
host:
|
|
12
12
|
dependencies:
|
|
13
13
|
'@fulgurjs/federation':
|
|
14
|
-
specifier: 6.
|
|
15
|
-
version: 6.
|
|
14
|
+
specifier: 6.12.0
|
|
15
|
+
version: 6.12.0(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))
|
|
16
16
|
vue:
|
|
17
17
|
specifier: ^3.5.13
|
|
18
18
|
version: 3.5.44(typescript@5.9.3)
|
|
@@ -36,8 +36,8 @@ importers:
|
|
|
36
36
|
remote:
|
|
37
37
|
dependencies:
|
|
38
38
|
'@fulgurjs/federation':
|
|
39
|
-
specifier: 6.
|
|
40
|
-
version: 6.
|
|
39
|
+
specifier: 6.12.0
|
|
40
|
+
version: 6.12.0(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))
|
|
41
41
|
vue:
|
|
42
42
|
specifier: ^3.5.13
|
|
43
43
|
version: 3.5.44(typescript@5.9.3)
|
|
@@ -386,8 +386,8 @@ packages:
|
|
|
386
386
|
cpu: [x64]
|
|
387
387
|
os: [win32]
|
|
388
388
|
|
|
389
|
-
'@fulgurjs/federation@6.
|
|
390
|
-
resolution: {integrity: sha512-
|
|
389
|
+
'@fulgurjs/federation@6.12.0':
|
|
390
|
+
resolution: {integrity: sha512-l37+A1drLgzIztZBTthhQKWuLXUwtsjfv5WQ2cqOHwMxVu/2qYwaacAk4OgDcN/6M4Vyjj8hMGNQL6Hd3Zr46Q==}
|
|
391
391
|
engines: {node: '>=18'}
|
|
392
392
|
hasBin: true
|
|
393
393
|
peerDependencies:
|
|
@@ -955,7 +955,7 @@ snapshots:
|
|
|
955
955
|
'@esbuild/win32-x64@0.27.7':
|
|
956
956
|
optional: true
|
|
957
957
|
|
|
958
|
-
'@fulgurjs/federation@6.
|
|
958
|
+
'@fulgurjs/federation@6.12.0(vite@6.4.4)(vue-router@4.6.4(vue@3.5.44(typescript@5.9.3)))(vue@3.5.44(typescript@5.9.3))':
|
|
959
959
|
dependencies:
|
|
960
960
|
es-module-lexer: 1.7.0
|
|
961
961
|
esbuild: 0.27.7
|
|
@@ -2,7 +2,7 @@ packages:
|
|
|
2
2
|
- host
|
|
3
3
|
- remote
|
|
4
4
|
minimumReleaseAgeExclude:
|
|
5
|
-
- '@fulgurjs/federation@6.11.4'
|
|
5
|
+
- '@fulgurjs/federation@6.11.4 || 6.12.0'
|
|
6
6
|
# pnpm >=12 构建脚本批准(12 起弃用 onlyBuiltDependencies;pnpm 9-11 忽略本键:
|
|
7
7
|
# esbuild >=0.16 二进制经 optionalDependencies 平台包分发,postinstall 仅校验,不阻塞安装)
|
|
8
8
|
allowBuilds:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fulgurjs/federation",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.12.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vite Module Federation for Vue and React: remote modules, shared dependencies and app bridges.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -85,6 +85,10 @@
|
|
|
85
85
|
"./internal/vue-store.js": {
|
|
86
86
|
"types": "./dist/vue-store.d.ts",
|
|
87
87
|
"import": "./dist/vue-store.js"
|
|
88
|
+
},
|
|
89
|
+
"./internal/bridge-session-auto.js": {
|
|
90
|
+
"types": "./dist/bridge-session-auto.d.ts",
|
|
91
|
+
"import": "./dist/bridge-session-auto.js"
|
|
88
92
|
}
|
|
89
93
|
},
|
|
90
94
|
"typesVersions": {
|
|
@@ -122,7 +126,7 @@
|
|
|
122
126
|
"types"
|
|
123
127
|
],
|
|
124
128
|
"scripts": {
|
|
125
|
-
"build": "cp ../../README.md README.md && cp ../../README.en.md README.en.md && mkdir -p docs && mkdir -p docs/zh/reference docs/en/reference docs/maintainers && cp ../../docs/zh/reference/api.md ../../docs/zh/reference/errors.md ../../docs/zh/reference/types.md docs/zh/reference/ && cp ../../docs/en/reference/api.md ../../docs/en/reference/errors.md ../../docs/en/reference/types.md docs/en/reference/ && cp ../../docs/maintainers/webpack-mf-对照与缺口.md ../../docs/maintainers/沙箱边界审计.md ../../docs/maintainers/compatibility-testing.md docs/maintainers/ && cp ../../CHANGELOG.md CHANGELOG.md && node scripts/sync-package-examples.mjs && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime.mjs && tsup src/index.ts src/pages.ts src/vue-adapter.ts src/react-adapter.ts src/context.ts src/bridge-core.ts src/bridge-errors.ts src/bridge-session.ts src/bridge-app-vue.ts src/bridge-app-react.ts src/vue-store.ts src/bridge-host-vue.ts src/bridge-host-react.ts --format esm,cjs --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 --clean && tsup src/runtime-entry.ts --format esm --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 && tsup src/vue.ts --format esm --dts --external vite,vue,vue-router,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/react.ts --format esm --dts --external vite,react,react-dom,react-router-dom,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/bridge-router-vue.ts --format esm --dts --external vite,vue,vue-router --target node18 && tsup src/bridge-router-react.tsx --format esm --dts --external vite,react,react-dom,react-router-dom --target node18 && esbuild src/cli.ts --bundle --format=esm --target=node18 --platform=node --outfile=dist/cli.js && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime-entry.mjs && node scripts/check-gzip.mjs && node scripts/check-tree-shaking.mjs && node scripts/check-manual-codes.mjs",
|
|
129
|
+
"build": "cp ../../README.md README.md && cp ../../README.en.md README.en.md && mkdir -p docs && mkdir -p docs/zh/reference docs/en/reference docs/maintainers && cp ../../docs/zh/reference/api.md ../../docs/zh/reference/errors.md ../../docs/zh/reference/types.md docs/zh/reference/ && cp ../../docs/en/reference/api.md ../../docs/en/reference/errors.md ../../docs/en/reference/types.md docs/en/reference/ && cp ../../docs/maintainers/webpack-mf-对照与缺口.md ../../docs/maintainers/沙箱边界审计.md ../../docs/maintainers/compatibility-testing.md docs/maintainers/ && cp ../../CHANGELOG.md CHANGELOG.md && node scripts/sync-package-examples.mjs && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime.mjs && tsup src/index.ts src/pages.ts src/vue-adapter.ts src/react-adapter.ts src/context.ts src/bridge-core.ts src/bridge-errors.ts src/bridge-session.ts src/bridge-app-vue.ts src/bridge-app-react.ts src/vue-store.ts src/bridge-host-vue.ts src/bridge-host-react.ts src/bridge-session-auto.ts --format esm,cjs --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 --clean && tsup src/runtime-entry.ts --format esm --dts --external vite --external @fulgurjs/federation/internal/registry.js --target node18 && tsup src/vue.ts --format esm --dts --external vite,vue,vue-router,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/react.ts --format esm --dts --external vite,react,react-dom,react-router-dom,@fulgurjs/federation/internal/registry.js --target node18 && tsup src/bridge-router-vue.ts --format esm --dts --external vite,vue,vue-router --target node18 && tsup src/bridge-router-react.tsx --format esm --dts --external vite,react,react-dom,react-router-dom --target node18 && esbuild src/cli.ts --bundle --format=esm --target=node18 --platform=node --outfile=dist/cli.js && esbuild src/runtime/index.ts --bundle --format=esm --target=es2022 --minify --outfile=dist/runtime.js && node scripts/gen-runtime-entry.mjs && node scripts/check-gzip.mjs && node scripts/check-tree-shaking.mjs && node scripts/check-manual-codes.mjs",
|
|
126
130
|
"dev": "tsup --watch",
|
|
127
131
|
"test": "vitest run --dir tests",
|
|
128
132
|
"typecheck": "tsc --noEmit",
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 宿主自有会话源(示例实现):返回「当前登录用户」的完整 AppContext 快照。
|
|
3
|
-
* 要求(任务书 §4.3):纯同步、无副作用、不调 provideAppContext、不返回 Promise。
|
|
4
|
-
* 真实项目里通常读登录 store / token 管理器——只要保持「同步快照 getter」语义即可。
|
|
5
|
-
*/
|
|
6
|
-
export interface HostSession {
|
|
7
|
-
key: string | null
|
|
8
|
-
user: { id: number; name: string }
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
let current: HostSession = { key: 'login-1-alice', user: { id: 1, name: 'Alice' } }
|
|
12
|
-
|
|
13
|
-
export function getLatestHostContext(): Record<string, unknown> & { sessionKey: string } {
|
|
14
|
-
if (current.key === null) throw new Error('已登出:此刻不应有桥接代次请求 context')
|
|
15
|
-
return {
|
|
16
|
-
sessionKey: current.key,
|
|
17
|
-
user: current.user,
|
|
18
|
-
// 取最新 token 用拉取式函数引用,防止快照过期(README §9)
|
|
19
|
-
getToken: () => `token-for-${current.key}`,
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function login(key: string, user: { id: number; name: string }): void {
|
|
24
|
-
current = { key, user }
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function logout(): void {
|
|
28
|
-
current = { key: null, user: { id: 0, name: '' } }
|
|
29
|
-
}
|