@seed-fe/mf-adapters 1.0.0-alpha.2 → 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
@@ -86,7 +86,7 @@ function App({ app }: MicroAppRuntimeProps) {
86
86
  ```ts
87
87
  // src/mf-adapters/runtime.ts
88
88
  import { createMicroFrontendAdapter } from '@seed-fe/mf-adapters';
89
- import type { InitRuntimeFn, MountAppFn, StartStandaloneFn } from '@seed-fe/mf-adapters';
89
+ import type { InitRuntimeFn, MountAppFn, MountAppOptions, StartStandaloneFn } from '@seed-fe/mf-adapters';
90
90
 
91
91
  // 使用类型别名,获得完整类型提示
92
92
  const initRuntime: InitRuntimeFn = async () => {
@@ -104,6 +104,11 @@ const mountApp: MountAppFn = ({ container, props }) => {
104
104
  };
105
105
  };
106
106
 
107
+ // 或者使用 options 类型单独标注入参(适合 function 声明)
108
+ function mountApp2(options: MountAppOptions) {
109
+ return mountApp(options);
110
+ }
111
+
107
112
  const startStandalone: StartStandaloneFn = async (options) => {
108
113
  await initRuntime();
109
114
  return mountApp({
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
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 P(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:g}=P({initRuntime:a,mountApp:p});d={bootstrap:l,mount:f,unmount:g},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=P;exports.createStandaloneStarter=L;exports.initMicroFrontendHosts=R;//# 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/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 { MicroAppHooks, 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: MicroAppHooks) {\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 { MicroAppHooks, 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: MicroAppHooks) {\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';\nimport type { StandaloneOptions } from './standalone';\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: (options?: StandaloneOptions) => Promise<MicroAppInstance>;\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 { InitRuntimeFn, MicroAppInstance, MicroAppRuntimeProps, MountAppFn } from '../types/base';\n\nexport interface StandaloneOptions {\n container?: Element | Document;\n props?: MicroAppRuntimeProps;\n}\n\nexport interface StandaloneStarterOptions {\n initRuntime: InitRuntimeFn;\n mountApp: MountAppFn;\n}\n\n/**\n * 创建独立运行模式启动器:\n * - 统一处理非微前端宿主环境下的初始化逻辑\n * - 内部保证单例实例,避免重复挂载\n */\nexport function createStandaloneStarter(options: StandaloneStarterOptions) {\n const { initRuntime, mountApp } = options;\n\n let standaloneInstance: MicroAppInstance | null = null;\n\n return async function startStandalone(customOptions?: StandaloneOptions): 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"]}
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
@@ -66,6 +66,36 @@ interface MicroAppInstance {
66
66
  * ```
67
67
  */
68
68
  type InitRuntimeFn = () => Promise<void>;
69
+ /**
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>;
69
99
  /**
70
100
  * 微应用挂载函数类型
71
101
  *
@@ -87,14 +117,14 @@ type InitRuntimeFn = () => Promise<void>;
87
117
  * };
88
118
  * ```
89
119
  */
90
- type MountAppFn = (options: {
91
- container: Element | Document;
92
- props?: MicroAppRuntimeProps;
93
- }) => MicroAppInstance;
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
@@ -107,19 +137,19 @@ type MountAppFn = (options: {
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?: Element | Document;
114
- props?: MicroAppRuntimeProps;
115
- }) => Promise<MicroAppInstance>;
145
+ type StartStandaloneFn = (options?: StartStandaloneOptions) => Promise<MicroAppInstance>;
116
146
  /**
117
- * 微应用入口契约(由微应用侧实现)
147
+ * 微应用运行时函数集合(由微应用侧实现)
118
148
  *
119
149
  * - 适用于所有微前端宿主(Garfish / qiankun / 未来扩展)
120
150
  * - 定义了微应用侧必须实现的两个核心函数
121
151
  */
122
- interface MicroAppHooks {
152
+ interface MicroAppRuntime {
123
153
  /**
124
154
  * 微应用运行时初始化逻辑
125
155
  *
@@ -128,7 +158,7 @@ interface MicroAppHooks {
128
158
  */
129
159
  initRuntime: InitRuntimeFn;
130
160
  /**
131
- * 微应用渲染函数
161
+ * 微应用挂载函数
132
162
  *
133
163
  * - 不关心具体框架(React / Vue / 纯 DOM)
134
164
  * - 仅约定返回包含 unmount() 的实例
@@ -177,21 +207,6 @@ interface QiankunProps extends MicroAppRuntimeProps {
177
207
  container?: Element;
178
208
  }
179
209
 
180
- interface StandaloneOptions {
181
- container?: Element | Document;
182
- props?: MicroAppRuntimeProps;
183
- }
184
- interface StandaloneStarterOptions {
185
- initRuntime: InitRuntimeFn;
186
- mountApp: MountAppFn;
187
- }
188
- /**
189
- * 创建独立运行模式启动器:
190
- * - 统一处理非微前端宿主环境下的初始化逻辑
191
- * - 内部保证单例实例,避免重复挂载
192
- */
193
- declare function createStandaloneStarter(options: StandaloneStarterOptions): (customOptions?: StandaloneOptions) => Promise<MicroAppInstance>;
194
-
195
210
  interface MicroFrontendAdapterOptions {
196
211
  /**
197
212
  * 微应用运行时初始化逻辑,由应用侧实现。
@@ -254,7 +269,7 @@ interface MicroFrontendAdapter {
254
269
  /**
255
270
  * 独立运行模式入口(直接透传应用侧实现)
256
271
  */
257
- startStandalone: (options?: StandaloneOptions) => Promise<MicroAppInstance>;
272
+ startStandalone: StartStandaloneFn;
258
273
  /**
259
274
  * qiankun 生命周期适配结果
260
275
  * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};
@@ -278,6 +293,13 @@ interface MicroFrontendAdapter {
278
293
  */
279
294
  declare function createMicroFrontendAdapter(options: MicroFrontendAdapterOptions): MicroFrontendAdapter;
280
295
 
296
+ /**
297
+ * 创建独立运行模式启动器:
298
+ * - 统一处理非微前端宿主环境下的初始化逻辑
299
+ * - 内部保证单例实例,避免重复挂载
300
+ */
301
+ declare function createStandaloneStarter(options: MicroAppRuntime): StartStandaloneFn;
302
+
281
303
  /**
282
304
  * Garfish 相关类型声明与全局接口扩展。
283
305
  *
@@ -328,7 +350,7 @@ interface GarfishExports {
328
350
  * - 内部通过 Map<Document, MicroAppInstance> 管理实例,支持多容器挂载
329
351
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
330
352
  */
331
- declare function createGarfishAdapter(options: MicroAppHooks): {
353
+ declare function createGarfishAdapter(options: MicroAppRuntime): {
332
354
  provider: () => {
333
355
  render(params: GarfishRenderParams): Promise<void>;
334
356
  destroy(params: GarfishDestroyParams): void;
@@ -341,10 +363,10 @@ declare function createGarfishAdapter(options: MicroAppHooks): {
341
363
  * - 内部通过 Map<container, MicroAppInstance> 管理实例,支持多实例挂载
342
364
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
343
365
  */
344
- declare function createQiankunAdapter(options: MicroAppHooks): {
366
+ declare function createQiankunAdapter(options: MicroAppRuntime): {
345
367
  bootstrap: () => Promise<void>;
346
368
  mount: (props: QiankunProps) => void;
347
369
  unmount: (props?: QiankunProps) => void;
348
370
  };
349
371
 
350
- export { type GarfishAppRenderInfo, type GarfishDestroyParams, type GarfishExports, type GarfishRenderParams, type InitMicroFrontendHostsOptions, type InitRuntimeFn, type MicroAppConfig, type MicroAppHooks, type MicroAppInstance, type MicroAppRuntimeProps, type MicroFrontendAdapter, type MicroFrontendAdapterOptions, type MicroFrontendHostAdapter, type MountAppFn, type QiankunProps, type StandaloneOptions, type StandaloneStarterOptions, type StartStandaloneFn, createGarfishAdapter, createMicroFrontendAdapter, 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
@@ -66,6 +66,36 @@ interface MicroAppInstance {
66
66
  * ```
67
67
  */
68
68
  type InitRuntimeFn = () => Promise<void>;
69
+ /**
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>;
69
99
  /**
70
100
  * 微应用挂载函数类型
71
101
  *
@@ -87,14 +117,14 @@ type InitRuntimeFn = () => Promise<void>;
87
117
  * };
88
118
  * ```
89
119
  */
90
- type MountAppFn = (options: {
91
- container: Element | Document;
92
- props?: MicroAppRuntimeProps;
93
- }) => MicroAppInstance;
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
@@ -107,19 +137,19 @@ type MountAppFn = (options: {
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?: Element | Document;
114
- props?: MicroAppRuntimeProps;
115
- }) => Promise<MicroAppInstance>;
145
+ type StartStandaloneFn = (options?: StartStandaloneOptions) => Promise<MicroAppInstance>;
116
146
  /**
117
- * 微应用入口契约(由微应用侧实现)
147
+ * 微应用运行时函数集合(由微应用侧实现)
118
148
  *
119
149
  * - 适用于所有微前端宿主(Garfish / qiankun / 未来扩展)
120
150
  * - 定义了微应用侧必须实现的两个核心函数
121
151
  */
122
- interface MicroAppHooks {
152
+ interface MicroAppRuntime {
123
153
  /**
124
154
  * 微应用运行时初始化逻辑
125
155
  *
@@ -128,7 +158,7 @@ interface MicroAppHooks {
128
158
  */
129
159
  initRuntime: InitRuntimeFn;
130
160
  /**
131
- * 微应用渲染函数
161
+ * 微应用挂载函数
132
162
  *
133
163
  * - 不关心具体框架(React / Vue / 纯 DOM)
134
164
  * - 仅约定返回包含 unmount() 的实例
@@ -177,21 +207,6 @@ interface QiankunProps extends MicroAppRuntimeProps {
177
207
  container?: Element;
178
208
  }
179
209
 
180
- interface StandaloneOptions {
181
- container?: Element | Document;
182
- props?: MicroAppRuntimeProps;
183
- }
184
- interface StandaloneStarterOptions {
185
- initRuntime: InitRuntimeFn;
186
- mountApp: MountAppFn;
187
- }
188
- /**
189
- * 创建独立运行模式启动器:
190
- * - 统一处理非微前端宿主环境下的初始化逻辑
191
- * - 内部保证单例实例,避免重复挂载
192
- */
193
- declare function createStandaloneStarter(options: StandaloneStarterOptions): (customOptions?: StandaloneOptions) => Promise<MicroAppInstance>;
194
-
195
210
  interface MicroFrontendAdapterOptions {
196
211
  /**
197
212
  * 微应用运行时初始化逻辑,由应用侧实现。
@@ -254,7 +269,7 @@ interface MicroFrontendAdapter {
254
269
  /**
255
270
  * 独立运行模式入口(直接透传应用侧实现)
256
271
  */
257
- startStandalone: (options?: StandaloneOptions) => Promise<MicroAppInstance>;
272
+ startStandalone: StartStandaloneFn;
258
273
  /**
259
274
  * qiankun 生命周期适配结果
260
275
  * - 需要在微应用中按需导出:export const { bootstrap, mount, unmount } = runtime.qiankun ?? {};
@@ -278,6 +293,13 @@ interface MicroFrontendAdapter {
278
293
  */
279
294
  declare function createMicroFrontendAdapter(options: MicroFrontendAdapterOptions): MicroFrontendAdapter;
280
295
 
296
+ /**
297
+ * 创建独立运行模式启动器:
298
+ * - 统一处理非微前端宿主环境下的初始化逻辑
299
+ * - 内部保证单例实例,避免重复挂载
300
+ */
301
+ declare function createStandaloneStarter(options: MicroAppRuntime): StartStandaloneFn;
302
+
281
303
  /**
282
304
  * Garfish 相关类型声明与全局接口扩展。
283
305
  *
@@ -328,7 +350,7 @@ interface GarfishExports {
328
350
  * - 内部通过 Map<Document, MicroAppInstance> 管理实例,支持多容器挂载
329
351
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
330
352
  */
331
- declare function createGarfishAdapter(options: MicroAppHooks): {
353
+ declare function createGarfishAdapter(options: MicroAppRuntime): {
332
354
  provider: () => {
333
355
  render(params: GarfishRenderParams): Promise<void>;
334
356
  destroy(params: GarfishDestroyParams): void;
@@ -341,10 +363,10 @@ declare function createGarfishAdapter(options: MicroAppHooks): {
341
363
  * - 内部通过 Map<container, MicroAppInstance> 管理实例,支持多实例挂载
342
364
  * - 不关心具体渲染实现细节(React/Vue/纯 DOM 等)
343
365
  */
344
- declare function createQiankunAdapter(options: MicroAppHooks): {
366
+ declare function createQiankunAdapter(options: MicroAppRuntime): {
345
367
  bootstrap: () => Promise<void>;
346
368
  mount: (props: QiankunProps) => void;
347
369
  unmount: (props?: QiankunProps) => void;
348
370
  };
349
371
 
350
- export { type GarfishAppRenderInfo, type GarfishDestroyParams, type GarfishExports, type GarfishRenderParams, type InitMicroFrontendHostsOptions, type InitRuntimeFn, type MicroAppConfig, type MicroAppHooks, type MicroAppInstance, type MicroAppRuntimeProps, type MicroFrontendAdapter, type MicroFrontendAdapterOptions, type MicroFrontendHostAdapter, type MountAppFn, type QiankunProps, type StandaloneOptions, type StandaloneStarterOptions, type StartStandaloneFn, createGarfishAdapter, createMicroFrontendAdapter, 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 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 P(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 g(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}=P({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:x}=g({initRuntime:a,mountApp:p});l={bootstrap:A,mount:u,unmount:x},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{P as createGarfishAdapter,X as createMicroFrontendAdapter,g as createQiankunAdapter,W as createStandaloneStarter,y 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/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":"+BAAO,IAAMA,CAAAA,CAAgB,uBAEtB,SAASC,CAAAA,CAAgBC,CAAAA,CAAwB,CACtD,OAAOA,CAAAA,CAAQ,CAAA,CAAA,EAAIF,CAAa,KAAKE,CAAK,CAAA,CAAA,CAAA,CAAM,CAAA,CAAA,EAAIF,CAAa,CAAA,CAAA,CACnE,CCoBA,IAAIG,CAAAA,CAAmB,MAKvB,eAAsBC,CAAAA,CAAuBC,CAAAA,CAAuD,CAClG,GAAIF,CAAAA,CACF,OAGF,GAAM,CAAE,MAAAG,CAAAA,CAAO,QAAA,CAAAC,CAAS,CAAA,CAAIF,CAAAA,CAE5B,IAAA,IAAWG,CAAAA,IAAQF,CAAAA,CACjB,GAAIE,CAAAA,CAAK,MAAA,EAAO,CAAG,CACjBC,EAAO,IAAA,CAAK,CAAA,EAAGR,CAAAA,CAAgB,cAAc,CAAC,CAAA,gBAAA,EAAmBO,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAE5E,GAAI,CACF,MAAMA,EAAK,QAAA,IAAW,CACtBL,CAAAA,CAAmB,CAAA,CAAA,CACnBM,EAAO,IAAA,CAAK,CAAA,EAAGR,CAAAA,CAAgB,cAAc,CAAC,CAAA,iBAAA,EAAoBO,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAC7E,MACF,CAAA,MAASE,CAAAA,CAAO,CACdD,CAAAA,CAAO,KAAA,CAAM,CAAA,EAAGR,CAAAA,CAAgB,cAAc,CAAC,CAAA,oBAAA,EAAuBO,CAAAA,CAAK,IAAI,oBAAqBE,CAAK,EAE3G,CACF,CAIGP,CAAAA,GACHM,CAAAA,CAAO,IAAA,CAAK,CAAA,EAAGR,EAAgB,cAAc,CAAC,CAAA,4BAAA,CAA8B,CAAA,CAC5E,MAAMM,CAAAA,EAAS,CACfJ,CAAAA,CAAmB,IAAA,EAEvB,CC/CO,SAASQ,CAAAA,CAAqBN,CAAAA,CAAwB,CAC3D,GAAM,CAAE,WAAA,CAAAO,CAAAA,CAAa,QAAA,CAAAC,CAAS,EAAIR,CAAAA,CAE5BS,CAAAA,CAAsB,IAAI,GAAA,CAEhC,SAASC,CAAAA,EAAW,CAClB,OAAO,CACL,MAAA,CAAOC,CAAAA,CAA6B,CAClC,OAAOJ,GAAY,CAChB,IAAA,CAAK,IAAM,CACV,IAAMK,CAAAA,CAAWJ,CAAAA,CAAS,CACxB,SAAA,CAAWG,EAAO,GAAA,CAClB,KAAA,CAAOA,CAAAA,CAAO,KAChB,CAAC,CAAA,CACDF,CAAAA,CAAoB,GAAA,CAAIE,EAAO,GAAA,CAAKC,CAAQ,CAAA,CAC5CR,CAAAA,CAAO,KAAK,CAAA,EAAGR,CAAAA,CAAgB,SAAS,CAAC,2BAA2Be,CAAAA,CAAO,OAAO,CAAA,CAAE,EACtF,CAAC,CAAA,CACA,KAAA,CAAON,CAAAA,EAAiB,CACvB,MAAAD,CAAAA,CAAO,KAAA,CAAM,CAAA,EAAGR,EAAgB,SAAS,CAAC,CAAA,gBAAA,EAAmBe,CAAAA,CAAO,OAAO,CAAA,CAAA,CAAIN,CAAK,CAAA,CAEpFI,CAAAA,CAAoB,MAAA,CAAOE,CAAAA,CAAO,GAAG,CAAA,CAE/BN,CACR,CAAC,CACL,CAAA,CACA,OAAA,CAAQM,EAA8B,CACpC,GAAI,CACF,IAAMC,EAAWH,CAAAA,CAAoB,GAAA,CAAIE,CAAAA,CAAO,GAAG,CAAA,CAC/CC,CAAAA,EACFA,CAAAA,CAAS,OAAA,GAEXH,CAAAA,CAAoB,MAAA,CAAOE,CAAAA,CAAO,GAAG,EACrCP,CAAAA,CAAO,IAAA,CAAK,CAAA,EAAGR,CAAAA,CAAgB,SAAS,CAAC,CAAA,kBAAA,CAAoB,EAC/D,CAAA,MAASS,CAAAA,CAAO,CAEdD,CAAAA,CAAO,KAAA,CAAM,GAAGR,CAAAA,CAAgB,SAAS,CAAC,CAAA,eAAA,CAAA,CAAmBS,CAAK,EACpE,CACF,CACF,CACF,CAEA,OAAO,CAAE,QAAA,CAAAK,CAAS,CACpB,CC1CO,SAASG,CAAAA,CAAqBb,CAAAA,CAAwB,CAC3D,GAAM,CAAE,WAAA,CAAAO,CAAAA,CAAa,QAAA,CAAAC,CAAS,CAAA,CAAIR,CAAAA,CAE5Bc,CAAAA,CAAuB,IAAI,GAAA,CAEjC,eAAeC,CAAAA,EAAY,CACzB,GAAI,CACF,MAAMR,CAAAA,EAAY,CAClBH,EAAO,IAAA,CAAK,CAAA,EAAGR,CAAAA,CAAgB,SAAS,CAAC,CAAA,oBAAA,CAAsB,EACjE,CAAA,MAASS,CAAAA,CAAO,CACd,MAAAD,CAAAA,CAAO,KAAA,CAAM,GAAGR,CAAAA,CAAgB,SAAS,CAAC,CAAA,iBAAA,CAAA,CAAqBS,CAAK,CAAA,CAC9DA,CACR,CACF,CAEA,SAASW,CAAAA,CAAMC,CAAAA,CAAqB,CAClC,GAAI,CACF,IAAMC,CAAAA,CAAYD,CAAAA,CAAM,WAAa,QAAA,CAC/BL,CAAAA,CAAWJ,CAAAA,CAAS,CACxB,UAAAU,CAAAA,CACA,KAAA,CAAAD,CACF,CAAC,EACDH,CAAAA,CAAqB,GAAA,CAAII,CAAAA,CAAWN,CAAQ,CAAA,CAC5CR,CAAAA,CAAO,IAAA,CAAK,CAAA,EAAGR,EAAgB,SAAS,CAAC,CAAA,gBAAA,CAAkB,EAC7D,OAASS,CAAAA,CAAO,CACd,MAAAD,CAAAA,CAAO,MAAM,CAAA,EAAGR,CAAAA,CAAgB,SAAS,CAAC,CAAA,aAAA,CAAA,CAAiBS,CAAK,CAAA,CAC1DA,CACR,CACF,CAEA,SAASc,CAAAA,CAAQF,CAAAA,CAAsB,CACrC,GAAI,CACF,IAAMC,CAAAA,CAAYD,GAAO,SAAA,EAAa,QAAA,CACrBH,CAAAA,CAAqB,GAAA,CAAII,CAAS,CAAA,EACzC,OAAA,EAAQ,CAClBJ,EAAqB,MAAA,CAAOI,CAAS,CAAA,CACrCd,CAAAA,CAAO,KAAK,CAAA,EAAGR,CAAAA,CAAgB,SAAS,CAAC,oBAAoB,EAC/D,CAAA,MAASS,CAAAA,CAAO,CACd,MAAAD,CAAAA,CAAO,KAAA,CAAM,CAAA,EAAGR,EAAgB,SAAS,CAAC,CAAA,eAAA,CAAA,CAAmBS,CAAK,EAC5DA,CACR,CACF,CAEA,OAAO,CAAE,SAAA,CAAAU,CAAAA,CAAW,KAAA,CAAAC,CAAAA,CAAO,OAAA,CAAAG,CAAQ,CACrC,CCwCO,SAASC,CAAAA,CAA2BpB,CAAAA,CAA4D,CACrG,GAAM,CAAE,WAAA,CAAAO,CAAAA,CAAa,QAAA,CAAAC,CAAAA,CAAU,gBAAAa,CAAAA,CAAiB,KAAA,CAAApB,CAAAA,CAAO,UAAA,CAAAqB,CAAW,CAAA,CAAItB,CAAAA,CAGhEuB,CAAAA,CAAiBtB,GAAO,OAAA,EAAW,IAAA,CACnCuB,CAAAA,CAAiBvB,CAAAA,EAAO,SAAW,IAAA,CAEnCwB,CAAAA,CAA2C,EAAC,CAGlD,GAAIF,CAAAA,CAAgB,CAClB,GAAM,CAAE,QAAA,CAAAb,CAAS,CAAA,CAAIJ,CAAAA,CAAqB,CACxC,WAAA,CAAAC,CAAAA,CACA,QAAA,CAAWmB,CAAAA,EACTlB,EAAS,CACP,SAAA,CAAWkB,CAAAA,CAAe,SAAA,CAC1B,MAAOA,CAAAA,CAAe,KACxB,CAAC,CACL,CAAC,CAAA,CAMD,GAAI,MAAA,CAAO,YAAa,CACtB,IAAMC,CAAAA,CAAoB,UAAA,CACrBA,EAAkB,mBAAA,GACrBA,CAAAA,CAAkB,mBAAA,CAAsB,IAE1CA,CAAAA,CAAkB,mBAAA,CAAoB,QAAA,CAAWjB,EACnD,CAEAe,CAAAA,CAAa,IAAA,CAAK,CAChB,KAAM,SAAA,CACN,MAAA,CAAQ,IAAM,CAAA,CAAQ,OAAO,WAAA,CAC7B,QAAA,CAAU,IAAM,CACV,OAAO,mBAAA,CAAwB,GAAA,GACjC,mBAAA,CAAoB,QAAA,CAAWf,CAAAA,EAEnC,CACF,CAAC,EACH,CAGA,IAAIkB,CAAAA,CAEJ,GAAIJ,CAAAA,CAAgB,CAClB,GAAM,CAAE,SAAA,CAAAT,CAAAA,CAAW,MAAAC,CAAAA,CAAO,OAAA,CAAAG,CAAQ,CAAA,CAAIN,CAAAA,CAAqB,CACzD,WAAA,CAAAN,CAAAA,CACA,SAAAC,CACF,CAAC,CAAA,CAEDoB,CAAAA,CAAoB,CAClB,SAAA,CAAAb,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,QAAAG,CACF,CAAA,CAKAM,CAAAA,CAAa,IAAA,CAAK,CAChB,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,IAAM,CAAA,CAAQ,MAAA,CAAO,sBAC/B,CAAC,EACH,CAEA,OAAIH,CAAAA,EAAY,MAAA,EACdG,EAAa,IAAA,CAAK,GAAGH,CAAU,CAAA,CAI5BvB,CAAAA,CAAuB,CAC1B,KAAA,CAAO0B,CAAAA,CACP,SAAU,IAAMJ,CAAAA,EAClB,CAAC,EAEM,CACL,eAAA,CAAAA,CAAAA,CACA,OAAA,CAASO,CACX,CACF,CC/JO,SAASC,CAAAA,CAAwB7B,CAAAA,CAAmC,CACzE,GAAM,CAAE,YAAAO,CAAAA,CAAa,QAAA,CAAAC,CAAS,CAAA,CAAIR,EAE9B8B,CAAAA,CAA8C,IAAA,CAElD,OAAO,eAA+BC,EAA8D,CAClG,OAAID,CAAAA,GAIJ,MAAMvB,CAAAA,EAAY,CAElBuB,CAAAA,CAAqBtB,CAAAA,CAAS,CAC5B,SAAA,CAAWuB,CAAAA,EAAe,SAAA,EAAa,QAAA,CACvC,MAAOA,CAAAA,EAAe,KACxB,CAAC,CAAA,CAEMD,EACT,CACF","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 { MicroAppHooks, 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: MicroAppHooks) {\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 { MicroAppHooks, 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: MicroAppHooks) {\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';\nimport type { StandaloneOptions } from './standalone';\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: (options?: StandaloneOptions) => Promise<MicroAppInstance>;\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 { InitRuntimeFn, MicroAppInstance, MicroAppRuntimeProps, MountAppFn } from '../types/base';\n\nexport interface StandaloneOptions {\n container?: Element | Document;\n props?: MicroAppRuntimeProps;\n}\n\nexport interface StandaloneStarterOptions {\n initRuntime: InitRuntimeFn;\n mountApp: MountAppFn;\n}\n\n/**\n * 创建独立运行模式启动器:\n * - 统一处理非微前端宿主环境下的初始化逻辑\n * - 内部保证单例实例,避免重复挂载\n */\nexport function createStandaloneStarter(options: StandaloneStarterOptions) {\n const { initRuntime, mountApp } = options;\n\n let standaloneInstance: MicroAppInstance | null = null;\n\n return async function startStandalone(customOptions?: StandaloneOptions): 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"]}
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.2",
3
+ "version": "1.0.0-alpha.3",
4
4
  "description": "微前端适配工具库,支持 React/Vue/任意框架在 Garfish/qiankun 等宿主中运行",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",