@fulgurjs/federation 5.2.5 → 5.3.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.
Files changed (101) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/DESIGN.md +7 -0
  3. package/README.en.md +86 -4
  4. package/README.md +125 -3
  5. package/dist/bridge-app-react.cjs +185 -0
  6. package/dist/bridge-app-react.d.cts +37 -0
  7. package/dist/bridge-app-react.d.ts +37 -0
  8. package/dist/bridge-app-react.js +115 -0
  9. package/dist/bridge-app-vue.cjs +111 -0
  10. package/dist/bridge-app-vue.d.cts +34 -0
  11. package/dist/bridge-app-vue.d.ts +34 -0
  12. package/dist/bridge-app-vue.js +51 -0
  13. package/dist/bridge-core-6uLJiMVa.d.ts +42 -0
  14. package/dist/bridge-core.cjs +232 -0
  15. package/dist/bridge-core.d.cts +51 -0
  16. package/dist/bridge-core.d.ts +51 -0
  17. package/dist/bridge-core.js +21 -0
  18. package/dist/bridge-errors.cjs +114 -0
  19. package/dist/bridge-errors.d.cts +36 -0
  20. package/dist/bridge-errors.d.ts +36 -0
  21. package/dist/bridge-errors.js +15 -0
  22. package/dist/bridge-host-react-C55RmGll.d.ts +35 -0
  23. package/dist/bridge-host-react.cjs +400 -0
  24. package/dist/bridge-host-react.d.cts +45 -0
  25. package/dist/bridge-host-react.d.ts +45 -0
  26. package/dist/bridge-host-react.js +183 -0
  27. package/dist/bridge-host-vue-BAxDKqGH.d.ts +32 -0
  28. package/dist/bridge-host-vue.cjs +437 -0
  29. package/dist/bridge-host-vue.d.cts +39 -0
  30. package/dist/bridge-host-vue.d.ts +39 -0
  31. package/dist/bridge-host-vue.js +214 -0
  32. package/dist/bridge-react.d.ts +12 -0
  33. package/dist/bridge-react.js +3 -0
  34. package/dist/bridge-vue.d.ts +8 -0
  35. package/dist/bridge-vue.js +3 -0
  36. package/dist/bridge.d.ts +16 -0
  37. package/dist/bridge.js +5 -0
  38. package/dist/chunk-DH2QMM4Y.js +76 -0
  39. package/dist/chunk-LE2G23E7.js +122 -0
  40. package/dist/chunk-MMXKQN2H.js +210 -0
  41. package/dist/chunk-OF2JCXTZ.js +15 -0
  42. package/dist/chunk-TOT3P7AK.js +1229 -0
  43. package/dist/chunk-TSYLDY6H.js +64 -0
  44. package/dist/chunk-X4F2BHNM.js +179 -0
  45. package/dist/context.js +8 -64
  46. package/dist/index.cjs +139 -13
  47. package/dist/index.js +139 -13
  48. package/dist/react.d.ts +47 -2
  49. package/dist/react.js +2 -0
  50. package/dist/runtime-entry.d.ts +44 -2
  51. package/dist/runtime-entry.js +1 -1
  52. package/dist/runtime.js +19 -19
  53. package/dist/vue.js +2 -0
  54. package/docs/webpack-mf-/345/257/271/347/205/247/344/270/216/347/274/272/345/217/243.md +1 -1
  55. package/docs//350/277/201/347/247/273/346/214/207/345/215/227.md +1 -1
  56. package/examples/README.en.md +20 -0
  57. package/examples/README.md +20 -0
  58. package/examples/bridge/README.md +36 -0
  59. package/examples/bridge/react-host/README.md +23 -0
  60. package/examples/bridge/react-host/fulgurjs.config.ts +20 -0
  61. package/examples/bridge/react-host/index.html +11 -0
  62. package/examples/bridge/react-host/package-lock.json +2457 -0
  63. package/examples/bridge/react-host/package.json +24 -0
  64. package/examples/bridge/react-host/src/env.d.ts +7 -0
  65. package/examples/bridge/react-host/src/host-session.ts +26 -0
  66. package/examples/bridge/react-host/src/main.tsx +62 -0
  67. package/examples/bridge/react-host/tsconfig.json +13 -0
  68. package/examples/bridge/react-host/vite.config.ts +9 -0
  69. package/examples/bridge/react-remote/README.md +20 -0
  70. package/examples/bridge/react-remote/fulgurjs.config.ts +17 -0
  71. package/examples/bridge/react-remote/index.html +11 -0
  72. package/examples/bridge/react-remote/package-lock.json +2382 -0
  73. package/examples/bridge/react-remote/package.json +24 -0
  74. package/examples/bridge/react-remote/src/bridge.tsx +66 -0
  75. package/examples/bridge/react-remote/src/env.d.ts +7 -0
  76. package/examples/bridge/react-remote/src/main.tsx +7 -0
  77. package/examples/bridge/react-remote/tsconfig.json +13 -0
  78. package/examples/bridge/react-remote/vite.config.ts +9 -0
  79. package/examples/bridge/vue-host/README.md +24 -0
  80. package/examples/bridge/vue-host/fulgurjs.config.ts +22 -0
  81. package/examples/bridge/vue-host/index.html +11 -0
  82. package/examples/bridge/vue-host/package-lock.json +1885 -0
  83. package/examples/bridge/vue-host/package.json +24 -0
  84. package/examples/bridge/vue-host/src/App.vue +70 -0
  85. package/examples/bridge/vue-host/src/env.d.ts +7 -0
  86. package/examples/bridge/vue-host/src/host-session.ts +29 -0
  87. package/examples/bridge/vue-host/src/main.ts +4 -0
  88. package/examples/bridge/vue-host/tsconfig.json +13 -0
  89. package/examples/bridge/vue-host/vite.config.ts +9 -0
  90. package/examples/bridge/vue-remote/README.md +19 -0
  91. package/examples/bridge/vue-remote/fulgurjs.config.ts +16 -0
  92. package/examples/bridge/vue-remote/index.html +11 -0
  93. package/examples/bridge/vue-remote/package-lock.json +1856 -0
  94. package/examples/bridge/vue-remote/package.json +21 -0
  95. package/examples/bridge/vue-remote/src/App.vue +12 -0
  96. package/examples/bridge/vue-remote/src/bridge.ts +57 -0
  97. package/examples/bridge/vue-remote/src/env.d.ts +7 -0
  98. package/examples/bridge/vue-remote/src/main.ts +15 -0
  99. package/examples/bridge/vue-remote/tsconfig.json +13 -0
  100. package/examples/bridge/vue-remote/vite.config.ts +9 -0
  101. package/package.json +43 -2
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "fulgurjs-demo-bridge-react-host",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite --port 5304 --strictPort",
8
+ "build": "vite build",
9
+ "preview": "vite preview --port 5304 --strictPort"
10
+ },
11
+ "dependencies": {
12
+ "@fulgurjs/federation": "5.3.0",
13
+ "react": "^19.1.0",
14
+ "react-dom": "^19.1.0",
15
+ "vue": "^3.5.13"
16
+ },
17
+ "devDependencies": {
18
+ "@types/react": "^19.1.0",
19
+ "@types/react-dom": "^19.1.0",
20
+ "@vitejs/plugin-react": "^5.0.0",
21
+ "typescript": "^5.8.0",
22
+ "vite": "^6.3.5"
23
+ }
24
+ }
@@ -0,0 +1,7 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ declare module '*.vue' {
4
+ import type { DefineComponent } from 'vue'
5
+ const component: DefineComponent<Record<string, never>, Record<string, never>, unknown>
6
+ export default component
7
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 宿主自有会话源(示例实现):同步纯 getter,语义要求同 vue-host/src/host-session.ts。
3
+ */
4
+ export interface HostSession {
5
+ key: string | null
6
+ user: { id: number; name: string }
7
+ }
8
+
9
+ let current: HostSession = { key: 'login-1-alice', user: { id: 1, name: 'Alice' } }
10
+
11
+ export function getLatestHostContext(): Record<string, unknown> & { sessionKey: string } {
12
+ if (current.key === null) throw new Error('已登出:此刻不应有桥接代次请求 context')
13
+ return {
14
+ sessionKey: current.key,
15
+ user: current.user,
16
+ getToken: () => `token-for-${current.key}`,
17
+ }
18
+ }
19
+
20
+ export function login(key: string, user: { id: number; name: string }): void {
21
+ current = { key, user }
22
+ }
23
+
24
+ export function logout(): void {
25
+ current = { key: null, user: { id: 0, name: '' } }
26
+ }
@@ -0,0 +1,62 @@
1
+ import { StrictMode, useCallback, useState } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import { clearAppContext } from '@fulgurjs/federation/react'
4
+ import { createReactBridgeApp } from '@fulgurjs/federation/bridge/react'
5
+ import { getLatestHostContext, login, logout } from './host-session'
6
+
7
+ // 工厂选项:fallback(pending 占位)、error(节点或 (error, retry) => ReactNode)、
8
+ // retries、timeout、getContext 与 Vue 宿主同语义
9
+ const RemoteVueApp = createReactBridgeApp('bridge-vue-remote/bridge', {
10
+ retries: 1,
11
+ getContext: () => getLatestHostContext(),
12
+ })
13
+
14
+ function Host() {
15
+ const [sessionKey, setSessionKey] = useState<string | null>('login-1-alice')
16
+ const [userName, setUserName] = useState('Alice')
17
+ const [label, setLabel] = useState('来自 React 宿主')
18
+ const [readyCount, setReadyCount] = useState(0)
19
+
20
+ const handleReady = useCallback(() => setReadyCount((c) => c + 1), [])
21
+
22
+ const nextFrame = async (): Promise<void> => {
23
+ await new Promise((r) => requestAnimationFrame(() => r(null)))
24
+ }
25
+
26
+ const switchUser = async (): Promise<void> => {
27
+ setSessionKey(null)
28
+ await nextFrame()
29
+ clearAppContext()
30
+ login('login-2-bob', { id: 2, name: 'Bob' })
31
+ setUserName('Bob')
32
+ setSessionKey('login-2-bob')
33
+ }
34
+
35
+ const doLogout = async (): Promise<void> => {
36
+ setSessionKey(null)
37
+ await nextFrame()
38
+ clearAppContext()
39
+ logout()
40
+ setUserName('')
41
+ }
42
+
43
+ return (
44
+ <div style={{ fontFamily: 'sans-serif', padding: 16, maxWidth: 720 }}>
45
+ <h1>React 宿主 × Vue 子应用(@fulgurjs/federation/bridge/react)</h1>
46
+ <p data-testid="demo-session">{`会话:${sessionKey ?? '未登录'}(${userName || '—'})· onReady 次数:${readyCount}`}</p>
47
+ <p>
48
+ <button data-testid="demo-switch" onClick={() => void switchUser()}>切换到 Bob(clearAppContext → 重挂)</button>
49
+ <button data-testid="demo-logout" onClick={() => void doLogout()}>登出(sessionKey → null)</button>
50
+ </p>
51
+ <section style={{ marginTop: 12 }}>
52
+ <RemoteVueApp sessionKey={sessionKey} appProps={{ label, onReady: handleReady }} />
53
+ </section>
54
+ </div>
55
+ )
56
+ }
57
+
58
+ createRoot(document.getElementById('root')!).render(
59
+ <StrictMode>
60
+ <Host />
61
+ </StrictMode>,
62
+ )
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "strict": true,
7
+ "jsx": "react-jsx",
8
+ "skipLibCheck": true,
9
+ "noEmit": true,
10
+ "types": ["vite/client"]
11
+ },
12
+ "include": ["src", "fulgurjs.config.ts", "vite.config.ts"]
13
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import { federation } from '@fulgurjs/federation'
4
+ import fulgurjsConfig from './fulgurjs.config'
5
+
6
+ export default defineConfig(({ command }) => ({
7
+ base: command === 'build' ? '/bridge-react-host/' : undefined,
8
+ plugins: [react(), federation(fulgurjsConfig)],
9
+ }))
@@ -0,0 +1,20 @@
1
+ # bridge-react-remote — React 桥接子应用示例
2
+
3
+ `@fulgurjs/federation` 跨框架桥接的 **React 18/19 子应用**侧示例:以 `defineBridgeApp`(`@fulgurjs/federation/react`)导出 `mount/unmount` 契约,可被 **Vue 宿主**(配合 `examples/bridge/vue-host`)整站挂载。
4
+
5
+ ## 运行
6
+
7
+ ```bash
8
+ npm install
9
+ npm run dev # http://localhost:5303(独立运行态)
10
+ npm run build # 产出 /bridge-react-remote/ 子路径产物
11
+ ```
12
+
13
+ ## 关键点
14
+
15
+ - `src/bridge.tsx`:`defineBridgeApp((props) => <MemoryRouter>…</MemoryRouter>)`,作为 `./bridge` expose 的默认导出。
16
+ - `mount` 的 Promise 在**首次根提交完成后**才 resolve(契约内建提交探针);首次渲染前报错会拒绝挂载并转 MFU-016。
17
+ - `react-dom/client` 在实际 mount 时才按需加载;共享子路径 `react-dom/client` 与 `react/jsx-runtime` 由宿主/子应用 shared 配方协商单实例。
18
+ - 子应用只安装并共享 `react` + `react-dom`(+ `react-router-dom` 为直接依赖),**不安装 Vue**。
19
+
20
+ 配套阅读:根目录 README §8.2「跨框架桥接 API — /bridge」。
@@ -0,0 +1,17 @@
1
+ import type { FederationOptions } from '@fulgurjs/federation'
2
+
3
+ /**
4
+ * React 子应用联邦配置:`./bridge` expose = defineBridgeApp 契约模块(任务书 §3.3)。
5
+ * 子应用只安装并共享自己的框架(react + react-dom),不为桥接安装 Vue。
6
+ */
7
+ export default {
8
+ name: 'bridge-react-remote',
9
+ filename: 'fulgurjs-remoteEntry.js',
10
+ exposes: {
11
+ './bridge': './src/bridge.tsx',
12
+ },
13
+ shared: {
14
+ react: { singleton: true },
15
+ 'react-dom': { singleton: true },
16
+ },
17
+ } satisfies FederationOptions
@@ -0,0 +1,11 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <title>bridge-react-remote(React 桥接子应用独立运行)</title>
6
+ </head>
7
+ <body>
8
+ <div id="root"></div>
9
+ <script type="module" src="/src/main.tsx"></script>
10
+ </body>
11
+ </html>