@maxax/x-plugins-micro 1.0.3 → 1.0.4

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/dist/index.cjs CHANGED
@@ -26,12 +26,63 @@ __export(index_exports, {
26
26
  getMicroApps: () => getMicroApps,
27
27
  hasMicroApps: () => hasMicroApps,
28
28
  hasValidEntry: () => hasValidEntry,
29
+ isPoweredByMicro: () => isPoweredByMicro,
29
30
  microAppManager: () => microAppManager,
31
+ qiankunWindow: () => qiankunWindow,
32
+ renderWithQiankun: () => renderWithQiankun,
30
33
  setupMicroPluginApps: () => setupMicroPluginApps,
31
- startMicroPluginApps: () => startMicroPluginApps
34
+ startMicroPluginApps: () => startMicroPluginApps,
35
+ useMicroAppLifecycle: () => useMicroAppLifecycle
32
36
  });
33
37
  module.exports = __toCommonJS(index_exports);
34
38
 
39
+ // src/helper.ts
40
+ var qiankunWindow = typeof window !== "undefined" ? window.proxy || window : {};
41
+ var renderWithQiankun = (qiankunLifeCycle) => {
42
+ if (qiankunWindow == null ? void 0 : qiankunWindow.__POWERED_BY_QIANKUN__) {
43
+ if (!window.moudleQiankunAppLifeCycles) {
44
+ window.moudleQiankunAppLifeCycles = {};
45
+ }
46
+ if (qiankunWindow.qiankunName) {
47
+ window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;
48
+ }
49
+ }
50
+ };
51
+ function isPoweredByMicro() {
52
+ return qiankunWindow.__POWERED_BY_QIANKUN__;
53
+ }
54
+ function useMicroAppLifecycle({ mount, unmount, update, bootstrap }) {
55
+ const mountMicroApp = async (props) => {
56
+ await (mount == null ? void 0 : mount(props));
57
+ };
58
+ const unmountMicroApp = async (props) => {
59
+ await (unmount == null ? void 0 : unmount(props));
60
+ };
61
+ const updateMicroApp = async (props) => {
62
+ await (update == null ? void 0 : update(props));
63
+ };
64
+ const bootstrapMicroApp = async () => {
65
+ await (bootstrap == null ? void 0 : bootstrap());
66
+ };
67
+ if (!isPoweredByMicro()) {
68
+ void mountMicroApp();
69
+ }
70
+ renderWithQiankun({
71
+ async bootstrap() {
72
+ await bootstrapMicroApp();
73
+ },
74
+ async mount(props) {
75
+ await mountMicroApp(props);
76
+ },
77
+ async unmount(props) {
78
+ await unmountMicroApp(props);
79
+ },
80
+ async update(props) {
81
+ await updateMicroApp(props);
82
+ }
83
+ });
84
+ }
85
+
35
86
  // src/setup.ts
36
87
  var import_qiankun = require("qiankun");
37
88
  var MicroAppManager = class {
@@ -189,8 +240,12 @@ function hasValidEntry(app) {
189
240
  getMicroApps,
190
241
  hasMicroApps,
191
242
  hasValidEntry,
243
+ isPoweredByMicro,
192
244
  microAppManager,
245
+ qiankunWindow,
246
+ renderWithQiankun,
193
247
  setupMicroPluginApps,
194
- startMicroPluginApps
248
+ startMicroPluginApps,
249
+ useMicroAppLifecycle
195
250
  });
196
251
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/setup.ts"],"sourcesContent":["export * from './setup'\nexport * from './types'\n","/**\n * 微前端应用设置和启动模块\n * @module setup\n */\n\nimport type { FrameworkConfiguration } from 'qiankun'\nimport { addGlobalUncaughtErrorHandler, registerMicroApps, start } from 'qiankun'\nimport type { MicroAppDescriptor, MicroAppSetupOptions, MicroAppStartOptions } from './types'\n\n/**\n * 微前端管理器类\n * 负责管理微应用的注册、启动和生命周期\n */\nexport class MicroAppManager {\n /** 是否已注册微应用 */\n private hasRegistered = false\n\n /** 是否已启动微前端框架 */\n private hasStarted = false\n\n /** 微应用配置列表 */\n private apps: MicroAppDescriptor[] = []\n\n /** 启动配置选项 */\n private startOptions: MicroAppStartOptions = {}\n\n /** 自定义加载器函数 */\n private loader?: (loading: boolean) => void\n\n /** 自定义错误处理函数 */\n private onError?: (event: Event | string) => void\n\n /**\n * 检查是否有有效的微应用配置\n * @returns 是否存在有效的微应用\n */\n hasMicroApps(): boolean {\n return this.apps.length > 0\n }\n\n /**\n * 过滤出有效的微应用配置(必须有 entry)\n * @param apps 微应用配置列表\n * @returns 有效的微应用配置列表\n */\n private filterValidApps(apps: MicroAppDescriptor[]): MicroAppDescriptor[] {\n return apps.filter((app): app is MicroAppDescriptor & { entry: string } => {\n return typeof app.entry === 'string' && app.entry.length > 0\n })\n }\n\n /**\n * 设置微前端应用\n * @param options 设置选项\n */\n setup(options: MicroAppSetupOptions): void {\n if (this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用已经注册,跳过重复注册')\n return\n }\n\n // 过滤出有效的微应用配置\n this.apps = this.filterValidApps(options.apps)\n\n if (!this.hasMicroApps()) {\n console.warn('[x-micro-plugin] 没有有效的微应用配置,跳过注册')\n return\n }\n\n // 保存配置选项\n this.startOptions = options.startOptions || {}\n this.loader = options.loader\n this.onError = options.onError\n\n // 注册微应用\n this.registerMicroApps()\n\n // 设置全局错误处理\n this.setupErrorHandler()\n\n this.hasRegistered = true\n }\n\n /**\n * 注册微应用到 qiankun\n */\n private registerMicroApps(): void {\n registerMicroApps(\n this.apps.map(app => ({\n name: app.name,\n entry: app.entry!,\n container: `#${app.containerId}`,\n activeRule: app.activeRule,\n props: {\n ...app.props\n },\n loader: (loading: boolean) => {\n // 调用自定义加载器\n this.loader?.(loading)\n }\n }))\n )\n }\n\n /**\n * 设置全局错误处理\n */\n private setupErrorHandler(): void {\n addGlobalUncaughtErrorHandler((event: Event | string) => {\n // 调用自定义错误处理函数\n if (this.onError) {\n this.onError(event)\n } else {\n // 默认错误处理\n console.error('[x-micro-plugin] 微应用加载错误', event)\n // 尝试使用全局消息提示\n if (typeof window !== 'undefined' && (window as any).$message) {\n console.error('子应用加载失败,请稍后重试')\n }\n }\n })\n }\n\n /**\n * 启动微前端框架\n */\n start(): void {\n if (!this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用尚未注册,请先调用 setup() 方法')\n return\n }\n\n if (this.hasStarted) {\n console.warn('[x-micro-plugin] 微前端框架已经启动,跳过重复启动')\n return\n }\n\n const startOpts: FrameworkConfiguration = {\n prefetch: this.startOptions.prefetch !== false, // 默认启用预加载\n sandbox: {\n experimentalStyleIsolation: this.startOptions.sandbox?.experimentalStyleIsolation ?? true,\n strictStyleIsolation: this.startOptions.sandbox?.strictStyleIsolation ?? false,\n ...this.startOptions.sandbox\n },\n ...this.startOptions\n }\n\n start(startOpts)\n\n this.hasStarted = true\n }\n\n /**\n * 获取已注册的微应用配置列表\n * @returns 微应用配置列表的只读副本\n */\n getApps(): ReadonlyArray<MicroAppDescriptor> {\n return [...this.apps]\n }\n\n /**\n * 重置管理器状态(主要用于测试)\n */\n reset(): void {\n this.hasRegistered = false\n this.hasStarted = false\n this.apps = []\n this.startOptions = {}\n this.loader = undefined\n this.onError = undefined\n }\n}\n\n/**\n * 全局微前端管理器实例\n */\nexport const microAppManager = new MicroAppManager()\n\n/**\n * 设置微前端应用(便捷函数)\n * @param options 设置选项\n */\nexport function setupMicroPluginApps(options: MicroAppSetupOptions): void {\n microAppManager.setup(options)\n}\n\n/**\n * 启动微前端框架(便捷函数)\n */\nexport function startMicroPluginApps(): void {\n microAppManager.start()\n}\n\n/**\n * 检查是否有微应用(便捷函数)\n * @returns 是否存在微应用\n */\nexport function hasMicroApps(): boolean {\n return microAppManager.hasMicroApps()\n}\n\n/**\n * 获取微应用配置列表(便捷函数)\n * @returns 微应用配置列表\n */\nexport function getMicroApps(): ReadonlyArray<MicroAppDescriptor> {\n return microAppManager.getApps()\n}\n\n/**\n * 类型守卫:检查微应用是否有有效的入口地址\n * @param app 微应用描述符\n * @returns 是否为有效的微应用(有入口地址)\n */\nexport function hasValidEntry(app: MicroAppDescriptor): app is MicroAppDescriptor & { entry: string } {\n return typeof app.entry === 'string' && app.entry.length > 0\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/helper.ts","../src/setup.ts"],"sourcesContent":["export * from './helper'\nexport * from './setup'\nexport * from './types'\n","import type { QiankunLifeCycle, QiankunProps, QiankunWindow, UseMicroAppOptions } from './types'\n\n// @ts-ignore\nexport const qiankunWindow: QiankunWindow = typeof window !== 'undefined' ? window.proxy || window : {}\n\nexport const renderWithQiankun = (qiankunLifeCycle: QiankunLifeCycle) => {\n // 函数只有一次执行机会,需要把生命周期赋值给全局\n if (qiankunWindow?.__POWERED_BY_QIANKUN__) {\n // @ts-ignore\n if (!window.moudleQiankunAppLifeCycles) {\n // @ts-ignore\n window.moudleQiankunAppLifeCycles = {}\n }\n // @ts-ignore\n if (qiankunWindow.qiankunName) {\n // @ts-ignore\n window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle\n }\n }\n}\n\n/**\n * Check if the app is running under Qiankun\n * @returns Whether the app is running under Qiankun\n */\nexport function isPoweredByMicro() {\n return qiankunWindow.__POWERED_BY_QIANKUN__\n}\n\n/**\n * Encapsulate Qiankun micro-frontend lifecycle wiring into a reusable hook\n */\nexport function useMicroAppLifecycle({ mount, unmount, update, bootstrap }: UseMicroAppOptions) {\n /** Mount logic for the micro app */\n const mountMicroApp = async (props?: QiankunProps) => {\n await mount?.(props)\n }\n\n /** Cleanup logic when Qiankun unmounts the micro app */\n const unmountMicroApp = async (props?: QiankunProps) => {\n await unmount?.(props)\n }\n\n /** Update logic for the micro app */\n const updateMicroApp = async (props?: QiankunProps) => {\n await update?.(props)\n }\n\n /** Bootstrap logic for the micro app */\n const bootstrapMicroApp = async () => {\n await bootstrap?.()\n }\n\n if (!isPoweredByMicro()) {\n void mountMicroApp()\n }\n\n renderWithQiankun({\n async bootstrap() {\n await bootstrapMicroApp()\n },\n async mount(props) {\n await mountMicroApp(props)\n },\n async unmount(props) {\n await unmountMicroApp(props)\n },\n async update(props) {\n await updateMicroApp(props)\n }\n })\n}\n","/**\n * 微前端应用设置和启动模块\n * @module setup\n */\n\nimport type { FrameworkConfiguration } from 'qiankun'\nimport { addGlobalUncaughtErrorHandler, registerMicroApps, start } from 'qiankun'\nimport type { MicroAppDescriptor, MicroAppSetupOptions, MicroAppStartOptions } from './types'\n\n/**\n * 微前端管理器类\n * 负责管理微应用的注册、启动和生命周期\n */\nexport class MicroAppManager {\n /** 是否已注册微应用 */\n private hasRegistered = false\n\n /** 是否已启动微前端框架 */\n private hasStarted = false\n\n /** 微应用配置列表 */\n private apps: MicroAppDescriptor[] = []\n\n /** 启动配置选项 */\n private startOptions: MicroAppStartOptions = {}\n\n /** 自定义加载器函数 */\n private loader?: (loading: boolean) => void\n\n /** 自定义错误处理函数 */\n private onError?: (event: Event | string) => void\n\n /**\n * 检查是否有有效的微应用配置\n * @returns 是否存在有效的微应用\n */\n hasMicroApps(): boolean {\n return this.apps.length > 0\n }\n\n /**\n * 过滤出有效的微应用配置(必须有 entry)\n * @param apps 微应用配置列表\n * @returns 有效的微应用配置列表\n */\n private filterValidApps(apps: MicroAppDescriptor[]): MicroAppDescriptor[] {\n return apps.filter((app): app is MicroAppDescriptor & { entry: string } => {\n return typeof app.entry === 'string' && app.entry.length > 0\n })\n }\n\n /**\n * 设置微前端应用\n * @param options 设置选项\n */\n setup(options: MicroAppSetupOptions): void {\n if (this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用已经注册,跳过重复注册')\n return\n }\n\n // 过滤出有效的微应用配置\n this.apps = this.filterValidApps(options.apps)\n\n if (!this.hasMicroApps()) {\n console.warn('[x-micro-plugin] 没有有效的微应用配置,跳过注册')\n return\n }\n\n // 保存配置选项\n this.startOptions = options.startOptions || {}\n this.loader = options.loader\n this.onError = options.onError\n\n // 注册微应用\n this.registerMicroApps()\n\n // 设置全局错误处理\n this.setupErrorHandler()\n\n this.hasRegistered = true\n }\n\n /**\n * 注册微应用到 qiankun\n */\n private registerMicroApps(): void {\n registerMicroApps(\n this.apps.map(app => ({\n name: app.name,\n entry: app.entry!,\n container: `#${app.containerId}`,\n activeRule: app.activeRule,\n props: {\n ...app.props\n },\n loader: (loading: boolean) => {\n // 调用自定义加载器\n this.loader?.(loading)\n }\n }))\n )\n }\n\n /**\n * 设置全局错误处理\n */\n private setupErrorHandler(): void {\n addGlobalUncaughtErrorHandler((event: Event | string) => {\n // 调用自定义错误处理函数\n if (this.onError) {\n this.onError(event)\n } else {\n // 默认错误处理\n console.error('[x-micro-plugin] 微应用加载错误', event)\n // 尝试使用全局消息提示\n if (typeof window !== 'undefined' && (window as any).$message) {\n console.error('子应用加载失败,请稍后重试')\n }\n }\n })\n }\n\n /**\n * 启动微前端框架\n */\n start(): void {\n if (!this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用尚未注册,请先调用 setup() 方法')\n return\n }\n\n if (this.hasStarted) {\n console.warn('[x-micro-plugin] 微前端框架已经启动,跳过重复启动')\n return\n }\n\n const startOpts: FrameworkConfiguration = {\n prefetch: this.startOptions.prefetch !== false, // 默认启用预加载\n sandbox: {\n experimentalStyleIsolation: this.startOptions.sandbox?.experimentalStyleIsolation ?? true,\n strictStyleIsolation: this.startOptions.sandbox?.strictStyleIsolation ?? false,\n ...this.startOptions.sandbox\n },\n ...this.startOptions\n }\n\n start(startOpts)\n\n this.hasStarted = true\n }\n\n /**\n * 获取已注册的微应用配置列表\n * @returns 微应用配置列表的只读副本\n */\n getApps(): ReadonlyArray<MicroAppDescriptor> {\n return [...this.apps]\n }\n\n /**\n * 重置管理器状态(主要用于测试)\n */\n reset(): void {\n this.hasRegistered = false\n this.hasStarted = false\n this.apps = []\n this.startOptions = {}\n this.loader = undefined\n this.onError = undefined\n }\n}\n\n/**\n * 全局微前端管理器实例\n */\nexport const microAppManager = new MicroAppManager()\n\n/**\n * 设置微前端应用(便捷函数)\n * @param options 设置选项\n */\nexport function setupMicroPluginApps(options: MicroAppSetupOptions): void {\n microAppManager.setup(options)\n}\n\n/**\n * 启动微前端框架(便捷函数)\n */\nexport function startMicroPluginApps(): void {\n microAppManager.start()\n}\n\n/**\n * 检查是否有微应用(便捷函数)\n * @returns 是否存在微应用\n */\nexport function hasMicroApps(): boolean {\n return microAppManager.hasMicroApps()\n}\n\n/**\n * 获取微应用配置列表(便捷函数)\n * @returns 微应用配置列表\n */\nexport function getMicroApps(): ReadonlyArray<MicroAppDescriptor> {\n return microAppManager.getApps()\n}\n\n/**\n * 类型守卫:检查微应用是否有有效的入口地址\n * @param app 微应用描述符\n * @returns 是否为有效的微应用(有入口地址)\n */\nexport function hasValidEntry(app: MicroAppDescriptor): app is MicroAppDescriptor & { entry: string } {\n return typeof app.entry === 'string' && app.entry.length > 0\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -49,6 +49,42 @@ interface MicroAppSetupOptions {
49
49
  /** 自定义错误处理函数 */
50
50
  onError?: (event: Event | string) => void;
51
51
  }
52
+ interface QiankunProps {
53
+ container?: HTMLElement;
54
+ [x: string]: any;
55
+ }
56
+ interface QiankunLifeCycle {
57
+ bootstrap: () => void | Promise<void>;
58
+ mount: (props: QiankunProps) => void | Promise<void>;
59
+ unmount: (props: QiankunProps) => void | Promise<void>;
60
+ update: (props: QiankunProps) => void | Promise<void>;
61
+ }
62
+ interface QiankunWindow {
63
+ __POWERED_BY_QIANKUN__?: boolean;
64
+ [x: string]: any;
65
+ }
66
+ interface UseMicroAppOptions {
67
+ /** Bootstrap logic for the micro app */
68
+ bootstrap?: () => Promise<void> | void;
69
+ /** Mount logic for the micro app, receives Qiankun props when running under Qiankun */
70
+ mount: (props?: QiankunProps) => Promise<void> | void;
71
+ /** Cleanup logic when Qiankun unmounts the micro app */
72
+ unmount: (props?: QiankunProps) => Promise<void> | void;
73
+ /** Update logic for the micro app */
74
+ update?: (props?: QiankunProps) => Promise<void> | void;
75
+ }
76
+
77
+ declare const qiankunWindow: QiankunWindow;
78
+ declare const renderWithQiankun: (qiankunLifeCycle: QiankunLifeCycle) => void;
79
+ /**
80
+ * Check if the app is running under Qiankun
81
+ * @returns Whether the app is running under Qiankun
82
+ */
83
+ declare function isPoweredByMicro(): boolean | undefined;
84
+ /**
85
+ * Encapsulate Qiankun micro-frontend lifecycle wiring into a reusable hook
86
+ */
87
+ declare function useMicroAppLifecycle({ mount, unmount, update, bootstrap }: UseMicroAppOptions): void;
52
88
 
53
89
  /**
54
90
  * 微前端应用设置和启动模块
@@ -142,4 +178,4 @@ declare function hasValidEntry(app: MicroAppDescriptor): app is MicroAppDescript
142
178
  entry: string;
143
179
  };
144
180
 
145
- export { type MicroAppDescriptor, MicroAppManager, type MicroAppSetupOptions, type MicroAppStartOptions, getMicroApps, hasMicroApps, hasValidEntry, microAppManager, setupMicroPluginApps, startMicroPluginApps };
181
+ export { type MicroAppDescriptor, MicroAppManager, type MicroAppSetupOptions, type MicroAppStartOptions, type QiankunLifeCycle, type QiankunProps, type QiankunWindow, type UseMicroAppOptions, getMicroApps, hasMicroApps, hasValidEntry, isPoweredByMicro, microAppManager, qiankunWindow, renderWithQiankun, setupMicroPluginApps, startMicroPluginApps, useMicroAppLifecycle };
package/dist/index.d.ts CHANGED
@@ -49,6 +49,42 @@ interface MicroAppSetupOptions {
49
49
  /** 自定义错误处理函数 */
50
50
  onError?: (event: Event | string) => void;
51
51
  }
52
+ interface QiankunProps {
53
+ container?: HTMLElement;
54
+ [x: string]: any;
55
+ }
56
+ interface QiankunLifeCycle {
57
+ bootstrap: () => void | Promise<void>;
58
+ mount: (props: QiankunProps) => void | Promise<void>;
59
+ unmount: (props: QiankunProps) => void | Promise<void>;
60
+ update: (props: QiankunProps) => void | Promise<void>;
61
+ }
62
+ interface QiankunWindow {
63
+ __POWERED_BY_QIANKUN__?: boolean;
64
+ [x: string]: any;
65
+ }
66
+ interface UseMicroAppOptions {
67
+ /** Bootstrap logic for the micro app */
68
+ bootstrap?: () => Promise<void> | void;
69
+ /** Mount logic for the micro app, receives Qiankun props when running under Qiankun */
70
+ mount: (props?: QiankunProps) => Promise<void> | void;
71
+ /** Cleanup logic when Qiankun unmounts the micro app */
72
+ unmount: (props?: QiankunProps) => Promise<void> | void;
73
+ /** Update logic for the micro app */
74
+ update?: (props?: QiankunProps) => Promise<void> | void;
75
+ }
76
+
77
+ declare const qiankunWindow: QiankunWindow;
78
+ declare const renderWithQiankun: (qiankunLifeCycle: QiankunLifeCycle) => void;
79
+ /**
80
+ * Check if the app is running under Qiankun
81
+ * @returns Whether the app is running under Qiankun
82
+ */
83
+ declare function isPoweredByMicro(): boolean | undefined;
84
+ /**
85
+ * Encapsulate Qiankun micro-frontend lifecycle wiring into a reusable hook
86
+ */
87
+ declare function useMicroAppLifecycle({ mount, unmount, update, bootstrap }: UseMicroAppOptions): void;
52
88
 
53
89
  /**
54
90
  * 微前端应用设置和启动模块
@@ -142,4 +178,4 @@ declare function hasValidEntry(app: MicroAppDescriptor): app is MicroAppDescript
142
178
  entry: string;
143
179
  };
144
180
 
145
- export { type MicroAppDescriptor, MicroAppManager, type MicroAppSetupOptions, type MicroAppStartOptions, getMicroApps, hasMicroApps, hasValidEntry, microAppManager, setupMicroPluginApps, startMicroPluginApps };
181
+ export { type MicroAppDescriptor, MicroAppManager, type MicroAppSetupOptions, type MicroAppStartOptions, type QiankunLifeCycle, type QiankunProps, type QiankunWindow, type UseMicroAppOptions, getMicroApps, hasMicroApps, hasValidEntry, isPoweredByMicro, microAppManager, qiankunWindow, renderWithQiankun, setupMicroPluginApps, startMicroPluginApps, useMicroAppLifecycle };
package/dist/index.mjs CHANGED
@@ -2,6 +2,53 @@ var __defProp = Object.defineProperty;
2
2
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
 
5
+ // src/helper.ts
6
+ var qiankunWindow = typeof window !== "undefined" ? window.proxy || window : {};
7
+ var renderWithQiankun = (qiankunLifeCycle) => {
8
+ if (qiankunWindow == null ? void 0 : qiankunWindow.__POWERED_BY_QIANKUN__) {
9
+ if (!window.moudleQiankunAppLifeCycles) {
10
+ window.moudleQiankunAppLifeCycles = {};
11
+ }
12
+ if (qiankunWindow.qiankunName) {
13
+ window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;
14
+ }
15
+ }
16
+ };
17
+ function isPoweredByMicro() {
18
+ return qiankunWindow.__POWERED_BY_QIANKUN__;
19
+ }
20
+ function useMicroAppLifecycle({ mount, unmount, update, bootstrap }) {
21
+ const mountMicroApp = async (props) => {
22
+ await (mount == null ? void 0 : mount(props));
23
+ };
24
+ const unmountMicroApp = async (props) => {
25
+ await (unmount == null ? void 0 : unmount(props));
26
+ };
27
+ const updateMicroApp = async (props) => {
28
+ await (update == null ? void 0 : update(props));
29
+ };
30
+ const bootstrapMicroApp = async () => {
31
+ await (bootstrap == null ? void 0 : bootstrap());
32
+ };
33
+ if (!isPoweredByMicro()) {
34
+ void mountMicroApp();
35
+ }
36
+ renderWithQiankun({
37
+ async bootstrap() {
38
+ await bootstrapMicroApp();
39
+ },
40
+ async mount(props) {
41
+ await mountMicroApp(props);
42
+ },
43
+ async unmount(props) {
44
+ await unmountMicroApp(props);
45
+ },
46
+ async update(props) {
47
+ await updateMicroApp(props);
48
+ }
49
+ });
50
+ }
51
+
5
52
  // src/setup.ts
6
53
  import { addGlobalUncaughtErrorHandler, registerMicroApps, start } from "qiankun";
7
54
  var MicroAppManager = class {
@@ -158,8 +205,12 @@ export {
158
205
  getMicroApps,
159
206
  hasMicroApps,
160
207
  hasValidEntry,
208
+ isPoweredByMicro,
161
209
  microAppManager,
210
+ qiankunWindow,
211
+ renderWithQiankun,
162
212
  setupMicroPluginApps,
163
- startMicroPluginApps
213
+ startMicroPluginApps,
214
+ useMicroAppLifecycle
164
215
  };
165
216
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * 微前端应用设置和启动模块\n * @module setup\n */\n\nimport type { FrameworkConfiguration } from 'qiankun'\nimport { addGlobalUncaughtErrorHandler, registerMicroApps, start } from 'qiankun'\nimport type { MicroAppDescriptor, MicroAppSetupOptions, MicroAppStartOptions } from './types'\n\n/**\n * 微前端管理器类\n * 负责管理微应用的注册、启动和生命周期\n */\nexport class MicroAppManager {\n /** 是否已注册微应用 */\n private hasRegistered = false\n\n /** 是否已启动微前端框架 */\n private hasStarted = false\n\n /** 微应用配置列表 */\n private apps: MicroAppDescriptor[] = []\n\n /** 启动配置选项 */\n private startOptions: MicroAppStartOptions = {}\n\n /** 自定义加载器函数 */\n private loader?: (loading: boolean) => void\n\n /** 自定义错误处理函数 */\n private onError?: (event: Event | string) => void\n\n /**\n * 检查是否有有效的微应用配置\n * @returns 是否存在有效的微应用\n */\n hasMicroApps(): boolean {\n return this.apps.length > 0\n }\n\n /**\n * 过滤出有效的微应用配置(必须有 entry)\n * @param apps 微应用配置列表\n * @returns 有效的微应用配置列表\n */\n private filterValidApps(apps: MicroAppDescriptor[]): MicroAppDescriptor[] {\n return apps.filter((app): app is MicroAppDescriptor & { entry: string } => {\n return typeof app.entry === 'string' && app.entry.length > 0\n })\n }\n\n /**\n * 设置微前端应用\n * @param options 设置选项\n */\n setup(options: MicroAppSetupOptions): void {\n if (this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用已经注册,跳过重复注册')\n return\n }\n\n // 过滤出有效的微应用配置\n this.apps = this.filterValidApps(options.apps)\n\n if (!this.hasMicroApps()) {\n console.warn('[x-micro-plugin] 没有有效的微应用配置,跳过注册')\n return\n }\n\n // 保存配置选项\n this.startOptions = options.startOptions || {}\n this.loader = options.loader\n this.onError = options.onError\n\n // 注册微应用\n this.registerMicroApps()\n\n // 设置全局错误处理\n this.setupErrorHandler()\n\n this.hasRegistered = true\n }\n\n /**\n * 注册微应用到 qiankun\n */\n private registerMicroApps(): void {\n registerMicroApps(\n this.apps.map(app => ({\n name: app.name,\n entry: app.entry!,\n container: `#${app.containerId}`,\n activeRule: app.activeRule,\n props: {\n ...app.props\n },\n loader: (loading: boolean) => {\n // 调用自定义加载器\n this.loader?.(loading)\n }\n }))\n )\n }\n\n /**\n * 设置全局错误处理\n */\n private setupErrorHandler(): void {\n addGlobalUncaughtErrorHandler((event: Event | string) => {\n // 调用自定义错误处理函数\n if (this.onError) {\n this.onError(event)\n } else {\n // 默认错误处理\n console.error('[x-micro-plugin] 微应用加载错误', event)\n // 尝试使用全局消息提示\n if (typeof window !== 'undefined' && (window as any).$message) {\n console.error('子应用加载失败,请稍后重试')\n }\n }\n })\n }\n\n /**\n * 启动微前端框架\n */\n start(): void {\n if (!this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用尚未注册,请先调用 setup() 方法')\n return\n }\n\n if (this.hasStarted) {\n console.warn('[x-micro-plugin] 微前端框架已经启动,跳过重复启动')\n return\n }\n\n const startOpts: FrameworkConfiguration = {\n prefetch: this.startOptions.prefetch !== false, // 默认启用预加载\n sandbox: {\n experimentalStyleIsolation: this.startOptions.sandbox?.experimentalStyleIsolation ?? true,\n strictStyleIsolation: this.startOptions.sandbox?.strictStyleIsolation ?? false,\n ...this.startOptions.sandbox\n },\n ...this.startOptions\n }\n\n start(startOpts)\n\n this.hasStarted = true\n }\n\n /**\n * 获取已注册的微应用配置列表\n * @returns 微应用配置列表的只读副本\n */\n getApps(): ReadonlyArray<MicroAppDescriptor> {\n return [...this.apps]\n }\n\n /**\n * 重置管理器状态(主要用于测试)\n */\n reset(): void {\n this.hasRegistered = false\n this.hasStarted = false\n this.apps = []\n this.startOptions = {}\n this.loader = undefined\n this.onError = undefined\n }\n}\n\n/**\n * 全局微前端管理器实例\n */\nexport const microAppManager = new MicroAppManager()\n\n/**\n * 设置微前端应用(便捷函数)\n * @param options 设置选项\n */\nexport function setupMicroPluginApps(options: MicroAppSetupOptions): void {\n microAppManager.setup(options)\n}\n\n/**\n * 启动微前端框架(便捷函数)\n */\nexport function startMicroPluginApps(): void {\n microAppManager.start()\n}\n\n/**\n * 检查是否有微应用(便捷函数)\n * @returns 是否存在微应用\n */\nexport function hasMicroApps(): boolean {\n return microAppManager.hasMicroApps()\n}\n\n/**\n * 获取微应用配置列表(便捷函数)\n * @returns 微应用配置列表\n */\nexport function getMicroApps(): ReadonlyArray<MicroAppDescriptor> {\n return microAppManager.getApps()\n}\n\n/**\n * 类型守卫:检查微应用是否有有效的入口地址\n * @param app 微应用描述符\n * @returns 是否为有效的微应用(有入口地址)\n */\nexport function hasValidEntry(app: MicroAppDescriptor): app is MicroAppDescriptor & { entry: string } {\n return typeof app.entry === 'string' && app.entry.length > 0\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/helper.ts","../src/setup.ts"],"sourcesContent":["import type { QiankunLifeCycle, QiankunProps, QiankunWindow, UseMicroAppOptions } from './types'\n\n// @ts-ignore\nexport const qiankunWindow: QiankunWindow = typeof window !== 'undefined' ? window.proxy || window : {}\n\nexport const renderWithQiankun = (qiankunLifeCycle: QiankunLifeCycle) => {\n // 函数只有一次执行机会,需要把生命周期赋值给全局\n if (qiankunWindow?.__POWERED_BY_QIANKUN__) {\n // @ts-ignore\n if (!window.moudleQiankunAppLifeCycles) {\n // @ts-ignore\n window.moudleQiankunAppLifeCycles = {}\n }\n // @ts-ignore\n if (qiankunWindow.qiankunName) {\n // @ts-ignore\n window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle\n }\n }\n}\n\n/**\n * Check if the app is running under Qiankun\n * @returns Whether the app is running under Qiankun\n */\nexport function isPoweredByMicro() {\n return qiankunWindow.__POWERED_BY_QIANKUN__\n}\n\n/**\n * Encapsulate Qiankun micro-frontend lifecycle wiring into a reusable hook\n */\nexport function useMicroAppLifecycle({ mount, unmount, update, bootstrap }: UseMicroAppOptions) {\n /** Mount logic for the micro app */\n const mountMicroApp = async (props?: QiankunProps) => {\n await mount?.(props)\n }\n\n /** Cleanup logic when Qiankun unmounts the micro app */\n const unmountMicroApp = async (props?: QiankunProps) => {\n await unmount?.(props)\n }\n\n /** Update logic for the micro app */\n const updateMicroApp = async (props?: QiankunProps) => {\n await update?.(props)\n }\n\n /** Bootstrap logic for the micro app */\n const bootstrapMicroApp = async () => {\n await bootstrap?.()\n }\n\n if (!isPoweredByMicro()) {\n void mountMicroApp()\n }\n\n renderWithQiankun({\n async bootstrap() {\n await bootstrapMicroApp()\n },\n async mount(props) {\n await mountMicroApp(props)\n },\n async unmount(props) {\n await unmountMicroApp(props)\n },\n async update(props) {\n await updateMicroApp(props)\n }\n })\n}\n","/**\n * 微前端应用设置和启动模块\n * @module setup\n */\n\nimport type { FrameworkConfiguration } from 'qiankun'\nimport { addGlobalUncaughtErrorHandler, registerMicroApps, start } from 'qiankun'\nimport type { MicroAppDescriptor, MicroAppSetupOptions, MicroAppStartOptions } from './types'\n\n/**\n * 微前端管理器类\n * 负责管理微应用的注册、启动和生命周期\n */\nexport class MicroAppManager {\n /** 是否已注册微应用 */\n private hasRegistered = false\n\n /** 是否已启动微前端框架 */\n private hasStarted = false\n\n /** 微应用配置列表 */\n private apps: MicroAppDescriptor[] = []\n\n /** 启动配置选项 */\n private startOptions: MicroAppStartOptions = {}\n\n /** 自定义加载器函数 */\n private loader?: (loading: boolean) => void\n\n /** 自定义错误处理函数 */\n private onError?: (event: Event | string) => void\n\n /**\n * 检查是否有有效的微应用配置\n * @returns 是否存在有效的微应用\n */\n hasMicroApps(): boolean {\n return this.apps.length > 0\n }\n\n /**\n * 过滤出有效的微应用配置(必须有 entry)\n * @param apps 微应用配置列表\n * @returns 有效的微应用配置列表\n */\n private filterValidApps(apps: MicroAppDescriptor[]): MicroAppDescriptor[] {\n return apps.filter((app): app is MicroAppDescriptor & { entry: string } => {\n return typeof app.entry === 'string' && app.entry.length > 0\n })\n }\n\n /**\n * 设置微前端应用\n * @param options 设置选项\n */\n setup(options: MicroAppSetupOptions): void {\n if (this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用已经注册,跳过重复注册')\n return\n }\n\n // 过滤出有效的微应用配置\n this.apps = this.filterValidApps(options.apps)\n\n if (!this.hasMicroApps()) {\n console.warn('[x-micro-plugin] 没有有效的微应用配置,跳过注册')\n return\n }\n\n // 保存配置选项\n this.startOptions = options.startOptions || {}\n this.loader = options.loader\n this.onError = options.onError\n\n // 注册微应用\n this.registerMicroApps()\n\n // 设置全局错误处理\n this.setupErrorHandler()\n\n this.hasRegistered = true\n }\n\n /**\n * 注册微应用到 qiankun\n */\n private registerMicroApps(): void {\n registerMicroApps(\n this.apps.map(app => ({\n name: app.name,\n entry: app.entry!,\n container: `#${app.containerId}`,\n activeRule: app.activeRule,\n props: {\n ...app.props\n },\n loader: (loading: boolean) => {\n // 调用自定义加载器\n this.loader?.(loading)\n }\n }))\n )\n }\n\n /**\n * 设置全局错误处理\n */\n private setupErrorHandler(): void {\n addGlobalUncaughtErrorHandler((event: Event | string) => {\n // 调用自定义错误处理函数\n if (this.onError) {\n this.onError(event)\n } else {\n // 默认错误处理\n console.error('[x-micro-plugin] 微应用加载错误', event)\n // 尝试使用全局消息提示\n if (typeof window !== 'undefined' && (window as any).$message) {\n console.error('子应用加载失败,请稍后重试')\n }\n }\n })\n }\n\n /**\n * 启动微前端框架\n */\n start(): void {\n if (!this.hasRegistered) {\n console.warn('[x-micro-plugin] 微应用尚未注册,请先调用 setup() 方法')\n return\n }\n\n if (this.hasStarted) {\n console.warn('[x-micro-plugin] 微前端框架已经启动,跳过重复启动')\n return\n }\n\n const startOpts: FrameworkConfiguration = {\n prefetch: this.startOptions.prefetch !== false, // 默认启用预加载\n sandbox: {\n experimentalStyleIsolation: this.startOptions.sandbox?.experimentalStyleIsolation ?? true,\n strictStyleIsolation: this.startOptions.sandbox?.strictStyleIsolation ?? false,\n ...this.startOptions.sandbox\n },\n ...this.startOptions\n }\n\n start(startOpts)\n\n this.hasStarted = true\n }\n\n /**\n * 获取已注册的微应用配置列表\n * @returns 微应用配置列表的只读副本\n */\n getApps(): ReadonlyArray<MicroAppDescriptor> {\n return [...this.apps]\n }\n\n /**\n * 重置管理器状态(主要用于测试)\n */\n reset(): void {\n this.hasRegistered = false\n this.hasStarted = false\n this.apps = []\n this.startOptions = {}\n this.loader = undefined\n this.onError = undefined\n }\n}\n\n/**\n * 全局微前端管理器实例\n */\nexport const microAppManager = new MicroAppManager()\n\n/**\n * 设置微前端应用(便捷函数)\n * @param options 设置选项\n */\nexport function setupMicroPluginApps(options: MicroAppSetupOptions): void {\n microAppManager.setup(options)\n}\n\n/**\n * 启动微前端框架(便捷函数)\n */\nexport function startMicroPluginApps(): void {\n microAppManager.start()\n}\n\n/**\n * 检查是否有微应用(便捷函数)\n * @returns 是否存在微应用\n */\nexport function hasMicroApps(): boolean {\n return microAppManager.hasMicroApps()\n}\n\n/**\n * 获取微应用配置列表(便捷函数)\n * @returns 微应用配置列表\n */\nexport function getMicroApps(): ReadonlyArray<MicroAppDescriptor> {\n return microAppManager.getApps()\n}\n\n/**\n * 类型守卫:检查微应用是否有有效的入口地址\n * @param app 微应用描述符\n * @returns 是否为有效的微应用(有入口地址)\n */\nexport function hasValidEntry(app: MicroAppDescriptor): app is MicroAppDescriptor & { entry: string } {\n return typeof app.entry === 'string' && app.entry.length > 0\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/plugin.ts
31
+ var plugin_exports = {};
32
+ __export(plugin_exports, {
33
+ setupMicroApp: () => setupMicroApp
34
+ });
35
+ module.exports = __toCommonJS(plugin_exports);
36
+ var import_cheerio = __toESM(require("cheerio"), 1);
37
+ var createQiankunHelper = (qiankunName) => `
38
+ const createDeffer = (hookName) => {
39
+ const d = new Promise((resolve, reject) => {
40
+ window.proxy && (window.proxy[\`vite\${hookName}\`] = resolve)
41
+ })
42
+ return props => d.then(fn => fn(props));
43
+ }
44
+ const bootstrap = createDeffer('bootstrap');
45
+ const mount = createDeffer('mount');
46
+ const unmount = createDeffer('unmount');
47
+ const update = createDeffer('update');
48
+
49
+ ;(global => {
50
+ global.qiankunName = '${qiankunName}';
51
+ global['${qiankunName}'] = {
52
+ bootstrap,
53
+ mount,
54
+ unmount,
55
+ update
56
+ };
57
+ })(window);
58
+ `;
59
+ var createImportFinallyResolve = (qiankunName) => {
60
+ return `
61
+ const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];
62
+ if (qiankunLifeCycle) {
63
+ window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));
64
+ window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));
65
+ window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());
66
+ window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));
67
+ }
68
+ `;
69
+ };
70
+ function setupMicroApp(qiankunName, microOption = { useDevMode: true }) {
71
+ let isProduction;
72
+ let base = "";
73
+ const module2DynamicImport = ($, scriptTag) => {
74
+ if (!scriptTag) {
75
+ return;
76
+ }
77
+ const script$ = $(scriptTag);
78
+ const moduleSrc = script$.attr("src");
79
+ let appendBase = "";
80
+ if (microOption.useDevMode && !isProduction) {
81
+ appendBase = "(window.proxy ? (window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + '..') : '') + ";
82
+ }
83
+ script$.removeAttr("src");
84
+ script$.removeAttr("type");
85
+ script$.html(`import(${appendBase}'${moduleSrc}')`);
86
+ return script$;
87
+ };
88
+ const plugin = {
89
+ name: "qiankun-html-transform",
90
+ configResolved(config) {
91
+ isProduction = config.command === "build" || config.isProduction;
92
+ base = config.base;
93
+ },
94
+ configureServer(server) {
95
+ return () => {
96
+ server.middlewares.use((req, res, next) => {
97
+ if (isProduction || !microOption.useDevMode) {
98
+ next();
99
+ return;
100
+ }
101
+ const end = res.end.bind(res);
102
+ res.end = (...args) => {
103
+ const [chunk, ...rest] = args;
104
+ let htmlStr = chunk;
105
+ if (typeof htmlStr === "string") {
106
+ const $ = import_cheerio.default.load(htmlStr);
107
+ module2DynamicImport($, $(`script[src=${base}@vite/client]`).get(0));
108
+ htmlStr = $.html();
109
+ }
110
+ end(htmlStr, ...rest);
111
+ };
112
+ next();
113
+ });
114
+ };
115
+ },
116
+ transformIndexHtml(html) {
117
+ const $ = import_cheerio.default.load(html);
118
+ const moduleTags = $('body script[type=module], head script[crossorigin=""]');
119
+ if (!moduleTags || !moduleTags.length) {
120
+ return;
121
+ }
122
+ const len = moduleTags.length;
123
+ moduleTags.each((i, moduleTag) => {
124
+ const script$ = module2DynamicImport($, moduleTag);
125
+ if (len - 1 === i) {
126
+ script$ == null ? void 0 : script$.html(`${script$.html()}.finally(() => {
127
+ ${createImportFinallyResolve(qiankunName)}
128
+ })`);
129
+ }
130
+ });
131
+ $("body").append(`<script>${createQiankunHelper(qiankunName)}</script>`);
132
+ const output = $.html();
133
+ return output;
134
+ }
135
+ };
136
+ return plugin;
137
+ }
138
+ // Annotate the CommonJS export names for ESM import in node:
139
+ 0 && (module.exports = {
140
+ setupMicroApp
141
+ });
142
+ //# sourceMappingURL=plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { CheerioAPI } from 'cheerio'\nimport cheerio from 'cheerio'\nimport type { Element } from 'domhandler'\nimport type { Plugin } from 'vite'\n\nconst createQiankunHelper = (qiankunName: string) => `\n const createDeffer = (hookName) => {\n const d = new Promise((resolve, reject) => {\n window.proxy && (window.proxy[\\`vite\\${hookName}\\`] = resolve)\n })\n return props => d.then(fn => fn(props));\n }\n const bootstrap = createDeffer('bootstrap');\n const mount = createDeffer('mount');\n const unmount = createDeffer('unmount');\n const update = createDeffer('update');\n\n ;(global => {\n global.qiankunName = '${qiankunName}';\n global['${qiankunName}'] = {\n bootstrap,\n mount,\n unmount,\n update\n };\n })(window);\n`\n\nconst createImportFinallyResolve = (qiankunName: string) => {\n return `\n const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];\n if (qiankunLifeCycle) {\n window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));\n window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));\n window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());\n window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));\n }\n `\n}\n\nexport interface MicroOption {\n useDevMode?: boolean\n}\n\nexport function setupMicroApp(qiankunName: string, microOption: MicroOption = { useDevMode: true }) {\n let isProduction: boolean\n let base = ''\n\n const module2DynamicImport = ($: CheerioAPI, scriptTag: Element | undefined) => {\n if (!scriptTag) {\n return\n }\n const script$ = $(scriptTag)\n const moduleSrc = script$.attr('src')\n let appendBase = ''\n if (microOption.useDevMode && !isProduction) {\n appendBase = \"(window.proxy ? (window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + '..') : '') + \"\n }\n script$.removeAttr('src')\n script$.removeAttr('type')\n script$.html(`import(${appendBase}'${moduleSrc}')`)\n return script$\n }\n\n const plugin: Plugin = {\n name: 'qiankun-html-transform',\n configResolved(config) {\n isProduction = config.command === 'build' || config.isProduction\n base = config.base\n },\n\n configureServer(server) {\n return () => {\n server.middlewares.use((req, res, next) => {\n if (isProduction || !microOption.useDevMode) {\n next()\n return\n }\n const end = res.end.bind(res)\n // @ts-ignore\n res.end = (...args: any[]) => {\n const [chunk, ...rest] = args\n let htmlStr = chunk\n if (typeof htmlStr === 'string') {\n const $ = cheerio.load(htmlStr)\n module2DynamicImport($, $(`script[src=${base}@vite/client]`).get(0))\n htmlStr = $.html()\n }\n end(htmlStr, ...rest)\n }\n next()\n })\n }\n },\n transformIndexHtml(html: string) {\n const $ = cheerio.load(html)\n const moduleTags = $('body script[type=module], head script[crossorigin=\"\"]')\n if (!moduleTags || !moduleTags.length) {\n return\n }\n const len = moduleTags.length\n moduleTags.each((i, moduleTag) => {\n const script$ = module2DynamicImport($, moduleTag)\n if (len - 1 === i) {\n script$?.html(`${script$.html()}.finally(() => {\n ${createImportFinallyResolve(qiankunName)}\n })`)\n }\n })\n\n $('body').append(`<script>${createQiankunHelper(qiankunName)}</script>`)\n const output = $.html()\n return output\n }\n }\n\n return plugin\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAoB;AAIpB,IAAM,sBAAsB,CAAC,gBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAazB,WAAW;AAAA,cACzB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzB,IAAM,6BAA6B,CAAC,gBAAwB;AAC1D,SAAO;AAAA,uGAC8F,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlH;AAMO,SAAS,cAAc,aAAqB,cAA2B,EAAE,YAAY,KAAK,GAAG;AAClG,MAAI;AACJ,MAAI,OAAO;AAEX,QAAM,uBAAuB,CAAC,GAAe,cAAmC;AAC9E,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,UAAM,UAAU,EAAE,SAAS;AAC3B,UAAM,YAAY,QAAQ,KAAK,KAAK;AACpC,QAAI,aAAa;AACjB,QAAI,YAAY,cAAc,CAAC,cAAc;AAC3C,mBAAa;AAAA,IACf;AACA,YAAQ,WAAW,KAAK;AACxB,YAAQ,WAAW,MAAM;AACzB,YAAQ,KAAK,UAAU,UAAU,IAAI,SAAS,IAAI;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,SAAiB;AAAA,IACrB,MAAM;AAAA,IACN,eAAe,QAAQ;AACrB,qBAAe,OAAO,YAAY,WAAW,OAAO;AACpD,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,gBAAgB,QAAQ;AACtB,aAAO,MAAM;AACX,eAAO,YAAY,IAAI,CAAC,KAAK,KAAK,SAAS;AACzC,cAAI,gBAAgB,CAAC,YAAY,YAAY;AAC3C,iBAAK;AACL;AAAA,UACF;AACA,gBAAM,MAAM,IAAI,IAAI,KAAK,GAAG;AAE5B,cAAI,MAAM,IAAI,SAAgB;AAC5B,kBAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,gBAAI,UAAU;AACd,gBAAI,OAAO,YAAY,UAAU;AAC/B,oBAAM,IAAI,eAAAA,QAAQ,KAAK,OAAO;AAC9B,mCAAqB,GAAG,EAAE,cAAc,IAAI,eAAe,EAAE,IAAI,CAAC,CAAC;AACnE,wBAAU,EAAE,KAAK;AAAA,YACnB;AACA,gBAAI,SAAS,GAAG,IAAI;AAAA,UACtB;AACA,eAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,mBAAmB,MAAc;AAC/B,YAAM,IAAI,eAAAA,QAAQ,KAAK,IAAI;AAC3B,YAAM,aAAa,EAAE,uDAAuD;AAC5E,UAAI,CAAC,cAAc,CAAC,WAAW,QAAQ;AACrC;AAAA,MACF;AACA,YAAM,MAAM,WAAW;AACvB,iBAAW,KAAK,CAAC,GAAG,cAAc;AAChC,cAAM,UAAU,qBAAqB,GAAG,SAAS;AACjD,YAAI,MAAM,MAAM,GAAG;AACjB,6CAAS,KAAK,GAAG,QAAQ,KAAK,CAAC;AAAA,cAC3B,2BAA2B,WAAW,CAAC;AAAA;AAAA,QAE7C;AAAA,MACF,CAAC;AAED,QAAE,MAAM,EAAE,OAAO,WAAW,oBAAoB,WAAW,CAAC,WAAW;AACvE,YAAM,SAAS,EAAE,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":["cheerio"]}
@@ -0,0 +1,8 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ interface MicroOption {
4
+ useDevMode?: boolean;
5
+ }
6
+ declare function setupMicroApp(qiankunName: string, microOption?: MicroOption): Plugin<any>;
7
+
8
+ export { type MicroOption, setupMicroApp };
@@ -0,0 +1,8 @@
1
+ import { Plugin } from 'vite';
2
+
3
+ interface MicroOption {
4
+ useDevMode?: boolean;
5
+ }
6
+ declare function setupMicroApp(qiankunName: string, microOption?: MicroOption): Plugin<any>;
7
+
8
+ export { type MicroOption, setupMicroApp };
@@ -0,0 +1,107 @@
1
+ // src/plugin.ts
2
+ import cheerio from "cheerio";
3
+ var createQiankunHelper = (qiankunName) => `
4
+ const createDeffer = (hookName) => {
5
+ const d = new Promise((resolve, reject) => {
6
+ window.proxy && (window.proxy[\`vite\${hookName}\`] = resolve)
7
+ })
8
+ return props => d.then(fn => fn(props));
9
+ }
10
+ const bootstrap = createDeffer('bootstrap');
11
+ const mount = createDeffer('mount');
12
+ const unmount = createDeffer('unmount');
13
+ const update = createDeffer('update');
14
+
15
+ ;(global => {
16
+ global.qiankunName = '${qiankunName}';
17
+ global['${qiankunName}'] = {
18
+ bootstrap,
19
+ mount,
20
+ unmount,
21
+ update
22
+ };
23
+ })(window);
24
+ `;
25
+ var createImportFinallyResolve = (qiankunName) => {
26
+ return `
27
+ const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];
28
+ if (qiankunLifeCycle) {
29
+ window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));
30
+ window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));
31
+ window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());
32
+ window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));
33
+ }
34
+ `;
35
+ };
36
+ function setupMicroApp(qiankunName, microOption = { useDevMode: true }) {
37
+ let isProduction;
38
+ let base = "";
39
+ const module2DynamicImport = ($, scriptTag) => {
40
+ if (!scriptTag) {
41
+ return;
42
+ }
43
+ const script$ = $(scriptTag);
44
+ const moduleSrc = script$.attr("src");
45
+ let appendBase = "";
46
+ if (microOption.useDevMode && !isProduction) {
47
+ appendBase = "(window.proxy ? (window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + '..') : '') + ";
48
+ }
49
+ script$.removeAttr("src");
50
+ script$.removeAttr("type");
51
+ script$.html(`import(${appendBase}'${moduleSrc}')`);
52
+ return script$;
53
+ };
54
+ const plugin = {
55
+ name: "qiankun-html-transform",
56
+ configResolved(config) {
57
+ isProduction = config.command === "build" || config.isProduction;
58
+ base = config.base;
59
+ },
60
+ configureServer(server) {
61
+ return () => {
62
+ server.middlewares.use((req, res, next) => {
63
+ if (isProduction || !microOption.useDevMode) {
64
+ next();
65
+ return;
66
+ }
67
+ const end = res.end.bind(res);
68
+ res.end = (...args) => {
69
+ const [chunk, ...rest] = args;
70
+ let htmlStr = chunk;
71
+ if (typeof htmlStr === "string") {
72
+ const $ = cheerio.load(htmlStr);
73
+ module2DynamicImport($, $(`script[src=${base}@vite/client]`).get(0));
74
+ htmlStr = $.html();
75
+ }
76
+ end(htmlStr, ...rest);
77
+ };
78
+ next();
79
+ });
80
+ };
81
+ },
82
+ transformIndexHtml(html) {
83
+ const $ = cheerio.load(html);
84
+ const moduleTags = $('body script[type=module], head script[crossorigin=""]');
85
+ if (!moduleTags || !moduleTags.length) {
86
+ return;
87
+ }
88
+ const len = moduleTags.length;
89
+ moduleTags.each((i, moduleTag) => {
90
+ const script$ = module2DynamicImport($, moduleTag);
91
+ if (len - 1 === i) {
92
+ script$ == null ? void 0 : script$.html(`${script$.html()}.finally(() => {
93
+ ${createImportFinallyResolve(qiankunName)}
94
+ })`);
95
+ }
96
+ });
97
+ $("body").append(`<script>${createQiankunHelper(qiankunName)}</script>`);
98
+ const output = $.html();
99
+ return output;
100
+ }
101
+ };
102
+ return plugin;
103
+ }
104
+ export {
105
+ setupMicroApp
106
+ };
107
+ //# sourceMappingURL=plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { CheerioAPI } from 'cheerio'\nimport cheerio from 'cheerio'\nimport type { Element } from 'domhandler'\nimport type { Plugin } from 'vite'\n\nconst createQiankunHelper = (qiankunName: string) => `\n const createDeffer = (hookName) => {\n const d = new Promise((resolve, reject) => {\n window.proxy && (window.proxy[\\`vite\\${hookName}\\`] = resolve)\n })\n return props => d.then(fn => fn(props));\n }\n const bootstrap = createDeffer('bootstrap');\n const mount = createDeffer('mount');\n const unmount = createDeffer('unmount');\n const update = createDeffer('update');\n\n ;(global => {\n global.qiankunName = '${qiankunName}';\n global['${qiankunName}'] = {\n bootstrap,\n mount,\n unmount,\n update\n };\n })(window);\n`\n\nconst createImportFinallyResolve = (qiankunName: string) => {\n return `\n const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];\n if (qiankunLifeCycle) {\n window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));\n window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));\n window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());\n window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));\n }\n `\n}\n\nexport interface MicroOption {\n useDevMode?: boolean\n}\n\nexport function setupMicroApp(qiankunName: string, microOption: MicroOption = { useDevMode: true }) {\n let isProduction: boolean\n let base = ''\n\n const module2DynamicImport = ($: CheerioAPI, scriptTag: Element | undefined) => {\n if (!scriptTag) {\n return\n }\n const script$ = $(scriptTag)\n const moduleSrc = script$.attr('src')\n let appendBase = ''\n if (microOption.useDevMode && !isProduction) {\n appendBase = \"(window.proxy ? (window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ + '..') : '') + \"\n }\n script$.removeAttr('src')\n script$.removeAttr('type')\n script$.html(`import(${appendBase}'${moduleSrc}')`)\n return script$\n }\n\n const plugin: Plugin = {\n name: 'qiankun-html-transform',\n configResolved(config) {\n isProduction = config.command === 'build' || config.isProduction\n base = config.base\n },\n\n configureServer(server) {\n return () => {\n server.middlewares.use((req, res, next) => {\n if (isProduction || !microOption.useDevMode) {\n next()\n return\n }\n const end = res.end.bind(res)\n // @ts-ignore\n res.end = (...args: any[]) => {\n const [chunk, ...rest] = args\n let htmlStr = chunk\n if (typeof htmlStr === 'string') {\n const $ = cheerio.load(htmlStr)\n module2DynamicImport($, $(`script[src=${base}@vite/client]`).get(0))\n htmlStr = $.html()\n }\n end(htmlStr, ...rest)\n }\n next()\n })\n }\n },\n transformIndexHtml(html: string) {\n const $ = cheerio.load(html)\n const moduleTags = $('body script[type=module], head script[crossorigin=\"\"]')\n if (!moduleTags || !moduleTags.length) {\n return\n }\n const len = moduleTags.length\n moduleTags.each((i, moduleTag) => {\n const script$ = module2DynamicImport($, moduleTag)\n if (len - 1 === i) {\n script$?.html(`${script$.html()}.finally(() => {\n ${createImportFinallyResolve(qiankunName)}\n })`)\n }\n })\n\n $('body').append(`<script>${createQiankunHelper(qiankunName)}</script>`)\n const output = $.html()\n return output\n }\n }\n\n return plugin\n}\n"],"mappings":";AACA,OAAO,aAAa;AAIpB,IAAM,sBAAsB,CAAC,gBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAazB,WAAW;AAAA,cACzB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzB,IAAM,6BAA6B,CAAC,gBAAwB;AAC1D,SAAO;AAAA,uGAC8F,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQlH;AAMO,SAAS,cAAc,aAAqB,cAA2B,EAAE,YAAY,KAAK,GAAG;AAClG,MAAI;AACJ,MAAI,OAAO;AAEX,QAAM,uBAAuB,CAAC,GAAe,cAAmC;AAC9E,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,UAAM,UAAU,EAAE,SAAS;AAC3B,UAAM,YAAY,QAAQ,KAAK,KAAK;AACpC,QAAI,aAAa;AACjB,QAAI,YAAY,cAAc,CAAC,cAAc;AAC3C,mBAAa;AAAA,IACf;AACA,YAAQ,WAAW,KAAK;AACxB,YAAQ,WAAW,MAAM;AACzB,YAAQ,KAAK,UAAU,UAAU,IAAI,SAAS,IAAI;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,SAAiB;AAAA,IACrB,MAAM;AAAA,IACN,eAAe,QAAQ;AACrB,qBAAe,OAAO,YAAY,WAAW,OAAO;AACpD,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,gBAAgB,QAAQ;AACtB,aAAO,MAAM;AACX,eAAO,YAAY,IAAI,CAAC,KAAK,KAAK,SAAS;AACzC,cAAI,gBAAgB,CAAC,YAAY,YAAY;AAC3C,iBAAK;AACL;AAAA,UACF;AACA,gBAAM,MAAM,IAAI,IAAI,KAAK,GAAG;AAE5B,cAAI,MAAM,IAAI,SAAgB;AAC5B,kBAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,gBAAI,UAAU;AACd,gBAAI,OAAO,YAAY,UAAU;AAC/B,oBAAM,IAAI,QAAQ,KAAK,OAAO;AAC9B,mCAAqB,GAAG,EAAE,cAAc,IAAI,eAAe,EAAE,IAAI,CAAC,CAAC;AACnE,wBAAU,EAAE,KAAK;AAAA,YACnB;AACA,gBAAI,SAAS,GAAG,IAAI;AAAA,UACtB;AACA,eAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,mBAAmB,MAAc;AAC/B,YAAM,IAAI,QAAQ,KAAK,IAAI;AAC3B,YAAM,aAAa,EAAE,uDAAuD;AAC5E,UAAI,CAAC,cAAc,CAAC,WAAW,QAAQ;AACrC;AAAA,MACF;AACA,YAAM,MAAM,WAAW;AACvB,iBAAW,KAAK,CAAC,GAAG,cAAc;AAChC,cAAM,UAAU,qBAAqB,GAAG,SAAS;AACjD,YAAI,MAAM,MAAM,GAAG;AACjB,6CAAS,KAAK,GAAG,QAAQ,KAAK,CAAC;AAAA,cAC3B,2BAA2B,WAAW,CAAC;AAAA;AAAA,QAE7C;AAAA,MACF,CAAC;AAED,QAAE,MAAM,EAAE,OAAO,WAAW,oBAAoB,WAAW,CAAC,WAAW;AACvE,YAAM,SAAS,EAAE,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maxax/x-plugins-micro",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Reusable micro-frontend plugin based on qiankun for Maxax projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -11,6 +11,11 @@
11
11
  "types": "./dist/index.d.ts",
12
12
  "import": "./dist/index.mjs",
13
13
  "require": "./dist/index.cjs"
14
+ },
15
+ "./plugin": {
16
+ "types": "./dist/plugin.d.ts",
17
+ "import": "./dist/plugin.mjs",
18
+ "require": "./dist/plugin.cjs"
14
19
  }
15
20
  },
16
21
  "files": [
@@ -33,6 +38,9 @@
33
38
  "publishConfig": {
34
39
  "access": "public"
35
40
  },
41
+ "dependencies": {
42
+ "cheerio": "^1.1.2"
43
+ },
36
44
  "scripts": {
37
45
  "bump-version": "maxax bump-version",
38
46
  "dev": "tsup --watch",