@seed-fe/mf-adapters 1.0.0-alpha.1 → 1.0.0-alpha.3

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/README.md CHANGED
@@ -43,8 +43,10 @@ pnpm add @seed-fe/mf-adapters
43
43
  ### 使用示例
44
44
 
45
45
  ```typescript
46
+ import type { MicroAppRuntimeProps } from '@seed-fe/mf-adapters';
47
+
46
48
  // 宿主框架传递给微应用
47
- renderApp({
49
+ mountApp({
48
50
  container: document,
49
51
  props: {
50
52
  app: {
@@ -56,7 +58,7 @@ renderApp({
56
58
  })
57
59
 
58
60
  // 微应用使用
59
- function App({ app }: RuntimeProps) {
61
+ function App({ app }: MicroAppRuntimeProps) {
60
62
  return (
61
63
  <BrowserRouter basename={app?.basename}>
62
64
  <Routes>
@@ -83,15 +85,15 @@ function App({ app }: RuntimeProps) {
83
85
 
84
86
  ```ts
85
87
  // src/mf-adapters/runtime.ts
86
- import { createMicroAppRuntime } from '@seed-fe/mf-adapters';
87
- import type { InitRuntimeFn, RenderAppFn, StartStandaloneFn } from '@seed-fe/mf-adapters';
88
+ import { createMicroFrontendAdapter } from '@seed-fe/mf-adapters';
89
+ import type { InitRuntimeFn, MountAppFn, MountAppOptions, StartStandaloneFn } from '@seed-fe/mf-adapters';
88
90
 
89
91
  // 使用类型别名,获得完整类型提示
90
92
  const initRuntime: InitRuntimeFn = async () => {
91
93
  // 初始化权限、认证、i18n 等
92
94
  };
93
95
 
94
- const renderApp: RenderAppFn = ({ container, props }) => {
96
+ const mountApp: MountAppFn = ({ container, props }) => {
95
97
  const root = createRoot(container as HTMLElement);
96
98
  root.render(<App {...props} />);
97
99
 
@@ -102,19 +104,24 @@ const renderApp: RenderAppFn = ({ container, props }) => {
102
104
  };
103
105
  };
104
106
 
105
- const startStandaloneApp: StartStandaloneFn = async (options) => {
107
+ // 或者使用 options 类型单独标注入参(适合 function 声明)
108
+ function mountApp2(options: MountAppOptions) {
109
+ return mountApp(options);
110
+ }
111
+
112
+ const startStandalone: StartStandaloneFn = async (options) => {
106
113
  await initRuntime();
107
- return renderApp({
114
+ return mountApp({
108
115
  container: options?.container ?? document,
109
116
  props: options?.props,
110
117
  });
111
118
  };
112
119
 
113
120
  // 创建运行时适配实例:内部完成 Garfish / qiankun 等宿主的适配与宿主检测
114
- export const microAppRuntime = createMicroAppRuntime({
121
+ export const microAppRuntime = createMicroFrontendAdapter({
115
122
  initRuntime,
116
- mountApp: renderApp,
117
- startStandalone: startStandaloneApp,
123
+ mountApp,
124
+ startStandalone,
118
125
  });
119
126
  ```
120
127
 
@@ -156,8 +163,8 @@ export { bootstrap, mount, unmount } from '@/mf-adapters';
156
163
  // - 宿主通过 Garfish 标准机制挂载微应用
157
164
  ```
158
165
 
159
- - 适配层内部使用 `Map<Document, AppInstance>` 管理实例,支持同一应用在多个容器中挂载
160
- - 微应用只需要确保 `initRuntime` 幂等、`renderApp` 返回的实例提供 `unmount()` 即可
166
+ - 适配层内部使用 `Map<Document, MicroAppInstance>` 管理实例,支持同一应用在多个容器中挂载
167
+ - 微应用只需要确保 `initRuntime` 幂等、`mountApp` 返回的实例提供 `unmount()` 即可
161
168
 
162
169
  ---
163
170
 
@@ -172,4 +179,4 @@ export const { bootstrap, mount, unmount } = microAppRuntime.qiankun ?? {};
172
179
  ```
173
180
 
174
181
  - 微应用侧暴露标准的 qiankun 生命周期
175
- - 每个 `container` 对应一个 `AppInstance`,适配层内部同样用 Map 管理实例,方便宿主做多实例或保活
182
+ - 每个 `container` 对应一个 `MicroAppInstance`,适配层内部同样用 Map 管理实例,方便宿主做多实例或保活
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var c=require('@seed-fe/logger');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var c__default=/*#__PURE__*/_interopDefault(c);var R=false;async function _(p){if(R)return;let{hosts:o,fallback:i}=p;for(let n of o)if(n.detect()){c__default.default.info(`[mf-runtime] detected micro-frontend host: ${n.name}`);try{await n.activate?.(),R=!0,c__default.default.info(`[mf-runtime] activated micro-frontend host: ${n.name}`);return}catch(s){c__default.default.error(`[mf-runtime] failed to activate ${n.name}, trying fallback`,s);}}R||(c__default.default.info("[mf-runtime] fallback to standalone mode"),await i());}function h(p){let{initRuntime:o,renderApp:i}=p,n=new Map;function s(){return {render(t){return o().then(()=>{let r=i({container:t.dom,props:{...t.props,app:t.props?.app}});n.set(t.dom,r),c__default.default.info(`[mf-runtime][garfish] rendered successfully: ${t.appName}`);}).catch(r=>{throw c__default.default.error(`[mf-runtime][garfish] render failed: ${t.appName}`,r),n.delete(t.dom),r})},destroy(t){try{let r=n.get(t.dom);r&&r.unmount(),n.delete(t.dom),c__default.default.info("[mf-runtime][garfish] destroy completed");}catch(r){c__default.default.error("[mf-runtime][garfish] destroy failed",r);}}}}return {provider:s}}function y(p){let{initRuntime:o,renderApp:i}=p,n=new Map;async function s(){try{await o(),c__default.default.info("[mf-runtime][qiankun] bootstrap completed");}catch(a){throw c__default.default.error("[mf-runtime][qiankun] bootstrap failed",a),a}}function t(a){try{let e=a.container??document,u=i({container:e,props:{...a,app:a.app}});n.set(e,u),c__default.default.info("[mf-runtime][qiankun] mount completed");}catch(e){throw c__default.default.error("[mf-runtime][qiankun] mount failed",e),e}}function r(a){try{let e=a?.container??document;n.get(e)?.unmount(),n.delete(e),c__default.default.info("[mf-runtime][qiankun] unmount completed");}catch(e){throw c__default.default.error("[mf-runtime][qiankun] unmount failed",e),e}}return {bootstrap:s,mount:t,unmount:r}}function M(p){let{initRuntime:o,mountApp:i,startStandalone:n,hosts:s,extraHosts:t}=p,r=s?.garfish??true,a=s?.qiankun??true,e=[];if(r){let{provider:d}=h({initRuntime:o,renderApp:m=>i({container:m.container,props:m.props})});if(typeof window<"u"&&window.__GARFISH__){let m=globalThis;m.__GARFISH_EXPORTS__||(m.__GARFISH_EXPORTS__={}),m.__GARFISH_EXPORTS__.provider=d;}e.push({name:"garfish",detect:()=>!!window.__GARFISH__,activate:()=>{typeof __GARFISH_EXPORTS__<"u"&&(__GARFISH_EXPORTS__.provider=d);}});}let u;if(a){let{bootstrap:d,mount:m,unmount:g}=y({initRuntime:o,renderApp:i});u={bootstrap:d,mount:m,unmount:g},e.push({name:"qiankun",detect:()=>!!window.__POWERED_BY_QIANKUN__,activate:()=>{c__default.default.info("[mf-adapter] qiankun");}});}return t?.length&&e.push(...t),_({hosts:e,fallback:()=>n()}),{startStandaloneApp:n,qiankun:u}}function T(p){let{initRuntime:o,renderApp:i}=p,n=null;return async function(t){return n||(await o(),n=i({container:t?.container??document,props:t?.props}),n)}}exports.createGarfishAdapter=h;exports.createMicroAppRuntime=M;exports.createQiankunAdapter=y;exports.createStandaloneStarter=T;exports.initMicroFrontendHosts=_;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var u=require('@seed-fe/logger');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var u__default=/*#__PURE__*/_interopDefault(u);var M="@seed-fe/mf-adapters";function o(i){return i?`[${M}][${i}]`:`[${M}]`}var h=false;async function R(i){if(h)return;let{hosts:a,fallback:p}=i;for(let t of a)if(t.detect()){u__default.default.info(`${o("host-manager")} detected host: ${t.name}`);try{await t.activate?.(),h=!0,u__default.default.info(`${o("host-manager")} activated host: ${t.name}`);return}catch(s){u__default.default.error(`${o("host-manager")} failed to activate ${t.name}, trying fallback`,s);}}h||(u__default.default.info(`${o("host-manager")} fallback to standalone mode`),await p(),h=true);}function y(i){let{initRuntime:a,mountApp:p}=i,t=new Map;function s(){return {render(n){return a().then(()=>{let e=p({container:n.dom,props:n.props});t.set(n.dom,e),u__default.default.info(`${o("garfish")} rendered successfully: ${n.appName}`);}).catch(e=>{throw u__default.default.error(`${o("garfish")} render failed: ${n.appName}`,e),t.delete(n.dom),e})},destroy(n){try{let e=t.get(n.dom);e&&e.unmount(),t.delete(n.dom),u__default.default.info(`${o("garfish")} destroy completed`);}catch(e){u__default.default.error(`${o("garfish")} destroy failed`,e);}}}}return {provider:s}}function g(i){let{initRuntime:a,mountApp:p}=i,t=new Map;async function s(){try{await a(),u__default.default.info(`${o("qiankun")} bootstrap completed`);}catch(c){throw u__default.default.error(`${o("qiankun")} bootstrap failed`,c),c}}function n(c){try{let r=c.container??document,d=p({container:r,props:c});t.set(r,d),u__default.default.info(`${o("qiankun")} mount completed`);}catch(r){throw u__default.default.error(`${o("qiankun")} mount failed`,r),r}}function e(c){try{let r=c?.container??document;t.get(r)?.unmount(),t.delete(r),u__default.default.info(`${o("qiankun")} unmount completed`);}catch(r){throw u__default.default.error(`${o("qiankun")} unmount failed`,r),r}}return {bootstrap:s,mount:n,unmount:e}}function T(i){let{initRuntime:a,mountApp:p,startStandalone:t,hosts:s,extraHosts:n}=i,e=s?.garfish??true,c=s?.qiankun??true,r=[];if(e){let{provider:l}=y({initRuntime:a,mountApp:f=>p({container:f.container,props:f.props})});if(window.__GARFISH__){let f=globalThis;f.__GARFISH_EXPORTS__||(f.__GARFISH_EXPORTS__={}),f.__GARFISH_EXPORTS__.provider=l;}r.push({name:"garfish",detect:()=>!!window.__GARFISH__,activate:()=>{typeof __GARFISH_EXPORTS__<"u"&&(__GARFISH_EXPORTS__.provider=l);}});}let d;if(c){let{bootstrap:l,mount:f,unmount:x}=g({initRuntime:a,mountApp:p});d={bootstrap:l,mount:f,unmount:x},r.push({name:"qiankun",detect:()=>!!window.__POWERED_BY_QIANKUN__});}return n?.length&&r.push(...n),R({hosts:r,fallback:()=>t()}),{startStandalone:t,qiankun:d}}function L(i){let{initRuntime:a,mountApp:p}=i,t=null;return async function(n){return t||(await a(),t=p({container:n?.container??document,props:n?.props}),t)}}exports.createGarfishAdapter=y;exports.createMicroFrontendAdapter=T;exports.createQiankunAdapter=g;exports.createStandaloneStarter=L;exports.initMicroFrontendHosts=R;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/hostManager.ts","../src/hosts/garfish.ts","../src/hosts/qiankun.ts","../src/core/setup.ts","../src/core/standalone.ts"],"names":["microFrontendResolved","initMicroFrontendHosts","options","hosts","fallback","host","logger","error","createGarfishAdapter","initRuntime","renderApp","instances","provider","params","instance","createQiankunAdapter","bootstrap","mount","props","container","unmount","createMicroAppRuntime","mountApp","startStandalone","extraHosts","garfishEnabled","qiankunEnabled","hostAdapters","garfishOptions","globalWithExports","qiankunRuntime","createStandaloneStarter","standaloneInstance","customOptions"],"mappings":"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","file":"index.cjs","sourcesContent":["import logger from '@seed-fe/logger';\nimport type { AppInstance } from '../types/base';\n\nexport interface HostAdapterConfig {\n name: string;\n /**\n * 返回 true 表示当前宿主命中\n */\n detect(): boolean;\n /**\n * 命中宿主后调用,用于注册生命周期或执行初始化逻辑\n */\n activate?(): void | Promise<void>;\n}\n\nexport interface HostManagerOptions {\n hosts: HostAdapterConfig[];\n /**\n * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandaloneApp\n */\n fallback: () => Promise<AppInstance> | Promise<unknown>;\n}\n\nlet microFrontendResolved = false;\n\n/**\n * 根据宿主环境动态选择微前端框架,若未检测到宿主则回退为独立运行模式。\n */\nexport async function initMicroFrontendHosts(options: HostManagerOptions): Promise<void> {\n if (microFrontendResolved) {\n return;\n }\n\n const { hosts, fallback } = options;\n\n for (const host of hosts) {\n if (host.detect()) {\n logger.info(`[mf-runtime] detected micro-frontend host: ${host.name}`);\n\n try {\n await host.activate?.();\n microFrontendResolved = true;\n logger.info(`[mf-runtime] activated micro-frontend host: ${host.name}`);\n return;\n } catch (error) {\n logger.error(`[mf-runtime] failed to activate ${host.name}, trying fallback`, error);\n // 继续尝试下一个宿主或回退到独立模式\n }\n }\n }\n\n // 如果所有宿主激活失败或未检测到任何宿主,调用 fallback\n if (!microFrontendResolved) {\n logger.info('[mf-runtime] fallback to standalone mode');\n await fallback();\n }\n}\n","import logger from '@seed-fe/logger';\nimport type { AdapterOptions, AppInstance } from '../types/base';\nimport type { GarfishDestroyParams, GarfishRenderParams } from '../types/garfish';\n\n/**\n * 创建 Garfish 适配器:\n * - 提供 provider() 给 Garfish 宿主使用\n * - 内部通过 Map<Document, AppInstance> 管理实例,支持多容器挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createGarfishAdapter(options: AdapterOptions) {\n const { initRuntime, renderApp } = options;\n\n const instances = new Map<Document, AppInstance>();\n\n function provider() {\n return {\n render(params: GarfishRenderParams) {\n return initRuntime()\n .then(() => {\n const instance = renderApp({\n container: params.dom,\n props: {\n ...params.props,\n app: params.props?.app,\n },\n });\n instances.set(params.dom, instance);\n logger.info(`[mf-runtime][garfish] rendered successfully: ${params.appName}`);\n })\n .catch((error: Error) => {\n logger.error(`[mf-runtime][garfish] render failed: ${params.appName}`, error);\n // 清理可能的部分状态\n instances.delete(params.dom);\n // 重新抛出,让 Garfish 处理\n throw error;\n });\n },\n destroy(params: GarfishDestroyParams) {\n try {\n const instance = instances.get(params.dom);\n if (instance) {\n instance.unmount();\n }\n instances.delete(params.dom);\n logger.info('[mf-runtime][garfish] destroy completed');\n } catch (error) {\n // 仅记录错误,允许 Garfish 继续清理其他资源\n logger.error('[mf-runtime][garfish] destroy failed', error);\n }\n },\n };\n }\n\n return { provider };\n}\n","import logger from '@seed-fe/logger';\nimport type { AdapterOptions, AppInstance } from '../types/base';\nimport type { QiankunProps } from '../types/qiankun';\n\n/** @deprecated 使用 AdapterOptions 替代 */\nexport type QiankunAdapterOptions = AdapterOptions;\n\n/**\n * 创建 qiankun 适配器:\n * - 提供 bootstrap/mount/unmount 标准生命周期\n * - 内部通过 Map<container, AppInstance> 管理实例,支持多实例挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createQiankunAdapter(options: AdapterOptions) {\n const { initRuntime, renderApp } = options;\n\n const instances = new Map<Element | Document, AppInstance>();\n\n async function bootstrap() {\n try {\n await initRuntime();\n logger.info('[mf-runtime][qiankun] bootstrap completed');\n } catch (error) {\n logger.error('[mf-runtime][qiankun] bootstrap failed', error);\n throw error;\n }\n }\n\n function mount(props: QiankunProps) {\n try {\n const container = props.container ?? document;\n const instance = renderApp({\n container,\n props: {\n ...props,\n app: props.app,\n },\n });\n instances.set(container, instance);\n logger.info('[mf-runtime][qiankun] mount completed');\n } catch (error) {\n logger.error('[mf-runtime][qiankun] mount failed', error);\n throw error;\n }\n }\n\n function unmount(props?: QiankunProps) {\n try {\n const container = props?.container ?? document;\n const instance = instances.get(container);\n instance?.unmount();\n instances.delete(container);\n logger.info('[mf-runtime][qiankun] unmount completed');\n } catch (error) {\n logger.error('[mf-runtime][qiankun] unmount failed', error);\n throw error;\n }\n }\n\n return { bootstrap, mount, unmount };\n}\n","import logger from '@seed-fe/logger';\nimport { createGarfishAdapter } from '../hosts/garfish';\nimport { createQiankunAdapter } from '../hosts/qiankun';\nimport type { AppInstance, InitRuntimeFn, RenderAppFn, StartStandaloneFn } from '../types/base';\nimport type { GarfishExports } from '../types/garfish';\nimport type { QiankunProps } from '../types/qiankun';\nimport type { HostAdapterConfig } from './hostManager';\nimport { initMicroFrontendHosts } from './hostManager';\nimport type { StandaloneOptions } from './standalone';\n\nexport interface MicroAppRuntimeOptions {\n /**\n * 微应用运行时初始化逻辑,由应用侧实现。\n * 典型职责:权限、认证、i18n 等一次性初始化。\n */\n initRuntime: InitRuntimeFn;\n /**\n * 微应用渲染逻辑,由应用侧实现。\n * - 适配层只关心 container / props 约定\n * - 内部可以是 React / Vue / 纯 DOM 等任意实现\n */\n mountApp: RenderAppFn;\n /**\n * 独立运行模式入口,由应用侧实现。\n * - 一般通过 createStandaloneStarter(initRuntime, renderApp) 生成\n * - 适配层只在未检测到任何宿主时调用\n */\n startStandalone: StartStandaloneFn;\n /**\n * 内置宿主框架配置\n *\n * - 默认全部启用(garfish: true, qiankun: true)\n * - 设置为 false 可禁用特定框架\n * - 设置为 {} 等同于全部启用\n *\n * @example\n * ```ts\n * // 默认全部启用\n * createMicroAppRuntime({ initRuntime, mountApp, startStandalone });\n *\n * // 仅启用 garfish\n * createMicroAppRuntime({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: true, qiankun: false },\n * });\n *\n * // 禁用所有内置框架,仅使用 extraHosts\n * createMicroAppRuntime({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: false, qiankun: false },\n * extraHosts: [customHost],\n * });\n * ```\n */\n hosts?: {\n garfish?: boolean;\n qiankun?: boolean;\n };\n /**\n * 额外宿主配置,用于接入其他微前端库\n * - 适合其他团队维护的宿主,仅需在微应用中传入配置即可\n */\n extraHosts?: HostAdapterConfig[];\n}\n\nexport interface MicroAppRuntime {\n /**\n * 独立运行模式入口(直接透传应用侧实现)\n */\n startStandaloneApp: (options?: StandaloneOptions) => Promise<AppInstance>;\n /**\n * qiankun 生命周期适配结果\n * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};\n */\n qiankun?: {\n bootstrap: () => Promise<void>;\n mount: (props: QiankunProps) => void;\n unmount: (props?: QiankunProps) => void;\n };\n}\n\n/**\n * 创建微应用运行时适配:\n * - 接收应用侧的 initRuntime / mountApp / startStandalone\n * - 内部完成 Garfish / qiankun 等宿主的适配与检测\n * - 返回 qiankun 生命周期供微应用按需导出\n *\n * 微应用层只需要:\n * 1. 提供 initRuntime / mountApp / startStandalone\n * 2. 在入口处调用 createMicroAppRuntime(...)\n * 3. 若需要支持 qiankun,再将 runtime.qiankun 的三个生命周期导出\n */\nexport function createMicroAppRuntime(options: MicroAppRuntimeOptions): MicroAppRuntime {\n const { initRuntime, mountApp, startStandalone, hosts, extraHosts } = options;\n\n // 默认全部启用\n const garfishEnabled = hosts?.garfish ?? true;\n const qiankunEnabled = hosts?.qiankun ?? true;\n\n const hostAdapters: HostAdapterConfig[] = [];\n\n // Garfish:通过 __GARFISH__ / __GARFISH_EXPORTS__ 适配 provider\n if (garfishEnabled) {\n const { provider } = createGarfishAdapter({\n initRuntime,\n renderApp: (garfishOptions) =>\n mountApp({\n container: garfishOptions.container,\n props: garfishOptions.props,\n }),\n });\n\n // 宿主模式下:若检测到 Garfish 标识,则立即挂载 provider。\n // 兼容两种注入方式:\n // - 宿主预先创建 __GARFISH_EXPORTS__\n // - 子应用自行创建 __GARFISH_EXPORTS__\n if (typeof window !== 'undefined' && (window as Window & { __GARFISH__?: boolean }).__GARFISH__) {\n const globalWithExports = globalThis as typeof globalThis & { __GARFISH_EXPORTS__?: GarfishExports };\n if (!globalWithExports.__GARFISH_EXPORTS__) {\n globalWithExports.__GARFISH_EXPORTS__ = {} as GarfishExports;\n }\n globalWithExports.__GARFISH_EXPORTS__.provider = provider;\n }\n\n hostAdapters.push({\n name: 'garfish',\n detect: () => Boolean(window.__GARFISH__),\n activate: () => {\n if (typeof __GARFISH_EXPORTS__ !== 'undefined') {\n __GARFISH_EXPORTS__.provider = provider;\n }\n },\n });\n }\n\n // qiankun:返回标准生命周期,由微应用按需导出\n let qiankunRuntime: MicroAppRuntime['qiankun'];\n\n if (qiankunEnabled) {\n const { bootstrap, mount, unmount } = createQiankunAdapter({\n initRuntime,\n renderApp: mountApp,\n });\n\n qiankunRuntime = {\n bootstrap,\n mount,\n unmount,\n };\n\n // 将 qiankun 添加到 hosts 数组用于检测\n // 虽然 qiankun 不需要 activate(宿主会主动调用生命周期),\n // 但仍需要 detect 以防止错误地进入独立运行模式\n hostAdapters.push({\n name: 'qiankun',\n detect: () => Boolean(window.__POWERED_BY_QIANKUN__),\n activate: () => {\n logger.info(`[mf-adapter] qiankun`);\n // qiankun 宿主会主动调用生命周期,无需额外激活\n },\n });\n }\n\n if (extraHosts?.length) {\n hostAdapters.push(...extraHosts);\n }\n\n // 初始化宿主检测 + 独立运行回退\n void initMicroFrontendHosts({\n hosts: hostAdapters,\n fallback: () => startStandalone(),\n });\n\n return {\n startStandaloneApp: startStandalone,\n qiankun: qiankunRuntime,\n };\n}\n","import type { AppInstance, InitRuntimeFn, RenderAppFn, RuntimeProps } from '../types/base';\n\nexport interface StandaloneOptions {\n container?: Document;\n props?: RuntimeProps;\n}\n\nexport interface StandaloneStarterOptions {\n initRuntime: InitRuntimeFn;\n renderApp: RenderAppFn;\n}\n\n/**\n * 创建独立运行模式启动器:\n * - 统一处理非微前端宿主环境下的初始化逻辑\n * - 内部保证单例实例,避免重复挂载\n */\nexport function createStandaloneStarter(options: StandaloneStarterOptions) {\n const { initRuntime, renderApp } = options;\n\n let standaloneInstance: AppInstance | null = null;\n\n return async function startStandaloneApp(customOptions?: StandaloneOptions): Promise<AppInstance> {\n if (standaloneInstance) {\n return standaloneInstance;\n }\n\n await initRuntime();\n\n standaloneInstance = renderApp({\n container: customOptions?.container ?? document,\n props: customOptions?.props,\n });\n\n return standaloneInstance;\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/log.ts","../src/core/hostManager.ts","../src/hosts/garfish.ts","../src/hosts/qiankun.ts","../src/core/setup.ts","../src/core/standalone.ts"],"names":["LOG_NAMESPACE","formatLogPrefix","scope","hasActivatedHost","initMicroFrontendHosts","options","hosts","fallback","host","logger","error","createGarfishAdapter","initRuntime","mountApp","instancesByDocument","provider","params","instance","createQiankunAdapter","instancesByContainer","bootstrap","mount","props","container","unmount","createMicroFrontendAdapter","startStandalone","extraHosts","garfishEnabled","qiankunEnabled","hostAdapters","garfishOptions","globalWithExports","qiankunLifecycles","createStandaloneStarter","standaloneInstance","customOptions"],"mappings":"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","file":"index.cjs","sourcesContent":["export const LOG_NAMESPACE = '@seed-fe/mf-adapters';\n\nexport function formatLogPrefix(scope?: string): string {\n return scope ? `[${LOG_NAMESPACE}][${scope}]` : `[${LOG_NAMESPACE}]`;\n}\n\n","import logger from '@seed-fe/logger';\nimport type { MicroAppInstance } from '../types/base';\nimport { formatLogPrefix } from './log';\n\nexport interface MicroFrontendHostAdapter {\n name: string;\n /**\n * 返回 true 表示当前宿主命中\n */\n detect(): boolean;\n /**\n * 命中宿主后调用,用于注册生命周期或执行初始化逻辑\n */\n activate?(): void | Promise<void>;\n}\n\nexport interface InitMicroFrontendHostsOptions {\n hosts: MicroFrontendHostAdapter[];\n /**\n * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandalone\n */\n fallback: () => Promise<MicroAppInstance> | Promise<unknown>;\n}\n\nlet hasActivatedHost = false;\n\n/**\n * 根据宿主环境动态选择微前端框架,若未检测到宿主则回退为独立运行模式。\n */\nexport async function initMicroFrontendHosts(options: InitMicroFrontendHostsOptions): Promise<void> {\n if (hasActivatedHost) {\n return;\n }\n\n const { hosts, fallback } = options;\n\n for (const host of hosts) {\n if (host.detect()) {\n logger.info(`${formatLogPrefix('host-manager')} detected host: ${host.name}`);\n\n try {\n await host.activate?.();\n hasActivatedHost = true;\n logger.info(`${formatLogPrefix('host-manager')} activated host: ${host.name}`);\n return;\n } catch (error) {\n logger.error(`${formatLogPrefix('host-manager')} failed to activate ${host.name}, trying fallback`, error);\n // 继续尝试下一个宿主或回退到独立模式\n }\n }\n }\n\n // 如果所有宿主激活失败或未检测到任何宿主,调用 fallback\n if (!hasActivatedHost) {\n logger.info(`${formatLogPrefix('host-manager')} fallback to standalone mode`);\n await fallback();\n hasActivatedHost = true;\n }\n}\n","import logger from '@seed-fe/logger';\nimport type { MicroAppRuntime, MicroAppInstance } from '../types/base';\nimport type { GarfishDestroyParams, GarfishRenderParams } from '../types/garfish';\nimport { formatLogPrefix } from '../core/log';\n\n/**\n * 创建 Garfish 适配器:\n * - 提供 provider() 给 Garfish 宿主使用\n * - 内部通过 Map<Document, MicroAppInstance> 管理实例,支持多容器挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createGarfishAdapter(options: MicroAppRuntime) {\n const { initRuntime, mountApp } = options;\n\n const instancesByDocument = new Map<Document, MicroAppInstance>();\n\n function provider() {\n return {\n render(params: GarfishRenderParams) {\n return initRuntime()\n .then(() => {\n const instance = mountApp({\n container: params.dom,\n props: params.props,\n });\n instancesByDocument.set(params.dom, instance);\n logger.info(`${formatLogPrefix('garfish')} rendered successfully: ${params.appName}`);\n })\n .catch((error: Error) => {\n logger.error(`${formatLogPrefix('garfish')} render failed: ${params.appName}`, error);\n // 清理可能的部分状态\n instancesByDocument.delete(params.dom);\n // 重新抛出,让 Garfish 处理\n throw error;\n });\n },\n destroy(params: GarfishDestroyParams) {\n try {\n const instance = instancesByDocument.get(params.dom);\n if (instance) {\n instance.unmount();\n }\n instancesByDocument.delete(params.dom);\n logger.info(`${formatLogPrefix('garfish')} destroy completed`);\n } catch (error) {\n // 仅记录错误,允许 Garfish 继续清理其他资源\n logger.error(`${formatLogPrefix('garfish')} destroy failed`, error);\n }\n },\n };\n }\n\n return { provider };\n}\n","import logger from '@seed-fe/logger';\nimport type { MicroAppRuntime, MicroAppInstance } from '../types/base';\nimport type { QiankunProps } from '../types/qiankun';\nimport { formatLogPrefix } from '../core/log';\n\n/**\n * 创建 qiankun 适配器:\n * - 提供 bootstrap/mount/unmount 标准生命周期\n * - 内部通过 Map<container, MicroAppInstance> 管理实例,支持多实例挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createQiankunAdapter(options: MicroAppRuntime) {\n const { initRuntime, mountApp } = options;\n\n const instancesByContainer = new Map<Element | Document, MicroAppInstance>();\n\n async function bootstrap() {\n try {\n await initRuntime();\n logger.info(`${formatLogPrefix('qiankun')} bootstrap completed`);\n } catch (error) {\n logger.error(`${formatLogPrefix('qiankun')} bootstrap failed`, error);\n throw error;\n }\n }\n\n function mount(props: QiankunProps) {\n try {\n const container = props.container ?? document;\n const instance = mountApp({\n container,\n props,\n });\n instancesByContainer.set(container, instance);\n logger.info(`${formatLogPrefix('qiankun')} mount completed`);\n } catch (error) {\n logger.error(`${formatLogPrefix('qiankun')} mount failed`, error);\n throw error;\n }\n }\n\n function unmount(props?: QiankunProps) {\n try {\n const container = props?.container ?? document;\n const instance = instancesByContainer.get(container);\n instance?.unmount();\n instancesByContainer.delete(container);\n logger.info(`${formatLogPrefix('qiankun')} unmount completed`);\n } catch (error) {\n logger.error(`${formatLogPrefix('qiankun')} unmount failed`, error);\n throw error;\n }\n }\n\n return { bootstrap, mount, unmount };\n}\n","import { createGarfishAdapter } from '../hosts/garfish';\nimport { createQiankunAdapter } from '../hosts/qiankun';\nimport type { InitRuntimeFn, MicroAppInstance, MountAppFn, StartStandaloneFn } from '../types/base';\nimport type { GarfishExports } from '../types/garfish';\nimport type { QiankunProps } from '../types/qiankun';\nimport type { MicroFrontendHostAdapter } from './hostManager';\nimport { initMicroFrontendHosts } from './hostManager';\n\nexport interface MicroFrontendAdapterOptions {\n /**\n * 微应用运行时初始化逻辑,由应用侧实现。\n * 典型职责:权限、认证、i18n 等一次性初始化。\n */\n initRuntime: InitRuntimeFn;\n /**\n * 微应用渲染逻辑,由应用侧实现。\n * - 适配层只关心 container / props 约定\n * - 内部可以是 React / Vue / 纯 DOM 等任意实现\n */\n mountApp: MountAppFn;\n /**\n * 独立运行模式入口,由应用侧实现。\n * - 一般通过 createStandaloneStarter({ initRuntime, mountApp }) 生成\n * - 适配层只在未检测到任何宿主时调用\n */\n startStandalone: StartStandaloneFn;\n /**\n * 内置宿主框架配置\n *\n * - 默认全部启用(garfish: true, qiankun: true)\n * - 设置为 false 可禁用特定框架\n * - 设置为 {} 等同于全部启用\n *\n * @example\n * ```ts\n * // 默认全部启用\n * createMicroFrontendAdapter({ initRuntime, mountApp, startStandalone });\n *\n * // 仅启用 garfish\n * createMicroFrontendAdapter({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: true, qiankun: false },\n * });\n *\n * // 禁用所有内置框架,仅使用 extraHosts\n * createMicroFrontendAdapter({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: false, qiankun: false },\n * extraHosts: [customHost],\n * });\n * ```\n */\n hosts?: {\n garfish?: boolean;\n qiankun?: boolean;\n };\n /**\n * 额外宿主配置,用于接入其他微前端库\n * - 适合其他团队维护的宿主,仅需在微应用中传入配置即可\n */\n extraHosts?: MicroFrontendHostAdapter[];\n}\n\nexport interface MicroFrontendAdapter {\n /**\n * 独立运行模式入口(直接透传应用侧实现)\n */\n startStandalone: StartStandaloneFn;\n /**\n * qiankun 生命周期适配结果\n * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};\n */\n qiankun?: {\n bootstrap: () => Promise<void>;\n mount: (props: QiankunProps) => void;\n unmount: (props?: QiankunProps) => void;\n };\n}\n\n/**\n * 创建微前端适配器:\n * - 接收应用侧的 initRuntime / mountApp / startStandalone\n * - 内部完成 Garfish / qiankun 等宿主的适配与检测\n * - 返回 qiankun 生命周期供微应用按需导出\n *\n * 微应用层只需要:\n * 1. 提供 initRuntime / mountApp / startStandalone\n * 2. 在入口处调用 createMicroFrontendAdapter(...)\n * 3. 若需要支持 qiankun,再将 adapter.qiankun 的三个生命周期导出\n */\nexport function createMicroFrontendAdapter(options: MicroFrontendAdapterOptions): MicroFrontendAdapter {\n const { initRuntime, mountApp, startStandalone, hosts, extraHosts } = options;\n\n // 默认全部启用\n const garfishEnabled = hosts?.garfish ?? true;\n const qiankunEnabled = hosts?.qiankun ?? true;\n\n const hostAdapters: MicroFrontendHostAdapter[] = [];\n\n // Garfish:通过 __GARFISH__ / __GARFISH_EXPORTS__ 适配 provider\n if (garfishEnabled) {\n const { provider } = createGarfishAdapter({\n initRuntime,\n mountApp: (garfishOptions) =>\n mountApp({\n container: garfishOptions.container,\n props: garfishOptions.props,\n }),\n });\n\n // 宿主模式下:若检测到 Garfish 标识,则立即挂载 provider。\n // 兼容两种注入方式:\n // - 宿主预先创建 __GARFISH_EXPORTS__\n // - 子应用自行创建 __GARFISH_EXPORTS__\n if (window.__GARFISH__) {\n const globalWithExports = globalThis as typeof globalThis & { __GARFISH_EXPORTS__?: GarfishExports };\n if (!globalWithExports.__GARFISH_EXPORTS__) {\n globalWithExports.__GARFISH_EXPORTS__ = {} as GarfishExports;\n }\n globalWithExports.__GARFISH_EXPORTS__.provider = provider;\n }\n\n hostAdapters.push({\n name: 'garfish',\n detect: () => Boolean(window.__GARFISH__),\n activate: () => {\n if (typeof __GARFISH_EXPORTS__ !== 'undefined') {\n __GARFISH_EXPORTS__.provider = provider;\n }\n },\n });\n }\n\n // qiankun:返回标准生命周期,由微应用按需导出\n let qiankunLifecycles: MicroFrontendAdapter['qiankun'];\n\n if (qiankunEnabled) {\n const { bootstrap, mount, unmount } = createQiankunAdapter({\n initRuntime,\n mountApp,\n });\n\n qiankunLifecycles = {\n bootstrap,\n mount,\n unmount,\n };\n\n // 将 qiankun 添加到 hosts 数组用于检测\n // 虽然 qiankun 不需要 activate(宿主会主动调用生命周期),\n // 但仍需要 detect 以防止错误地进入独立运行模式\n hostAdapters.push({\n name: 'qiankun',\n detect: () => Boolean(window.__POWERED_BY_QIANKUN__),\n });\n }\n\n if (extraHosts?.length) {\n hostAdapters.push(...extraHosts);\n }\n\n // 初始化宿主检测 + 独立运行回退\n void initMicroFrontendHosts({\n hosts: hostAdapters,\n fallback: () => startStandalone(),\n });\n\n return {\n startStandalone,\n qiankun: qiankunLifecycles,\n };\n}\n","import type { MicroAppRuntime, MicroAppInstance, StartStandaloneFn, StartStandaloneOptions } from '../types/base';\n\n/**\n * 创建独立运行模式启动器:\n * - 统一处理非微前端宿主环境下的初始化逻辑\n * - 内部保证单例实例,避免重复挂载\n */\nexport function createStandaloneStarter(options: MicroAppRuntime): StartStandaloneFn {\n const { initRuntime, mountApp } = options;\n\n let standaloneInstance: MicroAppInstance | null = null;\n\n return async function startStandalone(customOptions?: StartStandaloneOptions): Promise<MicroAppInstance> {\n if (standaloneInstance) {\n return standaloneInstance;\n }\n\n await initRuntime();\n\n standaloneInstance = mountApp({\n container: customOptions?.container ?? document,\n props: customOptions?.props,\n });\n\n return standaloneInstance;\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -27,7 +27,7 @@ interface MicroAppConfig {
27
27
  * - 不关心具体实现细节(权限 / 认证 / i18n 等)
28
28
  * - 支持宿主透传扩展字段
29
29
  */
30
- interface RuntimeProps {
30
+ interface MicroAppRuntimeProps {
31
31
  /**
32
32
  * 主应用传递的微应用配置信息
33
33
  *
@@ -47,7 +47,7 @@ interface RuntimeProps {
47
47
  *
48
48
  * 由微应用自行决定实例内部结构,这里只约定必须提供 unmount 方法。
49
49
  */
50
- interface AppInstance {
50
+ interface MicroAppInstance {
51
51
  unmount(): void;
52
52
  }
53
53
  /**
@@ -67,15 +67,45 @@ interface AppInstance {
67
67
  */
68
68
  type InitRuntimeFn = () => Promise<void>;
69
69
  /**
70
- * 微应用渲染函数类型
70
+ * 微应用挂载函数入参类型(Options Pattern)。
71
+ *
72
+ * 用于在微应用中声明 mountApp 的参数类型,避免重复定义:
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import type { MountAppOptions, MicroAppInstance } from '@seed-fe/mf-adapters';
77
+ *
78
+ * export function mountApp(options: MountAppOptions): MicroAppInstance {
79
+ * const { container, props } = options;
80
+ * // ...
81
+ * return { unmount() {} };
82
+ * }
83
+ * ```
84
+ */
85
+ interface MountAppOptions {
86
+ /** 微应用挂载容器 */
87
+ container: Element | Document;
88
+ /** 运行时参数 */
89
+ props?: MicroAppRuntimeProps;
90
+ }
91
+ /**
92
+ * 独立运行模式启动函数入参类型(Options Pattern)。
93
+ *
94
+ * 与 `MountAppOptions` 结构保持一致,但字段可选:
95
+ * - `container` 缺省时回退到 `document`
96
+ * - `props` 缺省时按需传递
97
+ */
98
+ type StartStandaloneOptions = Partial<MountAppOptions>;
99
+ /**
100
+ * 微应用挂载函数类型
71
101
  *
72
102
  * 不关心具体框架(React / Vue / 纯 DOM),仅约定返回包含 unmount() 的实例
73
103
  *
74
104
  * @example
75
105
  * ```ts
76
- * import type { RenderAppFn } from '@seed-fe/mf-adapters';
106
+ * import type { MountAppFn } from '@seed-fe/mf-adapters';
77
107
  *
78
- * export const renderApp: RenderAppFn = ({ container, props }) => {
108
+ * export const mountApp: MountAppFn = ({ container, props }) => {
79
109
  * const root = createRoot(container as HTMLElement);
80
110
  * root.render(<App {...props} />);
81
111
  *
@@ -87,14 +117,14 @@ type InitRuntimeFn = () => Promise<void>;
87
117
  * };
88
118
  * ```
89
119
  */
90
- type RenderAppFn = (options: {
91
- container: Element | Document;
92
- props?: RuntimeProps;
93
- }) => AppInstance;
120
+ type MountAppFn = (options: MountAppOptions) => MicroAppInstance;
94
121
  /**
95
122
  * 独立运行模式启动函数类型
96
123
  *
97
- * 用于非微前端宿主环境下的独立运行
124
+ * 用于非微前端宿主环境下的独立运行。参数与 `MountAppFn` 结构一致,但字段可选。
125
+ *
126
+ * - `container` 缺省时,适配层会回退到 `document`
127
+ * - `props` 缺省时,按需透传
98
128
  *
99
129
  * @example
100
130
  * ```ts
@@ -102,24 +132,24 @@ type RenderAppFn = (options: {
102
132
  *
103
133
  * export const startStandalone: StartStandaloneFn = async (options) => {
104
134
  * await initRuntime();
105
- * return renderApp({
135
+ * return mountApp({
106
136
  * container: options?.container ?? document,
107
137
  * props: options?.props,
108
138
  * });
109
139
  * };
140
+ *
141
+ * // 允许仅传 props(container 将自动回退到 document)
142
+ * void startStandalone({ props: { app: { basename: '/auth' } } });
110
143
  * ```
111
144
  */
112
- type StartStandaloneFn = (options?: {
113
- container?: Document;
114
- props?: RuntimeProps;
115
- }) => Promise<AppInstance>;
145
+ type StartStandaloneFn = (options?: StartStandaloneOptions) => Promise<MicroAppInstance>;
116
146
  /**
117
- * 宿主适配器选项契约
147
+ * 微应用运行时函数集合(由微应用侧实现)
118
148
  *
119
149
  * - 适用于所有微前端宿主(Garfish / qiankun / 未来扩展)
120
150
  * - 定义了微应用侧必须实现的两个核心函数
121
151
  */
122
- interface AdapterOptions {
152
+ interface MicroAppRuntime {
123
153
  /**
124
154
  * 微应用运行时初始化逻辑
125
155
  *
@@ -128,15 +158,15 @@ interface AdapterOptions {
128
158
  */
129
159
  initRuntime: InitRuntimeFn;
130
160
  /**
131
- * 微应用渲染函数
161
+ * 微应用挂载函数
132
162
  *
133
163
  * - 不关心具体框架(React / Vue / 纯 DOM)
134
164
  * - 仅约定返回包含 unmount() 的实例
135
165
  */
136
- renderApp: RenderAppFn;
166
+ mountApp: MountAppFn;
137
167
  }
138
168
 
139
- interface HostAdapterConfig {
169
+ interface MicroFrontendHostAdapter {
140
170
  name: string;
141
171
  /**
142
172
  * 返回 true 表示当前宿主命中
@@ -147,17 +177,17 @@ interface HostAdapterConfig {
147
177
  */
148
178
  activate?(): void | Promise<void>;
149
179
  }
150
- interface HostManagerOptions {
151
- hosts: HostAdapterConfig[];
180
+ interface InitMicroFrontendHostsOptions {
181
+ hosts: MicroFrontendHostAdapter[];
152
182
  /**
153
- * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandaloneApp
183
+ * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandalone
154
184
  */
155
- fallback: () => Promise<AppInstance> | Promise<unknown>;
185
+ fallback: () => Promise<MicroAppInstance> | Promise<unknown>;
156
186
  }
157
187
  /**
158
188
  * 根据宿主环境动态选择微前端框架,若未检测到宿主则回退为独立运行模式。
159
189
  */
160
- declare function initMicroFrontendHosts(options: HostManagerOptions): Promise<void>;
190
+ declare function initMicroFrontendHosts(options: InitMicroFrontendHostsOptions): Promise<void>;
161
191
 
162
192
  /**
163
193
  * qiankun 相关类型声明与全局接口扩展。
@@ -173,26 +203,11 @@ declare global {
173
203
  }
174
204
  }
175
205
  /** qiankun 生命周期 props */
176
- interface QiankunProps extends RuntimeProps {
206
+ interface QiankunProps extends MicroAppRuntimeProps {
177
207
  container?: Element;
178
208
  }
179
209
 
180
- interface StandaloneOptions {
181
- container?: Document;
182
- props?: RuntimeProps;
183
- }
184
- interface StandaloneStarterOptions {
185
- initRuntime: InitRuntimeFn;
186
- renderApp: RenderAppFn;
187
- }
188
- /**
189
- * 创建独立运行模式启动器:
190
- * - 统一处理非微前端宿主环境下的初始化逻辑
191
- * - 内部保证单例实例,避免重复挂载
192
- */
193
- declare function createStandaloneStarter(options: StandaloneStarterOptions): (customOptions?: StandaloneOptions) => Promise<AppInstance>;
194
-
195
- interface MicroAppRuntimeOptions {
210
+ interface MicroFrontendAdapterOptions {
196
211
  /**
197
212
  * 微应用运行时初始化逻辑,由应用侧实现。
198
213
  * 典型职责:权限、认证、i18n 等一次性初始化。
@@ -203,10 +218,10 @@ interface MicroAppRuntimeOptions {
203
218
  * - 适配层只关心 container / props 约定
204
219
  * - 内部可以是 React / Vue / 纯 DOM 等任意实现
205
220
  */
206
- mountApp: RenderAppFn;
221
+ mountApp: MountAppFn;
207
222
  /**
208
223
  * 独立运行模式入口,由应用侧实现。
209
- * - 一般通过 createStandaloneStarter(initRuntime, renderApp) 生成
224
+ * - 一般通过 createStandaloneStarter({ initRuntime, mountApp }) 生成
210
225
  * - 适配层只在未检测到任何宿主时调用
211
226
  */
212
227
  startStandalone: StartStandaloneFn;
@@ -220,10 +235,10 @@ interface MicroAppRuntimeOptions {
220
235
  * @example
221
236
  * ```ts
222
237
  * // 默认全部启用
223
- * createMicroAppRuntime({ initRuntime, mountApp, startStandalone });
238
+ * createMicroFrontendAdapter({ initRuntime, mountApp, startStandalone });
224
239
  *
225
240
  * // 仅启用 garfish
226
- * createMicroAppRuntime({
241
+ * createMicroFrontendAdapter({
227
242
  * initRuntime,
228
243
  * mountApp,
229
244
  * startStandalone,
@@ -231,7 +246,7 @@ interface MicroAppRuntimeOptions {
231
246
  * });
232
247
  *
233
248
  * // 禁用所有内置框架,仅使用 extraHosts
234
- * createMicroAppRuntime({
249
+ * createMicroFrontendAdapter({
235
250
  * initRuntime,
236
251
  * mountApp,
237
252
  * startStandalone,
@@ -248,13 +263,13 @@ interface MicroAppRuntimeOptions {
248
263
  * 额外宿主配置,用于接入其他微前端库
249
264
  * - 适合其他团队维护的宿主,仅需在微应用中传入配置即可
250
265
  */
251
- extraHosts?: HostAdapterConfig[];
266
+ extraHosts?: MicroFrontendHostAdapter[];
252
267
  }
253
- interface MicroAppRuntime {
268
+ interface MicroFrontendAdapter {
254
269
  /**
255
270
  * 独立运行模式入口(直接透传应用侧实现)
256
271
  */
257
- startStandaloneApp: (options?: StandaloneOptions) => Promise<AppInstance>;
272
+ startStandalone: StartStandaloneFn;
258
273
  /**
259
274
  * qiankun 生命周期适配结果
260
275
  * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};
@@ -266,17 +281,24 @@ interface MicroAppRuntime {
266
281
  };
267
282
  }
268
283
  /**
269
- * 创建微应用运行时适配:
284
+ * 创建微前端适配器:
270
285
  * - 接收应用侧的 initRuntime / mountApp / startStandalone
271
286
  * - 内部完成 Garfish / qiankun 等宿主的适配与检测
272
287
  * - 返回 qiankun 生命周期供微应用按需导出
273
288
  *
274
289
  * 微应用层只需要:
275
290
  * 1. 提供 initRuntime / mountApp / startStandalone
276
- * 2. 在入口处调用 createMicroAppRuntime(...)
277
- * 3. 若需要支持 qiankun,再将 runtime.qiankun 的三个生命周期导出
291
+ * 2. 在入口处调用 createMicroFrontendAdapter(...)
292
+ * 3. 若需要支持 qiankun,再将 adapter.qiankun 的三个生命周期导出
293
+ */
294
+ declare function createMicroFrontendAdapter(options: MicroFrontendAdapterOptions): MicroFrontendAdapter;
295
+
296
+ /**
297
+ * 创建独立运行模式启动器:
298
+ * - 统一处理非微前端宿主环境下的初始化逻辑
299
+ * - 内部保证单例实例,避免重复挂载
278
300
  */
279
- declare function createMicroAppRuntime(options: MicroAppRuntimeOptions): MicroAppRuntime;
301
+ declare function createStandaloneStarter(options: MicroAppRuntime): StartStandaloneFn;
280
302
 
281
303
  /**
282
304
  * Garfish 相关类型声明与全局接口扩展。
@@ -300,14 +322,14 @@ interface GarfishRenderParams {
300
322
  dom: Document;
301
323
  basename?: string;
302
324
  appRenderInfo: GarfishAppRenderInfo;
303
- props?: RuntimeProps;
325
+ props?: MicroAppRuntimeProps;
304
326
  }
305
327
  /** Garfish destroy 钩子参数 */
306
328
  interface GarfishDestroyParams {
307
329
  appName: string;
308
330
  dom: Document;
309
331
  appRenderInfo: GarfishAppRenderInfo;
310
- props?: RuntimeProps;
332
+ props?: MicroAppRuntimeProps;
311
333
  }
312
334
  /** Garfish 应用渲染信息 */
313
335
  interface GarfishAppRenderInfo {
@@ -317,7 +339,7 @@ interface GarfishAppRenderInfo {
317
339
  /** Garfish 导出对象接口 */
318
340
  interface GarfishExports {
319
341
  provider: () => {
320
- render: (params: GarfishRenderParams) => void;
342
+ render: (params: GarfishRenderParams) => void | Promise<void>;
321
343
  destroy: (params: GarfishDestroyParams) => void;
322
344
  };
323
345
  }
@@ -325,28 +347,26 @@ interface GarfishExports {
325
347
  /**
326
348
  * 创建 Garfish 适配器:
327
349
  * - 提供 provider() 给 Garfish 宿主使用
328
- * - 内部通过 Map<Document, AppInstance> 管理实例,支持多容器挂载
350
+ * - 内部通过 Map<Document, MicroAppInstance> 管理实例,支持多容器挂载
329
351
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
330
352
  */
331
- declare function createGarfishAdapter(options: AdapterOptions): {
353
+ declare function createGarfishAdapter(options: MicroAppRuntime): {
332
354
  provider: () => {
333
355
  render(params: GarfishRenderParams): Promise<void>;
334
356
  destroy(params: GarfishDestroyParams): void;
335
357
  };
336
358
  };
337
359
 
338
- /** @deprecated 使用 AdapterOptions 替代 */
339
- type QiankunAdapterOptions = AdapterOptions;
340
360
  /**
341
361
  * 创建 qiankun 适配器:
342
362
  * - 提供 bootstrap/mount/unmount 标准生命周期
343
- * - 内部通过 Map<container, AppInstance> 管理实例,支持多实例挂载
363
+ * - 内部通过 Map<container, MicroAppInstance> 管理实例,支持多实例挂载
344
364
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
345
365
  */
346
- declare function createQiankunAdapter(options: AdapterOptions): {
366
+ declare function createQiankunAdapter(options: MicroAppRuntime): {
347
367
  bootstrap: () => Promise<void>;
348
368
  mount: (props: QiankunProps) => void;
349
369
  unmount: (props?: QiankunProps) => void;
350
370
  };
351
371
 
352
- export { type AdapterOptions, type AppInstance, type GarfishAppRenderInfo, type GarfishDestroyParams, type GarfishExports, type GarfishRenderParams, type HostAdapterConfig, type HostManagerOptions, type InitRuntimeFn, type MicroAppConfig, type MicroAppRuntime, type MicroAppRuntimeOptions, type QiankunAdapterOptions, type QiankunProps, type RenderAppFn, type RuntimeProps, type StandaloneOptions, type StandaloneStarterOptions, type StartStandaloneFn, createGarfishAdapter, createMicroAppRuntime, createQiankunAdapter, createStandaloneStarter, initMicroFrontendHosts };
372
+ export { type GarfishAppRenderInfo, type GarfishDestroyParams, type GarfishExports, type GarfishRenderParams, type InitMicroFrontendHostsOptions, type InitRuntimeFn, type MicroAppConfig, type MicroAppInstance, type MicroAppRuntime, type MicroAppRuntimeProps, type MicroFrontendAdapter, type MicroFrontendAdapterOptions, type MicroFrontendHostAdapter, type MountAppFn, type MountAppOptions, type QiankunProps, type StartStandaloneFn, type StartStandaloneOptions, createGarfishAdapter, createMicroFrontendAdapter, createQiankunAdapter, createStandaloneStarter, initMicroFrontendHosts };
package/dist/index.d.ts CHANGED
@@ -27,7 +27,7 @@ interface MicroAppConfig {
27
27
  * - 不关心具体实现细节(权限 / 认证 / i18n 等)
28
28
  * - 支持宿主透传扩展字段
29
29
  */
30
- interface RuntimeProps {
30
+ interface MicroAppRuntimeProps {
31
31
  /**
32
32
  * 主应用传递的微应用配置信息
33
33
  *
@@ -47,7 +47,7 @@ interface RuntimeProps {
47
47
  *
48
48
  * 由微应用自行决定实例内部结构,这里只约定必须提供 unmount 方法。
49
49
  */
50
- interface AppInstance {
50
+ interface MicroAppInstance {
51
51
  unmount(): void;
52
52
  }
53
53
  /**
@@ -67,15 +67,45 @@ interface AppInstance {
67
67
  */
68
68
  type InitRuntimeFn = () => Promise<void>;
69
69
  /**
70
- * 微应用渲染函数类型
70
+ * 微应用挂载函数入参类型(Options Pattern)。
71
+ *
72
+ * 用于在微应用中声明 mountApp 的参数类型,避免重复定义:
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * import type { MountAppOptions, MicroAppInstance } from '@seed-fe/mf-adapters';
77
+ *
78
+ * export function mountApp(options: MountAppOptions): MicroAppInstance {
79
+ * const { container, props } = options;
80
+ * // ...
81
+ * return { unmount() {} };
82
+ * }
83
+ * ```
84
+ */
85
+ interface MountAppOptions {
86
+ /** 微应用挂载容器 */
87
+ container: Element | Document;
88
+ /** 运行时参数 */
89
+ props?: MicroAppRuntimeProps;
90
+ }
91
+ /**
92
+ * 独立运行模式启动函数入参类型(Options Pattern)。
93
+ *
94
+ * 与 `MountAppOptions` 结构保持一致,但字段可选:
95
+ * - `container` 缺省时回退到 `document`
96
+ * - `props` 缺省时按需传递
97
+ */
98
+ type StartStandaloneOptions = Partial<MountAppOptions>;
99
+ /**
100
+ * 微应用挂载函数类型
71
101
  *
72
102
  * 不关心具体框架(React / Vue / 纯 DOM),仅约定返回包含 unmount() 的实例
73
103
  *
74
104
  * @example
75
105
  * ```ts
76
- * import type { RenderAppFn } from '@seed-fe/mf-adapters';
106
+ * import type { MountAppFn } from '@seed-fe/mf-adapters';
77
107
  *
78
- * export const renderApp: RenderAppFn = ({ container, props }) => {
108
+ * export const mountApp: MountAppFn = ({ container, props }) => {
79
109
  * const root = createRoot(container as HTMLElement);
80
110
  * root.render(<App {...props} />);
81
111
  *
@@ -87,14 +117,14 @@ type InitRuntimeFn = () => Promise<void>;
87
117
  * };
88
118
  * ```
89
119
  */
90
- type RenderAppFn = (options: {
91
- container: Element | Document;
92
- props?: RuntimeProps;
93
- }) => AppInstance;
120
+ type MountAppFn = (options: MountAppOptions) => MicroAppInstance;
94
121
  /**
95
122
  * 独立运行模式启动函数类型
96
123
  *
97
- * 用于非微前端宿主环境下的独立运行
124
+ * 用于非微前端宿主环境下的独立运行。参数与 `MountAppFn` 结构一致,但字段可选。
125
+ *
126
+ * - `container` 缺省时,适配层会回退到 `document`
127
+ * - `props` 缺省时,按需透传
98
128
  *
99
129
  * @example
100
130
  * ```ts
@@ -102,24 +132,24 @@ type RenderAppFn = (options: {
102
132
  *
103
133
  * export const startStandalone: StartStandaloneFn = async (options) => {
104
134
  * await initRuntime();
105
- * return renderApp({
135
+ * return mountApp({
106
136
  * container: options?.container ?? document,
107
137
  * props: options?.props,
108
138
  * });
109
139
  * };
140
+ *
141
+ * // 允许仅传 props(container 将自动回退到 document)
142
+ * void startStandalone({ props: { app: { basename: '/auth' } } });
110
143
  * ```
111
144
  */
112
- type StartStandaloneFn = (options?: {
113
- container?: Document;
114
- props?: RuntimeProps;
115
- }) => Promise<AppInstance>;
145
+ type StartStandaloneFn = (options?: StartStandaloneOptions) => Promise<MicroAppInstance>;
116
146
  /**
117
- * 宿主适配器选项契约
147
+ * 微应用运行时函数集合(由微应用侧实现)
118
148
  *
119
149
  * - 适用于所有微前端宿主(Garfish / qiankun / 未来扩展)
120
150
  * - 定义了微应用侧必须实现的两个核心函数
121
151
  */
122
- interface AdapterOptions {
152
+ interface MicroAppRuntime {
123
153
  /**
124
154
  * 微应用运行时初始化逻辑
125
155
  *
@@ -128,15 +158,15 @@ interface AdapterOptions {
128
158
  */
129
159
  initRuntime: InitRuntimeFn;
130
160
  /**
131
- * 微应用渲染函数
161
+ * 微应用挂载函数
132
162
  *
133
163
  * - 不关心具体框架(React / Vue / 纯 DOM)
134
164
  * - 仅约定返回包含 unmount() 的实例
135
165
  */
136
- renderApp: RenderAppFn;
166
+ mountApp: MountAppFn;
137
167
  }
138
168
 
139
- interface HostAdapterConfig {
169
+ interface MicroFrontendHostAdapter {
140
170
  name: string;
141
171
  /**
142
172
  * 返回 true 表示当前宿主命中
@@ -147,17 +177,17 @@ interface HostAdapterConfig {
147
177
  */
148
178
  activate?(): void | Promise<void>;
149
179
  }
150
- interface HostManagerOptions {
151
- hosts: HostAdapterConfig[];
180
+ interface InitMicroFrontendHostsOptions {
181
+ hosts: MicroFrontendHostAdapter[];
152
182
  /**
153
- * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandaloneApp
183
+ * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandalone
154
184
  */
155
- fallback: () => Promise<AppInstance> | Promise<unknown>;
185
+ fallback: () => Promise<MicroAppInstance> | Promise<unknown>;
156
186
  }
157
187
  /**
158
188
  * 根据宿主环境动态选择微前端框架,若未检测到宿主则回退为独立运行模式。
159
189
  */
160
- declare function initMicroFrontendHosts(options: HostManagerOptions): Promise<void>;
190
+ declare function initMicroFrontendHosts(options: InitMicroFrontendHostsOptions): Promise<void>;
161
191
 
162
192
  /**
163
193
  * qiankun 相关类型声明与全局接口扩展。
@@ -173,26 +203,11 @@ declare global {
173
203
  }
174
204
  }
175
205
  /** qiankun 生命周期 props */
176
- interface QiankunProps extends RuntimeProps {
206
+ interface QiankunProps extends MicroAppRuntimeProps {
177
207
  container?: Element;
178
208
  }
179
209
 
180
- interface StandaloneOptions {
181
- container?: Document;
182
- props?: RuntimeProps;
183
- }
184
- interface StandaloneStarterOptions {
185
- initRuntime: InitRuntimeFn;
186
- renderApp: RenderAppFn;
187
- }
188
- /**
189
- * 创建独立运行模式启动器:
190
- * - 统一处理非微前端宿主环境下的初始化逻辑
191
- * - 内部保证单例实例,避免重复挂载
192
- */
193
- declare function createStandaloneStarter(options: StandaloneStarterOptions): (customOptions?: StandaloneOptions) => Promise<AppInstance>;
194
-
195
- interface MicroAppRuntimeOptions {
210
+ interface MicroFrontendAdapterOptions {
196
211
  /**
197
212
  * 微应用运行时初始化逻辑,由应用侧实现。
198
213
  * 典型职责:权限、认证、i18n 等一次性初始化。
@@ -203,10 +218,10 @@ interface MicroAppRuntimeOptions {
203
218
  * - 适配层只关心 container / props 约定
204
219
  * - 内部可以是 React / Vue / 纯 DOM 等任意实现
205
220
  */
206
- mountApp: RenderAppFn;
221
+ mountApp: MountAppFn;
207
222
  /**
208
223
  * 独立运行模式入口,由应用侧实现。
209
- * - 一般通过 createStandaloneStarter(initRuntime, renderApp) 生成
224
+ * - 一般通过 createStandaloneStarter({ initRuntime, mountApp }) 生成
210
225
  * - 适配层只在未检测到任何宿主时调用
211
226
  */
212
227
  startStandalone: StartStandaloneFn;
@@ -220,10 +235,10 @@ interface MicroAppRuntimeOptions {
220
235
  * @example
221
236
  * ```ts
222
237
  * // 默认全部启用
223
- * createMicroAppRuntime({ initRuntime, mountApp, startStandalone });
238
+ * createMicroFrontendAdapter({ initRuntime, mountApp, startStandalone });
224
239
  *
225
240
  * // 仅启用 garfish
226
- * createMicroAppRuntime({
241
+ * createMicroFrontendAdapter({
227
242
  * initRuntime,
228
243
  * mountApp,
229
244
  * startStandalone,
@@ -231,7 +246,7 @@ interface MicroAppRuntimeOptions {
231
246
  * });
232
247
  *
233
248
  * // 禁用所有内置框架,仅使用 extraHosts
234
- * createMicroAppRuntime({
249
+ * createMicroFrontendAdapter({
235
250
  * initRuntime,
236
251
  * mountApp,
237
252
  * startStandalone,
@@ -248,13 +263,13 @@ interface MicroAppRuntimeOptions {
248
263
  * 额外宿主配置,用于接入其他微前端库
249
264
  * - 适合其他团队维护的宿主,仅需在微应用中传入配置即可
250
265
  */
251
- extraHosts?: HostAdapterConfig[];
266
+ extraHosts?: MicroFrontendHostAdapter[];
252
267
  }
253
- interface MicroAppRuntime {
268
+ interface MicroFrontendAdapter {
254
269
  /**
255
270
  * 独立运行模式入口(直接透传应用侧实现)
256
271
  */
257
- startStandaloneApp: (options?: StandaloneOptions) => Promise<AppInstance>;
272
+ startStandalone: StartStandaloneFn;
258
273
  /**
259
274
  * qiankun 生命周期适配结果
260
275
  * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};
@@ -266,17 +281,24 @@ interface MicroAppRuntime {
266
281
  };
267
282
  }
268
283
  /**
269
- * 创建微应用运行时适配:
284
+ * 创建微前端适配器:
270
285
  * - 接收应用侧的 initRuntime / mountApp / startStandalone
271
286
  * - 内部完成 Garfish / qiankun 等宿主的适配与检测
272
287
  * - 返回 qiankun 生命周期供微应用按需导出
273
288
  *
274
289
  * 微应用层只需要:
275
290
  * 1. 提供 initRuntime / mountApp / startStandalone
276
- * 2. 在入口处调用 createMicroAppRuntime(...)
277
- * 3. 若需要支持 qiankun,再将 runtime.qiankun 的三个生命周期导出
291
+ * 2. 在入口处调用 createMicroFrontendAdapter(...)
292
+ * 3. 若需要支持 qiankun,再将 adapter.qiankun 的三个生命周期导出
293
+ */
294
+ declare function createMicroFrontendAdapter(options: MicroFrontendAdapterOptions): MicroFrontendAdapter;
295
+
296
+ /**
297
+ * 创建独立运行模式启动器:
298
+ * - 统一处理非微前端宿主环境下的初始化逻辑
299
+ * - 内部保证单例实例,避免重复挂载
278
300
  */
279
- declare function createMicroAppRuntime(options: MicroAppRuntimeOptions): MicroAppRuntime;
301
+ declare function createStandaloneStarter(options: MicroAppRuntime): StartStandaloneFn;
280
302
 
281
303
  /**
282
304
  * Garfish 相关类型声明与全局接口扩展。
@@ -300,14 +322,14 @@ interface GarfishRenderParams {
300
322
  dom: Document;
301
323
  basename?: string;
302
324
  appRenderInfo: GarfishAppRenderInfo;
303
- props?: RuntimeProps;
325
+ props?: MicroAppRuntimeProps;
304
326
  }
305
327
  /** Garfish destroy 钩子参数 */
306
328
  interface GarfishDestroyParams {
307
329
  appName: string;
308
330
  dom: Document;
309
331
  appRenderInfo: GarfishAppRenderInfo;
310
- props?: RuntimeProps;
332
+ props?: MicroAppRuntimeProps;
311
333
  }
312
334
  /** Garfish 应用渲染信息 */
313
335
  interface GarfishAppRenderInfo {
@@ -317,7 +339,7 @@ interface GarfishAppRenderInfo {
317
339
  /** Garfish 导出对象接口 */
318
340
  interface GarfishExports {
319
341
  provider: () => {
320
- render: (params: GarfishRenderParams) => void;
342
+ render: (params: GarfishRenderParams) => void | Promise<void>;
321
343
  destroy: (params: GarfishDestroyParams) => void;
322
344
  };
323
345
  }
@@ -325,28 +347,26 @@ interface GarfishExports {
325
347
  /**
326
348
  * 创建 Garfish 适配器:
327
349
  * - 提供 provider() 给 Garfish 宿主使用
328
- * - 内部通过 Map<Document, AppInstance> 管理实例,支持多容器挂载
350
+ * - 内部通过 Map<Document, MicroAppInstance> 管理实例,支持多容器挂载
329
351
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
330
352
  */
331
- declare function createGarfishAdapter(options: AdapterOptions): {
353
+ declare function createGarfishAdapter(options: MicroAppRuntime): {
332
354
  provider: () => {
333
355
  render(params: GarfishRenderParams): Promise<void>;
334
356
  destroy(params: GarfishDestroyParams): void;
335
357
  };
336
358
  };
337
359
 
338
- /** @deprecated 使用 AdapterOptions 替代 */
339
- type QiankunAdapterOptions = AdapterOptions;
340
360
  /**
341
361
  * 创建 qiankun 适配器:
342
362
  * - 提供 bootstrap/mount/unmount 标准生命周期
343
- * - 内部通过 Map<container, AppInstance> 管理实例,支持多实例挂载
363
+ * - 内部通过 Map<container, MicroAppInstance> 管理实例,支持多实例挂载
344
364
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
345
365
  */
346
- declare function createQiankunAdapter(options: AdapterOptions): {
366
+ declare function createQiankunAdapter(options: MicroAppRuntime): {
347
367
  bootstrap: () => Promise<void>;
348
368
  mount: (props: QiankunProps) => void;
349
369
  unmount: (props?: QiankunProps) => void;
350
370
  };
351
371
 
352
- export { type AdapterOptions, type AppInstance, type GarfishAppRenderInfo, type GarfishDestroyParams, type GarfishExports, type GarfishRenderParams, type HostAdapterConfig, type HostManagerOptions, type InitRuntimeFn, type MicroAppConfig, type MicroAppRuntime, type MicroAppRuntimeOptions, type QiankunAdapterOptions, type QiankunProps, type RenderAppFn, type RuntimeProps, type StandaloneOptions, type StandaloneStarterOptions, type StartStandaloneFn, createGarfishAdapter, createMicroAppRuntime, createQiankunAdapter, createStandaloneStarter, initMicroFrontendHosts };
372
+ export { type GarfishAppRenderInfo, type GarfishDestroyParams, type GarfishExports, type GarfishRenderParams, type InitMicroFrontendHostsOptions, type InitRuntimeFn, type MicroAppConfig, type MicroAppInstance, type MicroAppRuntime, type MicroAppRuntimeProps, type MicroFrontendAdapter, type MicroFrontendAdapterOptions, type MicroFrontendHostAdapter, type MountAppFn, type MountAppOptions, type QiankunProps, type StartStandaloneFn, type StartStandaloneOptions, createGarfishAdapter, createMicroFrontendAdapter, createQiankunAdapter, createStandaloneStarter, initMicroFrontendHosts };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import u from'@seed-fe/logger';var _=false;async function h(p){if(_)return;let{hosts:o,fallback:i}=p;for(let n of o)if(n.detect()){u.info(`[mf-runtime] detected micro-frontend host: ${n.name}`);try{await n.activate?.(),_=!0,u.info(`[mf-runtime] activated micro-frontend host: ${n.name}`);return}catch(s){u.error(`[mf-runtime] failed to activate ${n.name}, trying fallback`,s);}}_||(u.info("[mf-runtime] fallback to standalone mode"),await i());}function y(p){let{initRuntime:o,renderApp:i}=p,n=new Map;function s(){return {render(t){return o().then(()=>{let r=i({container:t.dom,props:{...t.props,app:t.props?.app}});n.set(t.dom,r),u.info(`[mf-runtime][garfish] rendered successfully: ${t.appName}`);}).catch(r=>{throw u.error(`[mf-runtime][garfish] render failed: ${t.appName}`,r),n.delete(t.dom),r})},destroy(t){try{let r=n.get(t.dom);r&&r.unmount(),n.delete(t.dom),u.info("[mf-runtime][garfish] destroy completed");}catch(r){u.error("[mf-runtime][garfish] destroy failed",r);}}}}return {provider:s}}function g(p){let{initRuntime:o,renderApp:i}=p,n=new Map;async function s(){try{await o(),u.info("[mf-runtime][qiankun] bootstrap completed");}catch(a){throw u.error("[mf-runtime][qiankun] bootstrap failed",a),a}}function t(a){try{let e=a.container??document,d=i({container:e,props:{...a,app:a.app}});n.set(e,d),u.info("[mf-runtime][qiankun] mount completed");}catch(e){throw u.error("[mf-runtime][qiankun] mount failed",e),e}}function r(a){try{let e=a?.container??document;n.get(e)?.unmount(),n.delete(e),u.info("[mf-runtime][qiankun] unmount completed");}catch(e){throw u.error("[mf-runtime][qiankun] unmount failed",e),e}}return {bootstrap:s,mount:t,unmount:r}}function D(p){let{initRuntime:o,mountApp:i,startStandalone:n,hosts:s,extraHosts:t}=p,r=s?.garfish??true,a=s?.qiankun??true,e=[];if(r){let{provider:l}=y({initRuntime:o,renderApp:m=>i({container:m.container,props:m.props})});if(typeof window<"u"&&window.__GARFISH__){let m=globalThis;m.__GARFISH_EXPORTS__||(m.__GARFISH_EXPORTS__={}),m.__GARFISH_EXPORTS__.provider=l;}e.push({name:"garfish",detect:()=>!!window.__GARFISH__,activate:()=>{typeof __GARFISH_EXPORTS__<"u"&&(__GARFISH_EXPORTS__.provider=l);}});}let d;if(a){let{bootstrap:l,mount:m,unmount:P}=g({initRuntime:o,renderApp:i});d={bootstrap:l,mount:m,unmount:P},e.push({name:"qiankun",detect:()=>!!window.__POWERED_BY_QIANKUN__,activate:()=>{u.info("[mf-adapter] qiankun");}});}return t?.length&&e.push(...t),h({hosts:e,fallback:()=>n()}),{startStandaloneApp:n,qiankun:d}}function N(p){let{initRuntime:o,renderApp:i}=p,n=null;return async function(t){return n||(await o(),n=i({container:t?.container??document,props:t?.props}),n)}}export{y as createGarfishAdapter,D as createMicroAppRuntime,g as createQiankunAdapter,N as createStandaloneStarter,h as initMicroFrontendHosts};//# sourceMappingURL=index.js.map
1
+ import d from'@seed-fe/logger';var R="@seed-fe/mf-adapters";function o(i){return i?`[${R}][${i}]`:`[${R}]`}var _=false;async function y(i){if(_)return;let{hosts:a,fallback:p}=i;for(let t of a)if(t.detect()){d.info(`${o("host-manager")} detected host: ${t.name}`);try{await t.activate?.(),_=!0,d.info(`${o("host-manager")} activated host: ${t.name}`);return}catch(s){d.error(`${o("host-manager")} failed to activate ${t.name}, trying fallback`,s);}}_||(d.info(`${o("host-manager")} fallback to standalone mode`),await p(),_=true);}function g(i){let{initRuntime:a,mountApp:p}=i,t=new Map;function s(){return {render(n){return a().then(()=>{let e=p({container:n.dom,props:n.props});t.set(n.dom,e),d.info(`${o("garfish")} rendered successfully: ${n.appName}`);}).catch(e=>{throw d.error(`${o("garfish")} render failed: ${n.appName}`,e),t.delete(n.dom),e})},destroy(n){try{let e=t.get(n.dom);e&&e.unmount(),t.delete(n.dom),d.info(`${o("garfish")} destroy completed`);}catch(e){d.error(`${o("garfish")} destroy failed`,e);}}}}return {provider:s}}function x(i){let{initRuntime:a,mountApp:p}=i,t=new Map;async function s(){try{await a(),d.info(`${o("qiankun")} bootstrap completed`);}catch(c){throw d.error(`${o("qiankun")} bootstrap failed`,c),c}}function n(c){try{let r=c.container??document,l=p({container:r,props:c});t.set(r,l),d.info(`${o("qiankun")} mount completed`);}catch(r){throw d.error(`${o("qiankun")} mount failed`,r),r}}function e(c){try{let r=c?.container??document;t.get(r)?.unmount(),t.delete(r),d.info(`${o("qiankun")} unmount completed`);}catch(r){throw d.error(`${o("qiankun")} unmount failed`,r),r}}return {bootstrap:s,mount:n,unmount:e}}function X(i){let{initRuntime:a,mountApp:p,startStandalone:t,hosts:s,extraHosts:n}=i,e=s?.garfish??true,c=s?.qiankun??true,r=[];if(e){let{provider:A}=g({initRuntime:a,mountApp:u=>p({container:u.container,props:u.props})});if(window.__GARFISH__){let u=globalThis;u.__GARFISH_EXPORTS__||(u.__GARFISH_EXPORTS__={}),u.__GARFISH_EXPORTS__.provider=A;}r.push({name:"garfish",detect:()=>!!window.__GARFISH__,activate:()=>{typeof __GARFISH_EXPORTS__<"u"&&(__GARFISH_EXPORTS__.provider=A);}});}let l;if(c){let{bootstrap:A,mount:u,unmount:P}=x({initRuntime:a,mountApp:p});l={bootstrap:A,mount:u,unmount:P},r.push({name:"qiankun",detect:()=>!!window.__POWERED_BY_QIANKUN__});}return n?.length&&r.push(...n),y({hosts:r,fallback:()=>t()}),{startStandalone:t,qiankun:l}}function W(i){let{initRuntime:a,mountApp:p}=i,t=null;return async function(n){return t||(await a(),t=p({container:n?.container??document,props:n?.props}),t)}}export{g as createGarfishAdapter,X as createMicroFrontendAdapter,x as createQiankunAdapter,W as createStandaloneStarter,y as initMicroFrontendHosts};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/hostManager.ts","../src/hosts/garfish.ts","../src/hosts/qiankun.ts","../src/core/setup.ts","../src/core/standalone.ts"],"names":["microFrontendResolved","initMicroFrontendHosts","options","hosts","fallback","host","logger","error","createGarfishAdapter","initRuntime","renderApp","instances","provider","params","instance","createQiankunAdapter","bootstrap","mount","props","container","unmount","createMicroAppRuntime","mountApp","startStandalone","extraHosts","garfishEnabled","qiankunEnabled","hostAdapters","garfishOptions","globalWithExports","qiankunRuntime","createStandaloneStarter","standaloneInstance","customOptions"],"mappings":"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","file":"index.js","sourcesContent":["import logger from '@seed-fe/logger';\nimport type { AppInstance } from '../types/base';\n\nexport interface HostAdapterConfig {\n name: string;\n /**\n * 返回 true 表示当前宿主命中\n */\n detect(): boolean;\n /**\n * 命中宿主后调用,用于注册生命周期或执行初始化逻辑\n */\n activate?(): void | Promise<void>;\n}\n\nexport interface HostManagerOptions {\n hosts: HostAdapterConfig[];\n /**\n * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandaloneApp\n */\n fallback: () => Promise<AppInstance> | Promise<unknown>;\n}\n\nlet microFrontendResolved = false;\n\n/**\n * 根据宿主环境动态选择微前端框架,若未检测到宿主则回退为独立运行模式。\n */\nexport async function initMicroFrontendHosts(options: HostManagerOptions): Promise<void> {\n if (microFrontendResolved) {\n return;\n }\n\n const { hosts, fallback } = options;\n\n for (const host of hosts) {\n if (host.detect()) {\n logger.info(`[mf-runtime] detected micro-frontend host: ${host.name}`);\n\n try {\n await host.activate?.();\n microFrontendResolved = true;\n logger.info(`[mf-runtime] activated micro-frontend host: ${host.name}`);\n return;\n } catch (error) {\n logger.error(`[mf-runtime] failed to activate ${host.name}, trying fallback`, error);\n // 继续尝试下一个宿主或回退到独立模式\n }\n }\n }\n\n // 如果所有宿主激活失败或未检测到任何宿主,调用 fallback\n if (!microFrontendResolved) {\n logger.info('[mf-runtime] fallback to standalone mode');\n await fallback();\n }\n}\n","import logger from '@seed-fe/logger';\nimport type { AdapterOptions, AppInstance } from '../types/base';\nimport type { GarfishDestroyParams, GarfishRenderParams } from '../types/garfish';\n\n/**\n * 创建 Garfish 适配器:\n * - 提供 provider() 给 Garfish 宿主使用\n * - 内部通过 Map<Document, AppInstance> 管理实例,支持多容器挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createGarfishAdapter(options: AdapterOptions) {\n const { initRuntime, renderApp } = options;\n\n const instances = new Map<Document, AppInstance>();\n\n function provider() {\n return {\n render(params: GarfishRenderParams) {\n return initRuntime()\n .then(() => {\n const instance = renderApp({\n container: params.dom,\n props: {\n ...params.props,\n app: params.props?.app,\n },\n });\n instances.set(params.dom, instance);\n logger.info(`[mf-runtime][garfish] rendered successfully: ${params.appName}`);\n })\n .catch((error: Error) => {\n logger.error(`[mf-runtime][garfish] render failed: ${params.appName}`, error);\n // 清理可能的部分状态\n instances.delete(params.dom);\n // 重新抛出,让 Garfish 处理\n throw error;\n });\n },\n destroy(params: GarfishDestroyParams) {\n try {\n const instance = instances.get(params.dom);\n if (instance) {\n instance.unmount();\n }\n instances.delete(params.dom);\n logger.info('[mf-runtime][garfish] destroy completed');\n } catch (error) {\n // 仅记录错误,允许 Garfish 继续清理其他资源\n logger.error('[mf-runtime][garfish] destroy failed', error);\n }\n },\n };\n }\n\n return { provider };\n}\n","import logger from '@seed-fe/logger';\nimport type { AdapterOptions, AppInstance } from '../types/base';\nimport type { QiankunProps } from '../types/qiankun';\n\n/** @deprecated 使用 AdapterOptions 替代 */\nexport type QiankunAdapterOptions = AdapterOptions;\n\n/**\n * 创建 qiankun 适配器:\n * - 提供 bootstrap/mount/unmount 标准生命周期\n * - 内部通过 Map<container, AppInstance> 管理实例,支持多实例挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createQiankunAdapter(options: AdapterOptions) {\n const { initRuntime, renderApp } = options;\n\n const instances = new Map<Element | Document, AppInstance>();\n\n async function bootstrap() {\n try {\n await initRuntime();\n logger.info('[mf-runtime][qiankun] bootstrap completed');\n } catch (error) {\n logger.error('[mf-runtime][qiankun] bootstrap failed', error);\n throw error;\n }\n }\n\n function mount(props: QiankunProps) {\n try {\n const container = props.container ?? document;\n const instance = renderApp({\n container,\n props: {\n ...props,\n app: props.app,\n },\n });\n instances.set(container, instance);\n logger.info('[mf-runtime][qiankun] mount completed');\n } catch (error) {\n logger.error('[mf-runtime][qiankun] mount failed', error);\n throw error;\n }\n }\n\n function unmount(props?: QiankunProps) {\n try {\n const container = props?.container ?? document;\n const instance = instances.get(container);\n instance?.unmount();\n instances.delete(container);\n logger.info('[mf-runtime][qiankun] unmount completed');\n } catch (error) {\n logger.error('[mf-runtime][qiankun] unmount failed', error);\n throw error;\n }\n }\n\n return { bootstrap, mount, unmount };\n}\n","import logger from '@seed-fe/logger';\nimport { createGarfishAdapter } from '../hosts/garfish';\nimport { createQiankunAdapter } from '../hosts/qiankun';\nimport type { AppInstance, InitRuntimeFn, RenderAppFn, StartStandaloneFn } from '../types/base';\nimport type { GarfishExports } from '../types/garfish';\nimport type { QiankunProps } from '../types/qiankun';\nimport type { HostAdapterConfig } from './hostManager';\nimport { initMicroFrontendHosts } from './hostManager';\nimport type { StandaloneOptions } from './standalone';\n\nexport interface MicroAppRuntimeOptions {\n /**\n * 微应用运行时初始化逻辑,由应用侧实现。\n * 典型职责:权限、认证、i18n 等一次性初始化。\n */\n initRuntime: InitRuntimeFn;\n /**\n * 微应用渲染逻辑,由应用侧实现。\n * - 适配层只关心 container / props 约定\n * - 内部可以是 React / Vue / 纯 DOM 等任意实现\n */\n mountApp: RenderAppFn;\n /**\n * 独立运行模式入口,由应用侧实现。\n * - 一般通过 createStandaloneStarter(initRuntime, renderApp) 生成\n * - 适配层只在未检测到任何宿主时调用\n */\n startStandalone: StartStandaloneFn;\n /**\n * 内置宿主框架配置\n *\n * - 默认全部启用(garfish: true, qiankun: true)\n * - 设置为 false 可禁用特定框架\n * - 设置为 {} 等同于全部启用\n *\n * @example\n * ```ts\n * // 默认全部启用\n * createMicroAppRuntime({ initRuntime, mountApp, startStandalone });\n *\n * // 仅启用 garfish\n * createMicroAppRuntime({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: true, qiankun: false },\n * });\n *\n * // 禁用所有内置框架,仅使用 extraHosts\n * createMicroAppRuntime({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: false, qiankun: false },\n * extraHosts: [customHost],\n * });\n * ```\n */\n hosts?: {\n garfish?: boolean;\n qiankun?: boolean;\n };\n /**\n * 额外宿主配置,用于接入其他微前端库\n * - 适合其他团队维护的宿主,仅需在微应用中传入配置即可\n */\n extraHosts?: HostAdapterConfig[];\n}\n\nexport interface MicroAppRuntime {\n /**\n * 独立运行模式入口(直接透传应用侧实现)\n */\n startStandaloneApp: (options?: StandaloneOptions) => Promise<AppInstance>;\n /**\n * qiankun 生命周期适配结果\n * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};\n */\n qiankun?: {\n bootstrap: () => Promise<void>;\n mount: (props: QiankunProps) => void;\n unmount: (props?: QiankunProps) => void;\n };\n}\n\n/**\n * 创建微应用运行时适配:\n * - 接收应用侧的 initRuntime / mountApp / startStandalone\n * - 内部完成 Garfish / qiankun 等宿主的适配与检测\n * - 返回 qiankun 生命周期供微应用按需导出\n *\n * 微应用层只需要:\n * 1. 提供 initRuntime / mountApp / startStandalone\n * 2. 在入口处调用 createMicroAppRuntime(...)\n * 3. 若需要支持 qiankun,再将 runtime.qiankun 的三个生命周期导出\n */\nexport function createMicroAppRuntime(options: MicroAppRuntimeOptions): MicroAppRuntime {\n const { initRuntime, mountApp, startStandalone, hosts, extraHosts } = options;\n\n // 默认全部启用\n const garfishEnabled = hosts?.garfish ?? true;\n const qiankunEnabled = hosts?.qiankun ?? true;\n\n const hostAdapters: HostAdapterConfig[] = [];\n\n // Garfish:通过 __GARFISH__ / __GARFISH_EXPORTS__ 适配 provider\n if (garfishEnabled) {\n const { provider } = createGarfishAdapter({\n initRuntime,\n renderApp: (garfishOptions) =>\n mountApp({\n container: garfishOptions.container,\n props: garfishOptions.props,\n }),\n });\n\n // 宿主模式下:若检测到 Garfish 标识,则立即挂载 provider。\n // 兼容两种注入方式:\n // - 宿主预先创建 __GARFISH_EXPORTS__\n // - 子应用自行创建 __GARFISH_EXPORTS__\n if (typeof window !== 'undefined' && (window as Window & { __GARFISH__?: boolean }).__GARFISH__) {\n const globalWithExports = globalThis as typeof globalThis & { __GARFISH_EXPORTS__?: GarfishExports };\n if (!globalWithExports.__GARFISH_EXPORTS__) {\n globalWithExports.__GARFISH_EXPORTS__ = {} as GarfishExports;\n }\n globalWithExports.__GARFISH_EXPORTS__.provider = provider;\n }\n\n hostAdapters.push({\n name: 'garfish',\n detect: () => Boolean(window.__GARFISH__),\n activate: () => {\n if (typeof __GARFISH_EXPORTS__ !== 'undefined') {\n __GARFISH_EXPORTS__.provider = provider;\n }\n },\n });\n }\n\n // qiankun:返回标准生命周期,由微应用按需导出\n let qiankunRuntime: MicroAppRuntime['qiankun'];\n\n if (qiankunEnabled) {\n const { bootstrap, mount, unmount } = createQiankunAdapter({\n initRuntime,\n renderApp: mountApp,\n });\n\n qiankunRuntime = {\n bootstrap,\n mount,\n unmount,\n };\n\n // 将 qiankun 添加到 hosts 数组用于检测\n // 虽然 qiankun 不需要 activate(宿主会主动调用生命周期),\n // 但仍需要 detect 以防止错误地进入独立运行模式\n hostAdapters.push({\n name: 'qiankun',\n detect: () => Boolean(window.__POWERED_BY_QIANKUN__),\n activate: () => {\n logger.info(`[mf-adapter] qiankun`);\n // qiankun 宿主会主动调用生命周期,无需额外激活\n },\n });\n }\n\n if (extraHosts?.length) {\n hostAdapters.push(...extraHosts);\n }\n\n // 初始化宿主检测 + 独立运行回退\n void initMicroFrontendHosts({\n hosts: hostAdapters,\n fallback: () => startStandalone(),\n });\n\n return {\n startStandaloneApp: startStandalone,\n qiankun: qiankunRuntime,\n };\n}\n","import type { AppInstance, InitRuntimeFn, RenderAppFn, RuntimeProps } from '../types/base';\n\nexport interface StandaloneOptions {\n container?: Document;\n props?: RuntimeProps;\n}\n\nexport interface StandaloneStarterOptions {\n initRuntime: InitRuntimeFn;\n renderApp: RenderAppFn;\n}\n\n/**\n * 创建独立运行模式启动器:\n * - 统一处理非微前端宿主环境下的初始化逻辑\n * - 内部保证单例实例,避免重复挂载\n */\nexport function createStandaloneStarter(options: StandaloneStarterOptions) {\n const { initRuntime, renderApp } = options;\n\n let standaloneInstance: AppInstance | null = null;\n\n return async function startStandaloneApp(customOptions?: StandaloneOptions): Promise<AppInstance> {\n if (standaloneInstance) {\n return standaloneInstance;\n }\n\n await initRuntime();\n\n standaloneInstance = renderApp({\n container: customOptions?.container ?? document,\n props: customOptions?.props,\n });\n\n return standaloneInstance;\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/core/log.ts","../src/core/hostManager.ts","../src/hosts/garfish.ts","../src/hosts/qiankun.ts","../src/core/setup.ts","../src/core/standalone.ts"],"names":["LOG_NAMESPACE","formatLogPrefix","scope","hasActivatedHost","initMicroFrontendHosts","options","hosts","fallback","host","logger","error","createGarfishAdapter","initRuntime","mountApp","instancesByDocument","provider","params","instance","createQiankunAdapter","instancesByContainer","bootstrap","mount","props","container","unmount","createMicroFrontendAdapter","startStandalone","extraHosts","garfishEnabled","qiankunEnabled","hostAdapters","garfishOptions","globalWithExports","qiankunLifecycles","createStandaloneStarter","standaloneInstance","customOptions"],"mappings":"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","file":"index.js","sourcesContent":["export const LOG_NAMESPACE = '@seed-fe/mf-adapters';\n\nexport function formatLogPrefix(scope?: string): string {\n return scope ? `[${LOG_NAMESPACE}][${scope}]` : `[${LOG_NAMESPACE}]`;\n}\n\n","import logger from '@seed-fe/logger';\nimport type { MicroAppInstance } from '../types/base';\nimport { formatLogPrefix } from './log';\n\nexport interface MicroFrontendHostAdapter {\n name: string;\n /**\n * 返回 true 表示当前宿主命中\n */\n detect(): boolean;\n /**\n * 命中宿主后调用,用于注册生命周期或执行初始化逻辑\n */\n activate?(): void | Promise<void>;\n}\n\nexport interface InitMicroFrontendHostsOptions {\n hosts: MicroFrontendHostAdapter[];\n /**\n * 当未检测到任何宿主标识时的回退逻辑,一般为 startStandalone\n */\n fallback: () => Promise<MicroAppInstance> | Promise<unknown>;\n}\n\nlet hasActivatedHost = false;\n\n/**\n * 根据宿主环境动态选择微前端框架,若未检测到宿主则回退为独立运行模式。\n */\nexport async function initMicroFrontendHosts(options: InitMicroFrontendHostsOptions): Promise<void> {\n if (hasActivatedHost) {\n return;\n }\n\n const { hosts, fallback } = options;\n\n for (const host of hosts) {\n if (host.detect()) {\n logger.info(`${formatLogPrefix('host-manager')} detected host: ${host.name}`);\n\n try {\n await host.activate?.();\n hasActivatedHost = true;\n logger.info(`${formatLogPrefix('host-manager')} activated host: ${host.name}`);\n return;\n } catch (error) {\n logger.error(`${formatLogPrefix('host-manager')} failed to activate ${host.name}, trying fallback`, error);\n // 继续尝试下一个宿主或回退到独立模式\n }\n }\n }\n\n // 如果所有宿主激活失败或未检测到任何宿主,调用 fallback\n if (!hasActivatedHost) {\n logger.info(`${formatLogPrefix('host-manager')} fallback to standalone mode`);\n await fallback();\n hasActivatedHost = true;\n }\n}\n","import logger from '@seed-fe/logger';\nimport type { MicroAppRuntime, MicroAppInstance } from '../types/base';\nimport type { GarfishDestroyParams, GarfishRenderParams } from '../types/garfish';\nimport { formatLogPrefix } from '../core/log';\n\n/**\n * 创建 Garfish 适配器:\n * - 提供 provider() 给 Garfish 宿主使用\n * - 内部通过 Map<Document, MicroAppInstance> 管理实例,支持多容器挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createGarfishAdapter(options: MicroAppRuntime) {\n const { initRuntime, mountApp } = options;\n\n const instancesByDocument = new Map<Document, MicroAppInstance>();\n\n function provider() {\n return {\n render(params: GarfishRenderParams) {\n return initRuntime()\n .then(() => {\n const instance = mountApp({\n container: params.dom,\n props: params.props,\n });\n instancesByDocument.set(params.dom, instance);\n logger.info(`${formatLogPrefix('garfish')} rendered successfully: ${params.appName}`);\n })\n .catch((error: Error) => {\n logger.error(`${formatLogPrefix('garfish')} render failed: ${params.appName}`, error);\n // 清理可能的部分状态\n instancesByDocument.delete(params.dom);\n // 重新抛出,让 Garfish 处理\n throw error;\n });\n },\n destroy(params: GarfishDestroyParams) {\n try {\n const instance = instancesByDocument.get(params.dom);\n if (instance) {\n instance.unmount();\n }\n instancesByDocument.delete(params.dom);\n logger.info(`${formatLogPrefix('garfish')} destroy completed`);\n } catch (error) {\n // 仅记录错误,允许 Garfish 继续清理其他资源\n logger.error(`${formatLogPrefix('garfish')} destroy failed`, error);\n }\n },\n };\n }\n\n return { provider };\n}\n","import logger from '@seed-fe/logger';\nimport type { MicroAppRuntime, MicroAppInstance } from '../types/base';\nimport type { QiankunProps } from '../types/qiankun';\nimport { formatLogPrefix } from '../core/log';\n\n/**\n * 创建 qiankun 适配器:\n * - 提供 bootstrap/mount/unmount 标准生命周期\n * - 内部通过 Map<container, MicroAppInstance> 管理实例,支持多实例挂载\n * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)\n */\nexport function createQiankunAdapter(options: MicroAppRuntime) {\n const { initRuntime, mountApp } = options;\n\n const instancesByContainer = new Map<Element | Document, MicroAppInstance>();\n\n async function bootstrap() {\n try {\n await initRuntime();\n logger.info(`${formatLogPrefix('qiankun')} bootstrap completed`);\n } catch (error) {\n logger.error(`${formatLogPrefix('qiankun')} bootstrap failed`, error);\n throw error;\n }\n }\n\n function mount(props: QiankunProps) {\n try {\n const container = props.container ?? document;\n const instance = mountApp({\n container,\n props,\n });\n instancesByContainer.set(container, instance);\n logger.info(`${formatLogPrefix('qiankun')} mount completed`);\n } catch (error) {\n logger.error(`${formatLogPrefix('qiankun')} mount failed`, error);\n throw error;\n }\n }\n\n function unmount(props?: QiankunProps) {\n try {\n const container = props?.container ?? document;\n const instance = instancesByContainer.get(container);\n instance?.unmount();\n instancesByContainer.delete(container);\n logger.info(`${formatLogPrefix('qiankun')} unmount completed`);\n } catch (error) {\n logger.error(`${formatLogPrefix('qiankun')} unmount failed`, error);\n throw error;\n }\n }\n\n return { bootstrap, mount, unmount };\n}\n","import { createGarfishAdapter } from '../hosts/garfish';\nimport { createQiankunAdapter } from '../hosts/qiankun';\nimport type { InitRuntimeFn, MicroAppInstance, MountAppFn, StartStandaloneFn } from '../types/base';\nimport type { GarfishExports } from '../types/garfish';\nimport type { QiankunProps } from '../types/qiankun';\nimport type { MicroFrontendHostAdapter } from './hostManager';\nimport { initMicroFrontendHosts } from './hostManager';\n\nexport interface MicroFrontendAdapterOptions {\n /**\n * 微应用运行时初始化逻辑,由应用侧实现。\n * 典型职责:权限、认证、i18n 等一次性初始化。\n */\n initRuntime: InitRuntimeFn;\n /**\n * 微应用渲染逻辑,由应用侧实现。\n * - 适配层只关心 container / props 约定\n * - 内部可以是 React / Vue / 纯 DOM 等任意实现\n */\n mountApp: MountAppFn;\n /**\n * 独立运行模式入口,由应用侧实现。\n * - 一般通过 createStandaloneStarter({ initRuntime, mountApp }) 生成\n * - 适配层只在未检测到任何宿主时调用\n */\n startStandalone: StartStandaloneFn;\n /**\n * 内置宿主框架配置\n *\n * - 默认全部启用(garfish: true, qiankun: true)\n * - 设置为 false 可禁用特定框架\n * - 设置为 {} 等同于全部启用\n *\n * @example\n * ```ts\n * // 默认全部启用\n * createMicroFrontendAdapter({ initRuntime, mountApp, startStandalone });\n *\n * // 仅启用 garfish\n * createMicroFrontendAdapter({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: true, qiankun: false },\n * });\n *\n * // 禁用所有内置框架,仅使用 extraHosts\n * createMicroFrontendAdapter({\n * initRuntime,\n * mountApp,\n * startStandalone,\n * hosts: { garfish: false, qiankun: false },\n * extraHosts: [customHost],\n * });\n * ```\n */\n hosts?: {\n garfish?: boolean;\n qiankun?: boolean;\n };\n /**\n * 额外宿主配置,用于接入其他微前端库\n * - 适合其他团队维护的宿主,仅需在微应用中传入配置即可\n */\n extraHosts?: MicroFrontendHostAdapter[];\n}\n\nexport interface MicroFrontendAdapter {\n /**\n * 独立运行模式入口(直接透传应用侧实现)\n */\n startStandalone: StartStandaloneFn;\n /**\n * qiankun 生命周期适配结果\n * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};\n */\n qiankun?: {\n bootstrap: () => Promise<void>;\n mount: (props: QiankunProps) => void;\n unmount: (props?: QiankunProps) => void;\n };\n}\n\n/**\n * 创建微前端适配器:\n * - 接收应用侧的 initRuntime / mountApp / startStandalone\n * - 内部完成 Garfish / qiankun 等宿主的适配与检测\n * - 返回 qiankun 生命周期供微应用按需导出\n *\n * 微应用层只需要:\n * 1. 提供 initRuntime / mountApp / startStandalone\n * 2. 在入口处调用 createMicroFrontendAdapter(...)\n * 3. 若需要支持 qiankun,再将 adapter.qiankun 的三个生命周期导出\n */\nexport function createMicroFrontendAdapter(options: MicroFrontendAdapterOptions): MicroFrontendAdapter {\n const { initRuntime, mountApp, startStandalone, hosts, extraHosts } = options;\n\n // 默认全部启用\n const garfishEnabled = hosts?.garfish ?? true;\n const qiankunEnabled = hosts?.qiankun ?? true;\n\n const hostAdapters: MicroFrontendHostAdapter[] = [];\n\n // Garfish:通过 __GARFISH__ / __GARFISH_EXPORTS__ 适配 provider\n if (garfishEnabled) {\n const { provider } = createGarfishAdapter({\n initRuntime,\n mountApp: (garfishOptions) =>\n mountApp({\n container: garfishOptions.container,\n props: garfishOptions.props,\n }),\n });\n\n // 宿主模式下:若检测到 Garfish 标识,则立即挂载 provider。\n // 兼容两种注入方式:\n // - 宿主预先创建 __GARFISH_EXPORTS__\n // - 子应用自行创建 __GARFISH_EXPORTS__\n if (window.__GARFISH__) {\n const globalWithExports = globalThis as typeof globalThis & { __GARFISH_EXPORTS__?: GarfishExports };\n if (!globalWithExports.__GARFISH_EXPORTS__) {\n globalWithExports.__GARFISH_EXPORTS__ = {} as GarfishExports;\n }\n globalWithExports.__GARFISH_EXPORTS__.provider = provider;\n }\n\n hostAdapters.push({\n name: 'garfish',\n detect: () => Boolean(window.__GARFISH__),\n activate: () => {\n if (typeof __GARFISH_EXPORTS__ !== 'undefined') {\n __GARFISH_EXPORTS__.provider = provider;\n }\n },\n });\n }\n\n // qiankun:返回标准生命周期,由微应用按需导出\n let qiankunLifecycles: MicroFrontendAdapter['qiankun'];\n\n if (qiankunEnabled) {\n const { bootstrap, mount, unmount } = createQiankunAdapter({\n initRuntime,\n mountApp,\n });\n\n qiankunLifecycles = {\n bootstrap,\n mount,\n unmount,\n };\n\n // 将 qiankun 添加到 hosts 数组用于检测\n // 虽然 qiankun 不需要 activate(宿主会主动调用生命周期),\n // 但仍需要 detect 以防止错误地进入独立运行模式\n hostAdapters.push({\n name: 'qiankun',\n detect: () => Boolean(window.__POWERED_BY_QIANKUN__),\n });\n }\n\n if (extraHosts?.length) {\n hostAdapters.push(...extraHosts);\n }\n\n // 初始化宿主检测 + 独立运行回退\n void initMicroFrontendHosts({\n hosts: hostAdapters,\n fallback: () => startStandalone(),\n });\n\n return {\n startStandalone,\n qiankun: qiankunLifecycles,\n };\n}\n","import type { MicroAppRuntime, MicroAppInstance, StartStandaloneFn, StartStandaloneOptions } from '../types/base';\n\n/**\n * 创建独立运行模式启动器:\n * - 统一处理非微前端宿主环境下的初始化逻辑\n * - 内部保证单例实例,避免重复挂载\n */\nexport function createStandaloneStarter(options: MicroAppRuntime): StartStandaloneFn {\n const { initRuntime, mountApp } = options;\n\n let standaloneInstance: MicroAppInstance | null = null;\n\n return async function startStandalone(customOptions?: StartStandaloneOptions): Promise<MicroAppInstance> {\n if (standaloneInstance) {\n return standaloneInstance;\n }\n\n await initRuntime();\n\n standaloneInstance = mountApp({\n container: customOptions?.container ?? document,\n props: customOptions?.props,\n });\n\n return standaloneInstance;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-fe/mf-adapters",
3
- "version": "1.0.0-alpha.1",
3
+ "version": "1.0.0-alpha.3",
4
4
  "description": "微前端适配工具库,支持 React/Vue/任意框架在 Garfish/qiankun 等宿主中运行",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",