@tiny-codes/vite-plugin-qiankun 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @tiny-codes/vite-plugin-qiankun
2
2
 
3
+ ## v2.0.2
4
+
5
+ 2024-4-3
6
+
7
+ ### Features
8
+
9
+ - Enhance module preloading to support cross-origin.
10
+ - Add `qiankun:loaded` event to notify when micro app is fully loaded.
11
+ - Add `qiankun:fetchEntryError` event to notify when fetching the entry script fails.
12
+ - Add `qiankun:runtimeError` event to notify when a runtime error occurs.
13
+
3
14
  ## v2.0.1
4
15
 
5
16
  2024-4-2
package/es/helper.d.ts CHANGED
@@ -3,15 +3,16 @@ export interface QiankunProps {
3
3
  [x: string]: unknown;
4
4
  }
5
5
  export interface QiankunLifeCycle {
6
- bootstrap: (props?: QiankunProps) => void | Promise<void>;
7
- mount: (props: QiankunProps) => void | Promise<void>;
8
- unmount: (props: QiankunProps) => void | Promise<void>;
9
- update: (props: QiankunProps) => void | Promise<void>;
6
+ bootstrap?: (props?: QiankunProps) => void | Promise<void>;
7
+ mount?: (props: QiankunProps) => void | Promise<void>;
8
+ unmount?: (props: QiankunProps) => void | Promise<void>;
9
+ update?: (props: QiankunProps) => void | Promise<void>;
10
10
  }
11
11
  export interface QiankunWindow {
12
12
  __POWERED_BY_QIANKUN__?: boolean;
13
+ __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string;
14
+ qiankunLifeCycles?: QiankunLifeCycle;
13
15
  [x: string]: any;
14
16
  }
15
17
  export declare const qiankunWindow: QiankunWindow;
16
- export declare const renderWithQiankun: (qiankunLifeCycle: QiankunLifeCycle) => void;
17
- export default renderWithQiankun;
18
+ export declare const exportQiankunLifeCycles: (qiankunLifeCycle: QiankunLifeCycle) => void;
package/es/helper.js CHANGED
@@ -1,14 +1,9 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1
2
  export var qiankunWindow = typeof window !== 'undefined' ? window.proxy || window : {};
2
- export var renderWithQiankun = function renderWithQiankun(qiankunLifeCycle) {
3
- // 函数只有一次执行机会,需要把生命周期赋值给全局
3
+ export var exportQiankunLifeCycles = function exportQiankunLifeCycles(qiankunLifeCycle) {
4
+ // The function has only one chance to execute, and the lifecycle needs to be assigned to the global scope.
4
5
  if (qiankunWindow !== null && qiankunWindow !== void 0 && qiankunWindow.__POWERED_BY_QIANKUN__) {
5
- if (!window.moudleQiankunAppLifeCycles) {
6
- window.moudleQiankunAppLifeCycles = {};
7
- }
8
- if (qiankunWindow.qiankunName) {
9
- window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;
10
- }
6
+ qiankunWindow.qiankunLifeCycles = qiankunLifeCycle;
11
7
  }
12
8
  };
13
- export default renderWithQiankun;
14
9
  //# sourceMappingURL=helper.js.map
package/es/helper.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["qiankunWindow","window","proxy","renderWithQiankun","qiankunLifeCycle","__POWERED_BY_QIANKUN__","moudleQiankunAppLifeCycles","qiankunName"],"sources":["../src/helper.ts"],"sourcesContent":["export interface QiankunProps {\n container?: HTMLElement;\n [x: string]: unknown;\n}\n\nexport interface QiankunLifeCycle {\n bootstrap: (props?: QiankunProps) => void | Promise<void>;\n mount: (props: QiankunProps) => void | Promise<void>;\n unmount: (props: QiankunProps) => void | Promise<void>;\n update: (props: QiankunProps) => void | Promise<void>;\n}\n\nexport interface QiankunWindow {\n __POWERED_BY_QIANKUN__?: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [x: string]: any;\n}\n\nexport const qiankunWindow: QiankunWindow = typeof window !== 'undefined' ? window.proxy || window : {};\n\nexport const renderWithQiankun = (qiankunLifeCycle: QiankunLifeCycle) => {\n // 函数只有一次执行机会,需要把生命周期赋值给全局\n if (qiankunWindow?.__POWERED_BY_QIANKUN__) {\n if (!window.moudleQiankunAppLifeCycles) {\n window.moudleQiankunAppLifeCycles = {};\n }\n if (qiankunWindow.qiankunName) {\n window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;\n }\n }\n};\n\nexport default renderWithQiankun;\n"],"mappings":"AAkBA,OAAO,IAAMA,aAA4B,GAAG,OAAOC,MAAM,KAAK,WAAW,GAAGA,MAAM,CAACC,KAAK,IAAID,MAAM,GAAG,CAAC,CAAC;AAEvG,OAAO,IAAME,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAIC,gBAAkC,EAAK;EACvE;EACA,IAAIJ,aAAa,aAAbA,aAAa,eAAbA,aAAa,CAAEK,sBAAsB,EAAE;IACzC,IAAI,CAACJ,MAAM,CAACK,0BAA0B,EAAE;MACtCL,MAAM,CAACK,0BAA0B,GAAG,CAAC,CAAC;IACxC;IACA,IAAIN,aAAa,CAACO,WAAW,EAAE;MAC7BN,MAAM,CAACK,0BAA0B,CAACN,aAAa,CAACO,WAAW,CAAC,GAAGH,gBAAgB;IACjF;EACF;AACF,CAAC;AAED,eAAeD,iBAAiB"}
1
+ {"version":3,"names":["qiankunWindow","window","proxy","exportQiankunLifeCycles","qiankunLifeCycle","__POWERED_BY_QIANKUN__","qiankunLifeCycles"],"sources":["../src/helper.ts"],"sourcesContent":["export interface QiankunProps {\n container?: HTMLElement;\n [x: string]: unknown;\n}\n\nexport interface QiankunLifeCycle {\n bootstrap?: (props?: QiankunProps) => void | Promise<void>;\n mount?: (props: QiankunProps) => void | Promise<void>;\n unmount?: (props: QiankunProps) => void | Promise<void>;\n update?: (props: QiankunProps) => void | Promise<void>;\n}\n\nexport interface QiankunWindow {\n __POWERED_BY_QIANKUN__?: boolean;\n __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string;\n qiankunLifeCycles?: QiankunLifeCycle;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [x: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const qiankunWindow: QiankunWindow = typeof window !== 'undefined' ? (window as any).proxy || window : {};\n\nexport const exportQiankunLifeCycles = (qiankunLifeCycle: QiankunLifeCycle) => {\n // The function has only one chance to execute, and the lifecycle needs to be assigned to the global scope.\n if (qiankunWindow?.__POWERED_BY_QIANKUN__) {\n qiankunWindow.qiankunLifeCycles = qiankunLifeCycle;\n }\n};\n"],"mappings":"AAoBA;AACA,OAAO,IAAMA,aAA4B,GAAG,OAAOC,MAAM,KAAK,WAAW,GAAIA,MAAM,CAASC,KAAK,IAAID,MAAM,GAAG,CAAC,CAAC;AAEhH,OAAO,IAAME,uBAAuB,GAAG,SAA1BA,uBAAuBA,CAAIC,gBAAkC,EAAK;EAC7E;EACA,IAAIJ,aAAa,aAAbA,aAAa,eAAbA,aAAa,CAAEK,sBAAsB,EAAE;IACzCL,aAAa,CAACM,iBAAiB,GAAGF,gBAAgB;EACpD;AACF,CAAC"}
package/es/index.js CHANGED
@@ -27,19 +27,37 @@ var qiankunPlugin = function qiankunPlugin(appName) {
27
27
  var entryScript = (_$$get = $('script[entry]').get(0)) !== null && _$$get !== void 0 ? _$$get : $('body script[type=module], head script[crossorigin=""]').get(0);
28
28
  if (entryScript) {
29
29
  var _script$$html, _context$server;
30
+ var url = entryScript.attribs.src;
30
31
  var scriptBaseIndent = detectIndent(html, entryScript);
31
32
  var S0 = scriptBaseIndent;
32
33
  var S1 = scriptBaseIndent + space(2);
33
- var S2 = S1 + space(2);
34
34
  var script$ = module2DynamicImport({
35
35
  $: $,
36
36
  scriptTag: entryScript,
37
37
  changeScriptOrigin: changeScriptOrigin,
38
38
  ident: S1
39
39
  });
40
- script$ === null || script$ === void 0 || script$.html("".concat((_script$$html = script$.html()) === null || _script$$html === void 0 ? void 0 : _script$$html.trimEnd(), ".finally(() => {\n").concat(S2).concat(createImportFinallyResolve(appName, {
41
- indent: S2
42
- }).trim(), "\n").concat(S1, "});\n").concat(S0));
40
+ script$ === null || script$ === void 0 || script$.html("".concat((_script$$html = script$.html()) === null || _script$$html === void 0 ? void 0 : _script$$html.trimEnd(), ".then(() => {\n").concat(S1, " if (window.proxy) {\n").concat(S1, " const qiankunLifeCycle = window.proxy.qiankunLifeCycles;\n").concat(S1, " if (qiankunLifeCycle) {\n").concat(S1, " window.proxy.vpq_bootstrap((props) => qiankunLifeCycle.bootstrap && qiankunLifeCycle.bootstrap(props));\n").concat(S1, " window.proxy.vpq_mount((props) => qiankunLifeCycle.mount && qiankunLifeCycle.mount(props));\n").concat(S1, " window.proxy.vpq_unmount((props) => qiankunLifeCycle.unmount && qiankunLifeCycle.unmount(props));\n").concat(S1, " window.proxy.vpq_update((props) => qiankunLifeCycle.update && qiankunLifeCycle.update(props));\n").concat(S1, " window.dispatchEvent(new CustomEvent('qiankun:loaded'));\n").concat(S1, " }\n").concat(S1, " }\n").concat(S1, "}).catch((error) => {\n").concat(S1, " console.error(error);\n").concat(S1, " if (error.name === 'TypeError' && error.message && error.message.startsWith('Failed to fetch dynamically imported module:')) {\n").concat(S1, " window.dispatchEvent(new CustomEvent('qiankun:fetchEntryError', { detail: { url: '").concat(url, "', error } }));\n").concat(S1, " } else {\n").concat(S1, " window.dispatchEvent(new CustomEvent('qiankun:runtimeError', { detail: { error } }));\n").concat(S1, " }\n").concat(S1, "});\n").concat(S0));
41
+
42
+ // Transform modulepreload links
43
+ var preloadLinks = $('link[rel="modulepreload"]');
44
+ if (preloadLinks.length) {
45
+ var urls = preloadLinks.map(function (_, link) {
46
+ return $(link).attr('href');
47
+ }).get();
48
+ var P1 = detectIndent(html, preloadLinks.get(0));
49
+ preloadLinks.last().after("\n".concat(P1, "<script>\n").concat(P1, " const preloadUrls = [\n").concat(urls.map(function (url) {
50
+ return "".concat(P1, " ").concat(normalizeUrl(url, {
51
+ changeScriptOrigin: changeScriptOrigin
52
+ }));
53
+ }).join(',\n'), "\n").concat(P1, " ];\n").concat(P1, " preloadUrls.forEach((url) => {\n").concat(P1, " const link = document.createElement('link');\n").concat(P1, " link.rel = 'modulepreload';\n").concat(P1, " link.href = url;\n").concat(P1, " link.crossOrigin = 'anonymous';\n").concat(P1, " document.head.appendChild(link);\n").concat(P1, " });\n").concat(P1, "</script>"));
54
+ var texts = preloadLinks.map(function (_, link) {
55
+ var _link$next;
56
+ return ((_link$next = link.next) === null || _link$next === void 0 ? void 0 : _link$next.type) === 'text' ? link.next : null;
57
+ });
58
+ texts.remove();
59
+ preloadLinks.remove();
60
+ }
43
61
 
44
62
  // Transform @react-refresh script
45
63
  if (((_context$server = context.server) === null || _context$server === void 0 ? void 0 : _context$server.config.command) === 'serve') {
@@ -52,16 +70,17 @@ var qiankunPlugin = function qiankunPlugin(appName) {
52
70
  var refreshScript$ = $(refreshScript);
53
71
  var R1 = detectIndent(html, refreshScript) + space(2);
54
72
  var content = refreshScript$.html();
55
- var regExp = /import\s*{\s*injectIntoGlobalHook\s*}\s*from\s*"([^"]*@react-refresh)";/m;
73
+ var regExp = /import\s*{([^}]*)}\s*from\s*"([^"]*@react-refresh)";/m;
56
74
  var match = content === null || content === void 0 ? void 0 : content.match(regExp);
57
75
  if (content && match) {
58
76
  var sentence = match[0];
59
- var from = match[1];
77
+ var imports = match[1];
78
+ var from = match[2];
60
79
  var rest = content.replace(sentence, '');
61
80
  refreshScript$.removeAttr('type');
62
81
  refreshScript$.html("\n".concat(R1, "import(").concat(normalizeUrl(from, {
63
82
  changeScriptOrigin: changeScriptOrigin
64
- }), ").then(({ injectIntoGlobalHook }) => {\n").concat(R1, " ").concat(rest.split('\n').map(function (s) {
83
+ }), ").then(({").concat(imports, "}) => {\n").concat(R1, " ").concat(rest.split('\n').map(function (s) {
65
84
  return s.trim();
66
85
  }).filter(Boolean).join("\n".concat(R1, " ")), "\n").concat(R1, "});"));
67
86
  }
@@ -72,7 +91,7 @@ var qiankunPlugin = function qiankunPlugin(appName) {
72
91
  var bodyBaseIndent = detectIndent(html, $('body').get(0));
73
92
  var B1 = bodyBaseIndent + space(2);
74
93
  var B2 = B1 + space(2);
75
- $('body').append("\n".concat(B1, "<script>\n").concat(B2).concat(createQiankunHelper(appName, {
94
+ $('body').append("\n".concat(B1, "<script>\n").concat(B2).concat(exportLifeCycles(appName, {
76
95
  indent: B2
77
96
  }), "\n").concat(B1, "</script>\n"));
78
97
  var output = $.html();
@@ -129,17 +148,11 @@ function module2DynamicImport(options) {
129
148
  }), ")"));
130
149
  return script$;
131
150
  }
132
- function createImportFinallyResolve(qiankunName, options) {
151
+ function exportLifeCycles(qiankunName, options) {
133
152
  var _ref = options !== null && options !== void 0 ? options : {},
134
153
  _ref$indent = _ref.indent,
135
154
  space = _ref$indent === void 0 ? ' ' : _ref$indent;
136
- return "\n".concat(space, "const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['").concat(qiankunName, "'];\n").concat(space, "if (qiankunLifeCycle) {\n").concat(space, " window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));\n").concat(space, " window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));\n").concat(space, " window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());\n").concat(space, " window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));\n").concat(space, "}\n");
137
- }
138
- function createQiankunHelper(qiankunName, options) {
139
- var _ref2 = options !== null && options !== void 0 ? options : {},
140
- _ref2$indent = _ref2.indent,
141
- space = _ref2$indent === void 0 ? ' ' : _ref2$indent;
142
- return "\n".concat(space, "const createDeffer = (hookName) => {\n").concat(space, " const d = new Promise((resolve, reject) => {\n").concat(space, " window.proxy && (window.proxy[`vite${hookName}`] = resolve)\n").concat(space, " })\n").concat(space, " return props => d.then(fn => fn(props));\n").concat(space, "};\n").concat(space, "const bootstrap = createDeffer('bootstrap');\n").concat(space, "const mount = createDeffer('mount');\n").concat(space, "const unmount = createDeffer('unmount');\n").concat(space, "const update = createDeffer('update');\n\n").concat(space, "(global => {\n").concat(space, " global.qiankunName = '").concat(qiankunName, "';\n").concat(space, " global['").concat(qiankunName, "'] = {\n").concat(space, " bootstrap,\n").concat(space, " mount,\n").concat(space, " unmount,\n").concat(space, " update\n").concat(space, " };\n").concat(space, "})(window);").trimStart();
155
+ return "\n".concat(space, "const makeLifeCycle = (hookName) => {\n").concat(space, " const promise = new Promise((resolve, reject) => {\n").concat(space, " if (window.proxy) {\n").concat(space, " window.proxy[`vpq_${hookName}`] = resolve;\n").concat(space, " }\n").concat(space, " })\n").concat(space, " return (props) => promise.then(fn => fn(props));\n").concat(space, "};\n").concat(space, "window['").concat(qiankunName, "'] = {\n").concat(space, " bootstrap: makeLifeCycle('bootstrap'),\n").concat(space, " mount: makeLifeCycle('mount'),\n").concat(space, " unmount: makeLifeCycle('unmount'),\n").concat(space, " update: makeLifeCycle('update')\n").concat(space, "};").trimStart();
143
156
  }
144
157
  export default qiankunPlugin;
145
158
  //# sourceMappingURL=index.js.map
package/es/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["load","detectIndent","normalizeUrl","space","qiankunPlugin","appName","pluginOptions","arguments","length","undefined","_pluginOptions$change","changeScriptOrigin","name","transformIndexHtml","html","context","_$$get","$","sourceCodeLocationInfo","entryScript","get","_script$$html","_context$server","scriptBaseIndent","S0","S1","S2","script$","module2DynamicImport","scriptTag","ident","concat","trimEnd","createImportFinallyResolve","indent","trim","server","config","command","scripts","toArray","refreshScript","find","s","_$$html","test","refreshScript$","R1","content","regExp","match","sentence","from","rest","replace","removeAttr","split","map","filter","Boolean","join","bodyBaseIndent","B1","B2","append","createQiankunHelper","output","console","warn","configureServer","base","middlewares","use","req","res","next","end","bind","chunk","_len","Array","_key","apply","options","_options$ident","moduleSrc","attr","qiankunName","_ref","_ref$indent","_ref2","_ref2$indent","trimStart"],"sources":["../src/index.ts"],"sourcesContent":["import type { CheerioAPI } from 'cheerio';\nimport { load } from 'cheerio';\nimport type { Element } from 'domhandler';\nimport type { PluginOption } from 'vite';\nimport { detectIndent, normalizeUrl, space } from './utils';\n\nexport * from './helper';\n\nexport interface MicroOption {\n /**\n * Whether to change the origin of entry script tag for micro frontend. It's useful when the micro\n * frontend is deployed on a different domain or path.\n *\n * > If the origin by the qiankun's default algorithm is not correct for you, please try the\n * > [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @default true\n */\n changeScriptOrigin?: boolean;\n}\ntype PluginFn = (appName: string, pluginOptions?: MicroOption) => PluginOption;\n\n/**\n * Vite plugin for integrating with Qiankun micro frontend.\n *\n * @param appName The name of the Qiankun sub app.\n * @param pluginOptions Options for configuring the micro frontend behavior.\n *\n * > If the micro app is deployed on a different domain or path, you may need to adjust the public\n * > path. Please have a look at the [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @returns A Vite plugin option object.\n */\nconst qiankunPlugin: PluginFn = (appName, pluginOptions = {}) => {\n const { changeScriptOrigin = true } = pluginOptions;\n\n return {\n name: 'vite-plugin-qiankun',\n\n transformIndexHtml(html: string, context) {\n const $ = load(html, { sourceCodeLocationInfo: true });\n // Transform entry script\n const entryScript =\n $('script[entry]').get(0) ?? $('body script[type=module], head script[crossorigin=\"\"]').get(0);\n if (entryScript) {\n const scriptBaseIndent = detectIndent(html, entryScript);\n const S0 = scriptBaseIndent;\n const S1 = scriptBaseIndent + space(2);\n const S2 = S1 + space(2);\n const script$ = module2DynamicImport({\n $,\n scriptTag: entryScript,\n changeScriptOrigin,\n ident: S1,\n });\n script$?.html(`${script$.html()?.trimEnd()}.finally(() => {\n${S2}${createImportFinallyResolve(appName, { indent: S2 }).trim()}\n${S1}});\n${S0}`);\n\n // Transform @react-refresh script\n if (context.server?.config.command === 'serve') {\n const scripts = $('head script[type=module]').toArray();\n const refreshScript = scripts.find((s) => /@react-refresh\";$/m.test($(s).html() ?? ''));\n if (refreshScript) {\n const refreshScript$ = $(refreshScript);\n const R1 = detectIndent(html, refreshScript) + space(2);\n const content = refreshScript$.html();\n const regExp = /import\\s*{\\s*injectIntoGlobalHook\\s*}\\s*from\\s*\"([^\"]*@react-refresh)\";/m;\n const match = content?.match(regExp);\n if (content && match) {\n const sentence = match[0];\n const from = match[1];\n const rest = content.replace(sentence, '');\n refreshScript$.removeAttr('type');\n refreshScript$.html(`\n${R1}import(${normalizeUrl(from, { changeScriptOrigin })}).then(({ injectIntoGlobalHook }) => {\n${R1} ${rest\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean)\n .join(`\\n${R1} `)}\n${R1}});`);\n }\n }\n }\n\n // Add extra script to export lifecycles\n const bodyBaseIndent = detectIndent(html, $('body').get(0));\n const B1 = bodyBaseIndent + space(2);\n const B2 = B1 + space(2);\n $('body').append(`\n${B1}<script>\n${B2}${createQiankunHelper(appName, { indent: B2 })}\n${B1}</script>\n`);\n const output = $.html();\n return output;\n } else {\n console.warn('\\x1b[33m%s\\x1b[0m', '⚠️ Patch for qiankun failed, because the entry script was not found.');\n return html;\n }\n },\n configureServer(server) {\n const base = server.config.base;\n return () => {\n // Only apply to / i.e. the mount point of the app\n server.middlewares.use((req, res, next) => {\n const end = res.end.bind(res);\n res.end = function (this: typeof res, chunk: unknown, ...rest: any[]) {\n if (typeof chunk === 'string') {\n const $ = load(chunk);\n module2DynamicImport({ $, scriptTag: $(`script[src=\"${base}@vite/client\"]`).get(0), changeScriptOrigin });\n chunk = $.html();\n }\n end(chunk, ...rest);\n return this;\n } as unknown as typeof res.end;\n next();\n });\n };\n },\n };\n};\n\nfunction module2DynamicImport(\n options: { $: CheerioAPI; scriptTag: Element | undefined; ident?: string } & Pick<MicroOption, 'changeScriptOrigin'>,\n) {\n const { $, scriptTag, changeScriptOrigin, ident = '' } = options;\n if (!scriptTag) {\n return;\n }\n const script$ = $(scriptTag);\n const moduleSrc = script$.attr('src');\n script$.removeAttr('src');\n script$.removeAttr('type');\n const space = ident;\n script$.html(`\n${space}import(${normalizeUrl(moduleSrc, { changeScriptOrigin })})`);\n return script$;\n}\n\nfunction createImportFinallyResolve(qiankunName: string, options?: { indent?: string }) {\n const { indent: space = ' ' } = options ?? {};\n return `\n${space}const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];\n${space}if (qiankunLifeCycle) {\n${space} window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));\n${space} window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));\n${space} window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());\n${space} window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));\n${space}}\n`;\n}\n\nfunction createQiankunHelper(qiankunName: string, options?: { indent?: string }) {\n const { indent: space = ' ' } = options ?? {};\n return `\n${space}const createDeffer = (hookName) => {\n${space} const d = new Promise((resolve, reject) => {\n${space} window.proxy && (window.proxy[\\`vite\\${hookName}\\`] = resolve)\n${space} })\n${space} return props => d.then(fn => fn(props));\n${space}};\n${space}const bootstrap = createDeffer('bootstrap');\n${space}const mount = createDeffer('mount');\n${space}const unmount = createDeffer('unmount');\n${space}const update = createDeffer('update');\n\n${space}(global => {\n${space} global.qiankunName = '${qiankunName}';\n${space} global['${qiankunName}'] = {\n${space} bootstrap,\n${space} mount,\n${space} unmount,\n${space} update\n${space} };\n${space}})(window);`.trimStart();\n}\n\nexport default qiankunPlugin;\n"],"mappings":"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"}
1
+ {"version":3,"names":["load","detectIndent","normalizeUrl","space","qiankunPlugin","appName","pluginOptions","arguments","length","undefined","_pluginOptions$change","changeScriptOrigin","name","transformIndexHtml","html","context","_$$get","$","sourceCodeLocationInfo","entryScript","get","_script$$html","_context$server","url","attribs","src","scriptBaseIndent","S0","S1","script$","module2DynamicImport","scriptTag","ident","concat","trimEnd","preloadLinks","urls","map","_","link","attr","P1","last","after","join","texts","_link$next","next","type","remove","server","config","command","scripts","toArray","refreshScript","find","s","_$$html","test","refreshScript$","R1","content","regExp","match","sentence","imports","from","rest","replace","removeAttr","split","trim","filter","Boolean","bodyBaseIndent","B1","B2","append","exportLifeCycles","indent","output","console","warn","configureServer","base","middlewares","use","req","res","end","bind","chunk","_len","Array","_key","apply","options","_options$ident","moduleSrc","qiankunName","_ref","_ref$indent","trimStart"],"sources":["../src/index.ts"],"sourcesContent":["import type { CheerioAPI } from 'cheerio';\nimport { load } from 'cheerio';\nimport type { Element } from 'domhandler';\nimport type { PluginOption } from 'vite';\nimport { detectIndent, normalizeUrl, space } from './utils';\n\nexport * from './helper';\n\nexport interface MicroOption {\n /**\n * Whether to change the origin of entry script tag for micro frontend. It's useful when the micro\n * frontend is deployed on a different domain or path.\n *\n * > If the origin by the qiankun's default algorithm is not correct for you, please try the\n * > [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @default true\n */\n changeScriptOrigin?: boolean;\n}\ntype PluginFn = (appName: string, pluginOptions?: MicroOption) => PluginOption;\n\n/**\n * Vite plugin for integrating with Qiankun micro frontend.\n *\n * @param appName The name of the Qiankun sub app.\n * @param pluginOptions Options for configuring the micro frontend behavior.\n *\n * > If the micro app is deployed on a different domain or path, you may need to adjust the public\n * > path. Please have a look at the [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @returns A Vite plugin option object.\n */\nconst qiankunPlugin: PluginFn = (appName, pluginOptions = {}) => {\n const { changeScriptOrigin = true } = pluginOptions;\n\n return {\n name: 'vite-plugin-qiankun',\n\n transformIndexHtml(html: string, context) {\n const $ = load(html, { sourceCodeLocationInfo: true });\n // Transform entry script\n const entryScript =\n $('script[entry]').get(0) ?? $('body script[type=module], head script[crossorigin=\"\"]').get(0);\n if (entryScript) {\n const url = entryScript.attribs.src;\n const scriptBaseIndent = detectIndent(html, entryScript);\n const S0 = scriptBaseIndent;\n const S1 = scriptBaseIndent + space(2);\n const script$ = module2DynamicImport({\n $,\n scriptTag: entryScript,\n changeScriptOrigin,\n ident: S1,\n });\n script$?.html(\n `${script$.html()?.trimEnd()}.then(() => {\n${S1} if (window.proxy) {\n${S1} const qiankunLifeCycle = window.proxy.qiankunLifeCycles;\n${S1} if (qiankunLifeCycle) {\n${S1} window.proxy.vpq_bootstrap((props) => qiankunLifeCycle.bootstrap && qiankunLifeCycle.bootstrap(props));\n${S1} window.proxy.vpq_mount((props) => qiankunLifeCycle.mount && qiankunLifeCycle.mount(props));\n${S1} window.proxy.vpq_unmount((props) => qiankunLifeCycle.unmount && qiankunLifeCycle.unmount(props));\n${S1} window.proxy.vpq_update((props) => qiankunLifeCycle.update && qiankunLifeCycle.update(props));\n${S1} window.dispatchEvent(new CustomEvent('qiankun:loaded'));\n${S1} }\n${S1} }\n${S1}}).catch((error) => {\n${S1} console.error(error);\n${S1} if (error.name === 'TypeError' && error.message && error.message.startsWith('Failed to fetch dynamically imported module:')) {\n${S1} window.dispatchEvent(new CustomEvent('qiankun:fetchEntryError', { detail: { url: '${url}', error } }));\n${S1} } else {\n${S1} window.dispatchEvent(new CustomEvent('qiankun:runtimeError', { detail: { error } }));\n${S1} }\n${S1}});\n${S0}`,\n );\n\n // Transform modulepreload links\n const preloadLinks = $('link[rel=\"modulepreload\"]');\n if (preloadLinks.length) {\n const urls = preloadLinks.map((_, link) => $(link).attr('href')).get();\n const P1 = detectIndent(html, preloadLinks.get(0));\n preloadLinks.last().after(`\n${P1}<script>\n${P1} const preloadUrls = [\n${urls.map((url) => `${P1} ${normalizeUrl(url, { changeScriptOrigin })}`).join(',\\n')}\n${P1} ];\n${P1} preloadUrls.forEach((url) => {\n${P1} const link = document.createElement('link');\n${P1} link.rel = 'modulepreload';\n${P1} link.href = url;\n${P1} link.crossOrigin = 'anonymous';\n${P1} document.head.appendChild(link);\n${P1} });\n${P1}</script>`);\n const texts = preloadLinks.map((_, link) => (link.next?.type === 'text' ? link.next : null));\n texts.remove();\n preloadLinks.remove();\n }\n\n // Transform @react-refresh script\n if (context.server?.config.command === 'serve') {\n const scripts = $('head script[type=module]').toArray();\n const refreshScript = scripts.find((s) => /@react-refresh\";$/m.test($(s).html() ?? ''));\n if (refreshScript) {\n const refreshScript$ = $(refreshScript);\n const R1 = detectIndent(html, refreshScript) + space(2);\n const content = refreshScript$.html();\n const regExp = /import\\s*{([^}]*)}\\s*from\\s*\"([^\"]*@react-refresh)\";/m;\n const match = content?.match(regExp);\n if (content && match) {\n const sentence = match[0];\n const imports = match[1];\n const from = match[2];\n const rest = content.replace(sentence, '');\n refreshScript$.removeAttr('type');\n refreshScript$.html(`\n${R1}import(${normalizeUrl(from, { changeScriptOrigin })}).then(({${imports}}) => {\n${R1} ${rest\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean)\n .join(`\\n${R1} `)}\n${R1}});`);\n }\n }\n }\n\n // Add extra script to export lifecycles\n const bodyBaseIndent = detectIndent(html, $('body').get(0));\n const B1 = bodyBaseIndent + space(2);\n const B2 = B1 + space(2);\n $('body').append(`\n${B1}<script>\n${B2}${exportLifeCycles(appName, { indent: B2 })}\n${B1}</script>\n`);\n const output = $.html();\n return output;\n } else {\n console.warn('\\x1b[33m%s\\x1b[0m', '⚠️ Patch for qiankun failed, because the entry script was not found.');\n return html;\n }\n },\n configureServer(server) {\n const base = server.config.base;\n return () => {\n // Only apply to / i.e. the mount point of the app\n server.middlewares.use((req, res, next) => {\n const end = res.end.bind(res);\n res.end = function (this: typeof res, chunk: unknown, ...rest: any[]) {\n if (typeof chunk === 'string') {\n const $ = load(chunk);\n module2DynamicImport({ $, scriptTag: $(`script[src=\"${base}@vite/client\"]`).get(0), changeScriptOrigin });\n chunk = $.html();\n }\n end(chunk, ...rest);\n return this;\n } as unknown as typeof res.end;\n next();\n });\n };\n },\n };\n};\n\nfunction module2DynamicImport(\n options: { $: CheerioAPI; scriptTag: Element | undefined; ident?: string } & Pick<MicroOption, 'changeScriptOrigin'>,\n) {\n const { $, scriptTag, changeScriptOrigin, ident = '' } = options;\n if (!scriptTag) {\n return;\n }\n const script$ = $(scriptTag);\n const moduleSrc = script$.attr('src');\n script$.removeAttr('src');\n script$.removeAttr('type');\n const space = ident;\n script$.html(`\n${space}import(${normalizeUrl(moduleSrc, { changeScriptOrigin })})`);\n return script$;\n}\n\nfunction exportLifeCycles(qiankunName: string, options?: { indent?: string }) {\n const { indent: space = ' ' } = options ?? {};\n return `\n${space}const makeLifeCycle = (hookName) => {\n${space} const promise = new Promise((resolve, reject) => {\n${space} if (window.proxy) {\n${space} window.proxy[\\`vpq_\\${hookName}\\`] = resolve;\n${space} }\n${space} })\n${space} return (props) => promise.then(fn => fn(props));\n${space}};\n${space}window['${qiankunName}'] = {\n${space} bootstrap: makeLifeCycle('bootstrap'),\n${space} mount: makeLifeCycle('mount'),\n${space} unmount: makeLifeCycle('unmount'),\n${space} update: makeLifeCycle('update')\n${space}};`.trimStart();\n}\n\nexport default qiankunPlugin;\n"],"mappings":"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"}
package/es/utils.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Element } from 'domhandler';
2
- export declare function detectIndent(html: string, entryScript: Element | undefined): string;
2
+ export declare function detectIndent(html: string, element: Element | undefined): string;
3
3
  export declare function space(num: number): string;
4
4
  export declare function normalizeUrl(url: string | undefined, options?: {
5
5
  changeScriptOrigin?: boolean;
package/es/utils.js CHANGED
@@ -1,14 +1,14 @@
1
- export function detectIndent(html, entryScript) {
1
+ export function detectIndent(html, element) {
2
2
  var baseIndent = '';
3
- if (entryScript !== null && entryScript !== void 0 && entryScript.sourceCodeLocation) {
3
+ if (element !== null && element !== void 0 && element.sourceCodeLocation) {
4
4
  var newline = html.includes('\r\n') ? '\r\n' : '\n';
5
5
  var lines = html.split(newline);
6
- var lineStr = lines[entryScript.sourceCodeLocation.startLine - 1];
6
+ var lineStr = lines[element.sourceCodeLocation.startLine - 1];
7
7
  if (lineStr) {
8
- var startTag = '<script';
9
- var tagNameFromHtml = lineStr.substring(entryScript.sourceCodeLocation.startCol - 1, entryScript.sourceCodeLocation.startCol - 1 + startTag.length);
8
+ var startTag = "<".concat(element.tagName);
9
+ var tagNameFromHtml = lineStr.substring(element.sourceCodeLocation.startCol - 1, element.sourceCodeLocation.startCol - 1 + startTag.length);
10
10
  if (tagNameFromHtml === startTag) {
11
- for (var i = 0; i < entryScript.sourceCodeLocation.startCol - 1; i++) {
11
+ for (var i = 0; i < element.sourceCodeLocation.startCol - 1; i++) {
12
12
  if (/\s/.test(lineStr[i])) {
13
13
  baseIndent += lineStr[i];
14
14
  } else {
@@ -29,7 +29,7 @@ export function normalizeUrl(url, options) {
29
29
  changeScriptOrigin = _ref$changeScriptOrig === void 0 ? true : _ref$changeScriptOrig;
30
30
  var appendBase = "''";
31
31
  if (changeScriptOrigin) {
32
- appendBase = "window.proxy?.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''";
32
+ appendBase = "window.proxy && window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''";
33
33
  }
34
34
  return url !== null && url !== void 0 && url.match(/^https?/i) ? "'".concat(url, "'") : "(".concat(appendBase, ") + '").concat(url, "'");
35
35
  }
package/es/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["detectIndent","html","entryScript","baseIndent","sourceCodeLocation","newline","includes","lines","split","lineStr","startLine","startTag","tagNameFromHtml","substring","startCol","length","i","test","space","num","Array","join","normalizeUrl","url","options","_ref","_ref$changeScriptOrig","changeScriptOrigin","appendBase","match","concat"],"sources":["../src/utils.ts"],"sourcesContent":["import type { Element } from 'domhandler';\n\nexport function detectIndent(html: string, entryScript: Element | undefined) {\n let baseIndent = '';\n if (entryScript?.sourceCodeLocation) {\n const newline = html.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = html.split(newline);\n const lineStr = lines[entryScript.sourceCodeLocation.startLine - 1];\n if (lineStr) {\n const startTag = '<script';\n const tagNameFromHtml = lineStr.substring(\n entryScript.sourceCodeLocation.startCol - 1,\n entryScript.sourceCodeLocation.startCol - 1 + startTag.length,\n );\n if (tagNameFromHtml === startTag) {\n for (let i = 0; i < entryScript.sourceCodeLocation.startCol - 1; i++) {\n if (/\\s/.test(lineStr[i])) {\n baseIndent += lineStr[i];\n } else {\n break;\n }\n }\n }\n }\n }\n return baseIndent;\n}\n\nexport function space(num: number) {\n return new Array(num + 1).join(' ');\n}\n\nexport function normalizeUrl(url: string | undefined, options?: { changeScriptOrigin?: boolean }) {\n const { changeScriptOrigin = true } = options ?? {};\n let appendBase = \"''\";\n if (changeScriptOrigin) {\n appendBase = \"window.proxy?.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''\";\n }\n return url?.match(/^https?/i) ? `'${url}'` : `(${appendBase}) + '${url}'`;\n}\n"],"mappings":"AAEA,OAAO,SAASA,YAAYA,CAACC,IAAY,EAAEC,WAAgC,EAAE;EAC3E,IAAIC,UAAU,GAAG,EAAE;EACnB,IAAID,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEE,kBAAkB,EAAE;IACnC,IAAMC,OAAO,GAAGJ,IAAI,CAACK,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;IACrD,IAAMC,KAAK,GAAGN,IAAI,CAACO,KAAK,CAACH,OAAO,CAAC;IACjC,IAAMI,OAAO,GAAGF,KAAK,CAACL,WAAW,CAACE,kBAAkB,CAACM,SAAS,GAAG,CAAC,CAAC;IACnE,IAAID,OAAO,EAAE;MACX,IAAME,QAAQ,GAAG,SAAS;MAC1B,IAAMC,eAAe,GAAGH,OAAO,CAACI,SAAS,CACvCX,WAAW,CAACE,kBAAkB,CAACU,QAAQ,GAAG,CAAC,EAC3CZ,WAAW,CAACE,kBAAkB,CAACU,QAAQ,GAAG,CAAC,GAAGH,QAAQ,CAACI,MACzD,CAAC;MACD,IAAIH,eAAe,KAAKD,QAAQ,EAAE;QAChC,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGd,WAAW,CAACE,kBAAkB,CAACU,QAAQ,GAAG,CAAC,EAAEE,CAAC,EAAE,EAAE;UACpE,IAAI,IAAI,CAACC,IAAI,CAACR,OAAO,CAACO,CAAC,CAAC,CAAC,EAAE;YACzBb,UAAU,IAAIM,OAAO,CAACO,CAAC,CAAC;UAC1B,CAAC,MAAM;YACL;UACF;QACF;MACF;IACF;EACF;EACA,OAAOb,UAAU;AACnB;AAEA,OAAO,SAASe,KAAKA,CAACC,GAAW,EAAE;EACjC,OAAO,IAAIC,KAAK,CAACD,GAAG,GAAG,CAAC,CAAC,CAACE,IAAI,CAAC,GAAG,CAAC;AACrC;AAEA,OAAO,SAASC,YAAYA,CAACC,GAAuB,EAAEC,OAA0C,EAAE;EAChG,IAAAC,IAAA,GAAsCD,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,CAAC,CAAC;IAAAE,qBAAA,GAAAD,IAAA,CAA3CE,kBAAkB;IAAlBA,kBAAkB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;EACjC,IAAIE,UAAU,GAAG,IAAI;EACrB,IAAID,kBAAkB,EAAE;IACtBC,UAAU,GAAG,yDAAyD;EACxE;EACA,OAAOL,GAAG,aAAHA,GAAG,eAAHA,GAAG,CAAEM,KAAK,CAAC,UAAU,CAAC,OAAAC,MAAA,CAAOP,GAAG,aAAAO,MAAA,CAAUF,UAAU,WAAAE,MAAA,CAAQP,GAAG,MAAG;AAC3E"}
1
+ {"version":3,"names":["detectIndent","html","element","baseIndent","sourceCodeLocation","newline","includes","lines","split","lineStr","startLine","startTag","concat","tagName","tagNameFromHtml","substring","startCol","length","i","test","space","num","Array","join","normalizeUrl","url","options","_ref","_ref$changeScriptOrig","changeScriptOrigin","appendBase","match"],"sources":["../src/utils.ts"],"sourcesContent":["import type { Element } from 'domhandler';\n\nexport function detectIndent(html: string, element: Element | undefined) {\n let baseIndent = '';\n if (element?.sourceCodeLocation) {\n const newline = html.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = html.split(newline);\n const lineStr = lines[element.sourceCodeLocation.startLine - 1];\n if (lineStr) {\n const startTag = `<${element.tagName}`;\n const tagNameFromHtml = lineStr.substring(\n element.sourceCodeLocation.startCol - 1,\n element.sourceCodeLocation.startCol - 1 + startTag.length,\n );\n if (tagNameFromHtml === startTag) {\n for (let i = 0; i < element.sourceCodeLocation.startCol - 1; i++) {\n if (/\\s/.test(lineStr[i])) {\n baseIndent += lineStr[i];\n } else {\n break;\n }\n }\n }\n }\n }\n return baseIndent;\n}\n\nexport function space(num: number) {\n return new Array(num + 1).join(' ');\n}\n\nexport function normalizeUrl(url: string | undefined, options?: { changeScriptOrigin?: boolean }) {\n const { changeScriptOrigin = true } = options ?? {};\n let appendBase = \"''\";\n if (changeScriptOrigin) {\n appendBase = \"window.proxy && window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''\";\n }\n return url?.match(/^https?/i) ? `'${url}'` : `(${appendBase}) + '${url}'`;\n}\n"],"mappings":"AAEA,OAAO,SAASA,YAAYA,CAACC,IAAY,EAAEC,OAA4B,EAAE;EACvE,IAAIC,UAAU,GAAG,EAAE;EACnB,IAAID,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEE,kBAAkB,EAAE;IAC/B,IAAMC,OAAO,GAAGJ,IAAI,CAACK,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI;IACrD,IAAMC,KAAK,GAAGN,IAAI,CAACO,KAAK,CAACH,OAAO,CAAC;IACjC,IAAMI,OAAO,GAAGF,KAAK,CAACL,OAAO,CAACE,kBAAkB,CAACM,SAAS,GAAG,CAAC,CAAC;IAC/D,IAAID,OAAO,EAAE;MACX,IAAME,QAAQ,OAAAC,MAAA,CAAOV,OAAO,CAACW,OAAO,CAAE;MACtC,IAAMC,eAAe,GAAGL,OAAO,CAACM,SAAS,CACvCb,OAAO,CAACE,kBAAkB,CAACY,QAAQ,GAAG,CAAC,EACvCd,OAAO,CAACE,kBAAkB,CAACY,QAAQ,GAAG,CAAC,GAAGL,QAAQ,CAACM,MACrD,CAAC;MACD,IAAIH,eAAe,KAAKH,QAAQ,EAAE;QAChC,KAAK,IAAIO,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGhB,OAAO,CAACE,kBAAkB,CAACY,QAAQ,GAAG,CAAC,EAAEE,CAAC,EAAE,EAAE;UAChE,IAAI,IAAI,CAACC,IAAI,CAACV,OAAO,CAACS,CAAC,CAAC,CAAC,EAAE;YACzBf,UAAU,IAAIM,OAAO,CAACS,CAAC,CAAC;UAC1B,CAAC,MAAM;YACL;UACF;QACF;MACF;IACF;EACF;EACA,OAAOf,UAAU;AACnB;AAEA,OAAO,SAASiB,KAAKA,CAACC,GAAW,EAAE;EACjC,OAAO,IAAIC,KAAK,CAACD,GAAG,GAAG,CAAC,CAAC,CAACE,IAAI,CAAC,GAAG,CAAC;AACrC;AAEA,OAAO,SAASC,YAAYA,CAACC,GAAuB,EAAEC,OAA0C,EAAE;EAChG,IAAAC,IAAA,GAAsCD,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI,CAAC,CAAC;IAAAE,qBAAA,GAAAD,IAAA,CAA3CE,kBAAkB;IAAlBA,kBAAkB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;EACjC,IAAIE,UAAU,GAAG,IAAI;EACrB,IAAID,kBAAkB,EAAE;IACtBC,UAAU,GAAG,wEAAwE;EACvF;EACA,OAAOL,GAAG,aAAHA,GAAG,eAAHA,GAAG,CAAEM,KAAK,CAAC,UAAU,CAAC,OAAAnB,MAAA,CAAOa,GAAG,aAAAb,MAAA,CAAUkB,UAAU,WAAAlB,MAAA,CAAQa,GAAG,MAAG;AAC3E"}
package/lib/helper.d.ts CHANGED
@@ -3,15 +3,16 @@ export interface QiankunProps {
3
3
  [x: string]: unknown;
4
4
  }
5
5
  export interface QiankunLifeCycle {
6
- bootstrap: (props?: QiankunProps) => void | Promise<void>;
7
- mount: (props: QiankunProps) => void | Promise<void>;
8
- unmount: (props: QiankunProps) => void | Promise<void>;
9
- update: (props: QiankunProps) => void | Promise<void>;
6
+ bootstrap?: (props?: QiankunProps) => void | Promise<void>;
7
+ mount?: (props: QiankunProps) => void | Promise<void>;
8
+ unmount?: (props: QiankunProps) => void | Promise<void>;
9
+ update?: (props: QiankunProps) => void | Promise<void>;
10
10
  }
11
11
  export interface QiankunWindow {
12
12
  __POWERED_BY_QIANKUN__?: boolean;
13
+ __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string;
14
+ qiankunLifeCycles?: QiankunLifeCycle;
13
15
  [x: string]: any;
14
16
  }
15
17
  export declare const qiankunWindow: QiankunWindow;
16
- export declare const renderWithQiankun: (qiankunLifeCycle: QiankunLifeCycle) => void;
17
- export default renderWithQiankun;
18
+ export declare const exportQiankunLifeCycles: (qiankunLifeCycle: QiankunLifeCycle) => void;
package/lib/helper.js CHANGED
@@ -19,26 +19,19 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  // src/helper.ts
20
20
  var helper_exports = {};
21
21
  __export(helper_exports, {
22
- default: () => helper_default,
23
- qiankunWindow: () => qiankunWindow,
24
- renderWithQiankun: () => renderWithQiankun
22
+ exportQiankunLifeCycles: () => exportQiankunLifeCycles,
23
+ qiankunWindow: () => qiankunWindow
25
24
  });
26
25
  module.exports = __toCommonJS(helper_exports);
27
26
  var qiankunWindow = typeof window !== "undefined" ? window.proxy || window : {};
28
- var renderWithQiankun = (qiankunLifeCycle) => {
27
+ var exportQiankunLifeCycles = (qiankunLifeCycle) => {
29
28
  if (qiankunWindow == null ? void 0 : qiankunWindow.__POWERED_BY_QIANKUN__) {
30
- if (!window.moudleQiankunAppLifeCycles) {
31
- window.moudleQiankunAppLifeCycles = {};
32
- }
33
- if (qiankunWindow.qiankunName) {
34
- window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;
35
- }
29
+ qiankunWindow.qiankunLifeCycles = qiankunLifeCycle;
36
30
  }
37
31
  };
38
- var helper_default = renderWithQiankun;
39
32
  // Annotate the CommonJS export names for ESM import in node:
40
33
  0 && (module.exports = {
41
- qiankunWindow,
42
- renderWithQiankun
34
+ exportQiankunLifeCycles,
35
+ qiankunWindow
43
36
  });
44
37
  //# sourceMappingURL=helper.js.map
package/lib/helper.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/helper.ts"],
4
- "sourcesContent": ["export interface QiankunProps {\n container?: HTMLElement;\n [x: string]: unknown;\n}\n\nexport interface QiankunLifeCycle {\n bootstrap: (props?: QiankunProps) => void | Promise<void>;\n mount: (props: QiankunProps) => void | Promise<void>;\n unmount: (props: QiankunProps) => void | Promise<void>;\n update: (props: QiankunProps) => void | Promise<void>;\n}\n\nexport interface QiankunWindow {\n __POWERED_BY_QIANKUN__?: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [x: string]: any;\n}\n\nexport const qiankunWindow: QiankunWindow = typeof window !== 'undefined' ? window.proxy || window : {};\n\nexport const renderWithQiankun = (qiankunLifeCycle: QiankunLifeCycle) => {\n // 函数只有一次执行机会,需要把生命周期赋值给全局\n if (qiankunWindow?.__POWERED_BY_QIANKUN__) {\n if (!window.moudleQiankunAppLifeCycles) {\n window.moudleQiankunAppLifeCycles = {};\n }\n if (qiankunWindow.qiankunName) {\n window.moudleQiankunAppLifeCycles[qiankunWindow.qiankunName] = qiankunLifeCycle;\n }\n }\n};\n\nexport default renderWithQiankun;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBO,IAAM,gBAA+B,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,CAAC;AAE/F,IAAM,oBAAoB,CAAC,qBAAuC;AAEvE,MAAI,+CAAe,wBAAwB;AACzC,QAAI,CAAC,OAAO,4BAA4B;AACtC,aAAO,6BAA6B,CAAC;AAAA,IACvC;AACA,QAAI,cAAc,aAAa;AAC7B,aAAO,2BAA2B,cAAc,WAAW,IAAI;AAAA,IACjE;AAAA,EACF;AACF;AAEA,IAAO,iBAAQ;",
4
+ "sourcesContent": ["export interface QiankunProps {\n container?: HTMLElement;\n [x: string]: unknown;\n}\n\nexport interface QiankunLifeCycle {\n bootstrap?: (props?: QiankunProps) => void | Promise<void>;\n mount?: (props: QiankunProps) => void | Promise<void>;\n unmount?: (props: QiankunProps) => void | Promise<void>;\n update?: (props: QiankunProps) => void | Promise<void>;\n}\n\nexport interface QiankunWindow {\n __POWERED_BY_QIANKUN__?: boolean;\n __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string;\n qiankunLifeCycles?: QiankunLifeCycle;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [x: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const qiankunWindow: QiankunWindow = typeof window !== 'undefined' ? (window as any).proxy || window : {};\n\nexport const exportQiankunLifeCycles = (qiankunLifeCycle: QiankunLifeCycle) => {\n // The function has only one chance to execute, and the lifecycle needs to be assigned to the global scope.\n if (qiankunWindow?.__POWERED_BY_QIANKUN__) {\n qiankunWindow.qiankunLifeCycles = qiankunLifeCycle;\n }\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBO,IAAM,gBAA+B,OAAO,WAAW,cAAe,OAAe,SAAS,SAAS,CAAC;AAExG,IAAM,0BAA0B,CAAC,qBAAuC;AAE7E,MAAI,+CAAe,wBAAwB;AACzC,kBAAc,oBAAoB;AAAA,EACpC;AACF;",
6
6
  "names": []
7
7
  }
package/lib/index.js CHANGED
@@ -35,20 +35,62 @@ var qiankunPlugin = (appName, pluginOptions = {}) => {
35
35
  const $ = (0, import_cheerio.load)(html, { sourceCodeLocationInfo: true });
36
36
  const entryScript = $("script[entry]").get(0) ?? $('body script[type=module], head script[crossorigin=""]').get(0);
37
37
  if (entryScript) {
38
+ const url = entryScript.attribs.src;
38
39
  const scriptBaseIndent = (0, import_utils.detectIndent)(html, entryScript);
39
40
  const S0 = scriptBaseIndent;
40
41
  const S1 = scriptBaseIndent + (0, import_utils.space)(2);
41
- const S2 = S1 + (0, import_utils.space)(2);
42
42
  const script$ = module2DynamicImport({
43
43
  $,
44
44
  scriptTag: entryScript,
45
45
  changeScriptOrigin,
46
46
  ident: S1
47
47
  });
48
- script$ == null ? void 0 : script$.html(`${(_a = script$.html()) == null ? void 0 : _a.trimEnd()}.finally(() => {
49
- ${S2}${createImportFinallyResolve(appName, { indent: S2 }).trim()}
48
+ script$ == null ? void 0 : script$.html(
49
+ `${(_a = script$.html()) == null ? void 0 : _a.trimEnd()}.then(() => {
50
+ ${S1} if (window.proxy) {
51
+ ${S1} const qiankunLifeCycle = window.proxy.qiankunLifeCycles;
52
+ ${S1} if (qiankunLifeCycle) {
53
+ ${S1} window.proxy.vpq_bootstrap((props) => qiankunLifeCycle.bootstrap && qiankunLifeCycle.bootstrap(props));
54
+ ${S1} window.proxy.vpq_mount((props) => qiankunLifeCycle.mount && qiankunLifeCycle.mount(props));
55
+ ${S1} window.proxy.vpq_unmount((props) => qiankunLifeCycle.unmount && qiankunLifeCycle.unmount(props));
56
+ ${S1} window.proxy.vpq_update((props) => qiankunLifeCycle.update && qiankunLifeCycle.update(props));
57
+ ${S1} window.dispatchEvent(new CustomEvent('qiankun:loaded'));
58
+ ${S1} }
59
+ ${S1} }
60
+ ${S1}}).catch((error) => {
61
+ ${S1} console.error(error);
62
+ ${S1} if (error.name === 'TypeError' && error.message && error.message.startsWith('Failed to fetch dynamically imported module:')) {
63
+ ${S1} window.dispatchEvent(new CustomEvent('qiankun:fetchEntryError', { detail: { url: '${url}', error } }));
64
+ ${S1} } else {
65
+ ${S1} window.dispatchEvent(new CustomEvent('qiankun:runtimeError', { detail: { error } }));
66
+ ${S1} }
50
67
  ${S1}});
51
- ${S0}`);
68
+ ${S0}`
69
+ );
70
+ const preloadLinks = $('link[rel="modulepreload"]');
71
+ if (preloadLinks.length) {
72
+ const urls = preloadLinks.map((_, link) => $(link).attr("href")).get();
73
+ const P1 = (0, import_utils.detectIndent)(html, preloadLinks.get(0));
74
+ preloadLinks.last().after(`
75
+ ${P1}<script>
76
+ ${P1} const preloadUrls = [
77
+ ${urls.map((url2) => `${P1} ${(0, import_utils.normalizeUrl)(url2, { changeScriptOrigin })}`).join(",\n")}
78
+ ${P1} ];
79
+ ${P1} preloadUrls.forEach((url) => {
80
+ ${P1} const link = document.createElement('link');
81
+ ${P1} link.rel = 'modulepreload';
82
+ ${P1} link.href = url;
83
+ ${P1} link.crossOrigin = 'anonymous';
84
+ ${P1} document.head.appendChild(link);
85
+ ${P1} });
86
+ ${P1}</script>`);
87
+ const texts = preloadLinks.map((_, link) => {
88
+ var _a2;
89
+ return ((_a2 = link.next) == null ? void 0 : _a2.type) === "text" ? link.next : null;
90
+ });
91
+ texts.remove();
92
+ preloadLinks.remove();
93
+ }
52
94
  if (((_b = context.server) == null ? void 0 : _b.config.command) === "serve") {
53
95
  const scripts = $("head script[type=module]").toArray();
54
96
  const refreshScript = scripts.find((s) => /@react-refresh";$/m.test($(s).html() ?? ""));
@@ -56,15 +98,16 @@ ${S0}`);
56
98
  const refreshScript$ = $(refreshScript);
57
99
  const R1 = (0, import_utils.detectIndent)(html, refreshScript) + (0, import_utils.space)(2);
58
100
  const content = refreshScript$.html();
59
- const regExp = /import\s*{\s*injectIntoGlobalHook\s*}\s*from\s*"([^"]*@react-refresh)";/m;
101
+ const regExp = /import\s*{([^}]*)}\s*from\s*"([^"]*@react-refresh)";/m;
60
102
  const match = content == null ? void 0 : content.match(regExp);
61
103
  if (content && match) {
62
104
  const sentence = match[0];
63
- const from = match[1];
105
+ const imports = match[1];
106
+ const from = match[2];
64
107
  const rest = content.replace(sentence, "");
65
108
  refreshScript$.removeAttr("type");
66
109
  refreshScript$.html(`
67
- ${R1}import(${(0, import_utils.normalizeUrl)(from, { changeScriptOrigin })}).then(({ injectIntoGlobalHook }) => {
110
+ ${R1}import(${(0, import_utils.normalizeUrl)(from, { changeScriptOrigin })}).then(({${imports}}) => {
68
111
  ${R1} ${rest.split("\n").map((s) => s.trim()).filter(Boolean).join(`
69
112
  ${R1} `)}
70
113
  ${R1}});`);
@@ -76,7 +119,7 @@ ${R1}});`);
76
119
  const B2 = B1 + (0, import_utils.space)(2);
77
120
  $("body").append(`
78
121
  ${B1}<script>
79
- ${B2}${createQiankunHelper(appName, { indent: B2 })}
122
+ ${B2}${exportLifeCycles(appName, { indent: B2 })}
80
123
  ${B1}</script>
81
124
  `);
82
125
  const output = $.html();
@@ -120,41 +163,23 @@ function module2DynamicImport(options) {
120
163
  ${space2}import(${(0, import_utils.normalizeUrl)(moduleSrc, { changeScriptOrigin })})`);
121
164
  return script$;
122
165
  }
123
- function createImportFinallyResolve(qiankunName, options) {
166
+ function exportLifeCycles(qiankunName, options) {
124
167
  const { indent: space2 = " " } = options ?? {};
125
168
  return `
126
- ${space2}const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];
127
- ${space2}if (qiankunLifeCycle) {
128
- ${space2} window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));
129
- ${space2} window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));
130
- ${space2} window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());
131
- ${space2} window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));
132
- ${space2}}
133
- `;
134
- }
135
- function createQiankunHelper(qiankunName, options) {
136
- const { indent: space2 = " " } = options ?? {};
137
- return `
138
- ${space2}const createDeffer = (hookName) => {
139
- ${space2} const d = new Promise((resolve, reject) => {
140
- ${space2} window.proxy && (window.proxy[\`vite\${hookName}\`] = resolve)
169
+ ${space2}const makeLifeCycle = (hookName) => {
170
+ ${space2} const promise = new Promise((resolve, reject) => {
171
+ ${space2} if (window.proxy) {
172
+ ${space2} window.proxy[\`vpq_\${hookName}\`] = resolve;
173
+ ${space2} }
141
174
  ${space2} })
142
- ${space2} return props => d.then(fn => fn(props));
175
+ ${space2} return (props) => promise.then(fn => fn(props));
143
176
  ${space2}};
144
- ${space2}const bootstrap = createDeffer('bootstrap');
145
- ${space2}const mount = createDeffer('mount');
146
- ${space2}const unmount = createDeffer('unmount');
147
- ${space2}const update = createDeffer('update');
148
-
149
- ${space2}(global => {
150
- ${space2} global.qiankunName = '${qiankunName}';
151
- ${space2} global['${qiankunName}'] = {
152
- ${space2} bootstrap,
153
- ${space2} mount,
154
- ${space2} unmount,
155
- ${space2} update
156
- ${space2} };
157
- ${space2}})(window);`.trimStart();
177
+ ${space2}window['${qiankunName}'] = {
178
+ ${space2} bootstrap: makeLifeCycle('bootstrap'),
179
+ ${space2} mount: makeLifeCycle('mount'),
180
+ ${space2} unmount: makeLifeCycle('unmount'),
181
+ ${space2} update: makeLifeCycle('update')
182
+ ${space2}};`.trimStart();
158
183
  }
159
184
  var src_default = qiankunPlugin;
160
185
  // Annotate the CommonJS export names for ESM import in node:
package/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import type { CheerioAPI } from 'cheerio';\nimport { load } from 'cheerio';\nimport type { Element } from 'domhandler';\nimport type { PluginOption } from 'vite';\nimport { detectIndent, normalizeUrl, space } from './utils';\n\nexport * from './helper';\n\nexport interface MicroOption {\n /**\n * Whether to change the origin of entry script tag for micro frontend. It's useful when the micro\n * frontend is deployed on a different domain or path.\n *\n * > If the origin by the qiankun's default algorithm is not correct for you, please try the\n * > [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @default true\n */\n changeScriptOrigin?: boolean;\n}\ntype PluginFn = (appName: string, pluginOptions?: MicroOption) => PluginOption;\n\n/**\n * Vite plugin for integrating with Qiankun micro frontend.\n *\n * @param appName The name of the Qiankun sub app.\n * @param pluginOptions Options for configuring the micro frontend behavior.\n *\n * > If the micro app is deployed on a different domain or path, you may need to adjust the public\n * > path. Please have a look at the [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @returns A Vite plugin option object.\n */\nconst qiankunPlugin: PluginFn = (appName, pluginOptions = {}) => {\n const { changeScriptOrigin = true } = pluginOptions;\n\n return {\n name: 'vite-plugin-qiankun',\n\n transformIndexHtml(html: string, context) {\n const $ = load(html, { sourceCodeLocationInfo: true });\n // Transform entry script\n const entryScript =\n $('script[entry]').get(0) ?? $('body script[type=module], head script[crossorigin=\"\"]').get(0);\n if (entryScript) {\n const scriptBaseIndent = detectIndent(html, entryScript);\n const S0 = scriptBaseIndent;\n const S1 = scriptBaseIndent + space(2);\n const S2 = S1 + space(2);\n const script$ = module2DynamicImport({\n $,\n scriptTag: entryScript,\n changeScriptOrigin,\n ident: S1,\n });\n script$?.html(`${script$.html()?.trimEnd()}.finally(() => {\n${S2}${createImportFinallyResolve(appName, { indent: S2 }).trim()}\n${S1}});\n${S0}`);\n\n // Transform @react-refresh script\n if (context.server?.config.command === 'serve') {\n const scripts = $('head script[type=module]').toArray();\n const refreshScript = scripts.find((s) => /@react-refresh\";$/m.test($(s).html() ?? ''));\n if (refreshScript) {\n const refreshScript$ = $(refreshScript);\n const R1 = detectIndent(html, refreshScript) + space(2);\n const content = refreshScript$.html();\n const regExp = /import\\s*{\\s*injectIntoGlobalHook\\s*}\\s*from\\s*\"([^\"]*@react-refresh)\";/m;\n const match = content?.match(regExp);\n if (content && match) {\n const sentence = match[0];\n const from = match[1];\n const rest = content.replace(sentence, '');\n refreshScript$.removeAttr('type');\n refreshScript$.html(`\n${R1}import(${normalizeUrl(from, { changeScriptOrigin })}).then(({ injectIntoGlobalHook }) => {\n${R1} ${rest\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean)\n .join(`\\n${R1} `)}\n${R1}});`);\n }\n }\n }\n\n // Add extra script to export lifecycles\n const bodyBaseIndent = detectIndent(html, $('body').get(0));\n const B1 = bodyBaseIndent + space(2);\n const B2 = B1 + space(2);\n $('body').append(`\n${B1}<script>\n${B2}${createQiankunHelper(appName, { indent: B2 })}\n${B1}</script>\n`);\n const output = $.html();\n return output;\n } else {\n console.warn('\\x1b[33m%s\\x1b[0m', '⚠️ Patch for qiankun failed, because the entry script was not found.');\n return html;\n }\n },\n configureServer(server) {\n const base = server.config.base;\n return () => {\n // Only apply to / i.e. the mount point of the app\n server.middlewares.use((req, res, next) => {\n const end = res.end.bind(res);\n res.end = function (this: typeof res, chunk: unknown, ...rest: any[]) {\n if (typeof chunk === 'string') {\n const $ = load(chunk);\n module2DynamicImport({ $, scriptTag: $(`script[src=\"${base}@vite/client\"]`).get(0), changeScriptOrigin });\n chunk = $.html();\n }\n end(chunk, ...rest);\n return this;\n } as unknown as typeof res.end;\n next();\n });\n };\n },\n };\n};\n\nfunction module2DynamicImport(\n options: { $: CheerioAPI; scriptTag: Element | undefined; ident?: string } & Pick<MicroOption, 'changeScriptOrigin'>,\n) {\n const { $, scriptTag, changeScriptOrigin, ident = '' } = options;\n if (!scriptTag) {\n return;\n }\n const script$ = $(scriptTag);\n const moduleSrc = script$.attr('src');\n script$.removeAttr('src');\n script$.removeAttr('type');\n const space = ident;\n script$.html(`\n${space}import(${normalizeUrl(moduleSrc, { changeScriptOrigin })})`);\n return script$;\n}\n\nfunction createImportFinallyResolve(qiankunName: string, options?: { indent?: string }) {\n const { indent: space = ' ' } = options ?? {};\n return `\n${space}const qiankunLifeCycle = window.moudleQiankunAppLifeCycles && window.moudleQiankunAppLifeCycles['${qiankunName}'];\n${space}if (qiankunLifeCycle) {\n${space} window.proxy.vitemount((props) => qiankunLifeCycle.mount(props));\n${space} window.proxy.viteunmount((props) => qiankunLifeCycle.unmount(props));\n${space} window.proxy.vitebootstrap(() => qiankunLifeCycle.bootstrap());\n${space} window.proxy.viteupdate((props) => qiankunLifeCycle.update(props));\n${space}}\n`;\n}\n\nfunction createQiankunHelper(qiankunName: string, options?: { indent?: string }) {\n const { indent: space = ' ' } = options ?? {};\n return `\n${space}const createDeffer = (hookName) => {\n${space} const d = new Promise((resolve, reject) => {\n${space} window.proxy && (window.proxy[\\`vite\\${hookName}\\`] = resolve)\n${space} })\n${space} return props => d.then(fn => fn(props));\n${space}};\n${space}const bootstrap = createDeffer('bootstrap');\n${space}const mount = createDeffer('mount');\n${space}const unmount = createDeffer('unmount');\n${space}const update = createDeffer('update');\n\n${space}(global => {\n${space} global.qiankunName = '${qiankunName}';\n${space} global['${qiankunName}'] = {\n${space} bootstrap,\n${space} mount,\n${space} unmount,\n${space} update\n${space} };\n${space}})(window);`.trimStart();\n}\n\nexport default qiankunPlugin;\n"],
5
- "mappings": "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",
6
- "names": ["space"]
4
+ "sourcesContent": ["import type { CheerioAPI } from 'cheerio';\nimport { load } from 'cheerio';\nimport type { Element } from 'domhandler';\nimport type { PluginOption } from 'vite';\nimport { detectIndent, normalizeUrl, space } from './utils';\n\nexport * from './helper';\n\nexport interface MicroOption {\n /**\n * Whether to change the origin of entry script tag for micro frontend. It's useful when the micro\n * frontend is deployed on a different domain or path.\n *\n * > If the origin by the qiankun's default algorithm is not correct for you, please try the\n * > [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @default true\n */\n changeScriptOrigin?: boolean;\n}\ntype PluginFn = (appName: string, pluginOptions?: MicroOption) => PluginOption;\n\n/**\n * Vite plugin for integrating with Qiankun micro frontend.\n *\n * @param appName The name of the Qiankun sub app.\n * @param pluginOptions Options for configuring the micro frontend behavior.\n *\n * > If the micro app is deployed on a different domain or path, you may need to adjust the public\n * > path. Please have a look at the [getPublicPath](https://qiankun.umijs.org/zh/api) option.\n *\n * @returns A Vite plugin option object.\n */\nconst qiankunPlugin: PluginFn = (appName, pluginOptions = {}) => {\n const { changeScriptOrigin = true } = pluginOptions;\n\n return {\n name: 'vite-plugin-qiankun',\n\n transformIndexHtml(html: string, context) {\n const $ = load(html, { sourceCodeLocationInfo: true });\n // Transform entry script\n const entryScript =\n $('script[entry]').get(0) ?? $('body script[type=module], head script[crossorigin=\"\"]').get(0);\n if (entryScript) {\n const url = entryScript.attribs.src;\n const scriptBaseIndent = detectIndent(html, entryScript);\n const S0 = scriptBaseIndent;\n const S1 = scriptBaseIndent + space(2);\n const script$ = module2DynamicImport({\n $,\n scriptTag: entryScript,\n changeScriptOrigin,\n ident: S1,\n });\n script$?.html(\n `${script$.html()?.trimEnd()}.then(() => {\n${S1} if (window.proxy) {\n${S1} const qiankunLifeCycle = window.proxy.qiankunLifeCycles;\n${S1} if (qiankunLifeCycle) {\n${S1} window.proxy.vpq_bootstrap((props) => qiankunLifeCycle.bootstrap && qiankunLifeCycle.bootstrap(props));\n${S1} window.proxy.vpq_mount((props) => qiankunLifeCycle.mount && qiankunLifeCycle.mount(props));\n${S1} window.proxy.vpq_unmount((props) => qiankunLifeCycle.unmount && qiankunLifeCycle.unmount(props));\n${S1} window.proxy.vpq_update((props) => qiankunLifeCycle.update && qiankunLifeCycle.update(props));\n${S1} window.dispatchEvent(new CustomEvent('qiankun:loaded'));\n${S1} }\n${S1} }\n${S1}}).catch((error) => {\n${S1} console.error(error);\n${S1} if (error.name === 'TypeError' && error.message && error.message.startsWith('Failed to fetch dynamically imported module:')) {\n${S1} window.dispatchEvent(new CustomEvent('qiankun:fetchEntryError', { detail: { url: '${url}', error } }));\n${S1} } else {\n${S1} window.dispatchEvent(new CustomEvent('qiankun:runtimeError', { detail: { error } }));\n${S1} }\n${S1}});\n${S0}`,\n );\n\n // Transform modulepreload links\n const preloadLinks = $('link[rel=\"modulepreload\"]');\n if (preloadLinks.length) {\n const urls = preloadLinks.map((_, link) => $(link).attr('href')).get();\n const P1 = detectIndent(html, preloadLinks.get(0));\n preloadLinks.last().after(`\n${P1}<script>\n${P1} const preloadUrls = [\n${urls.map((url) => `${P1} ${normalizeUrl(url, { changeScriptOrigin })}`).join(',\\n')}\n${P1} ];\n${P1} preloadUrls.forEach((url) => {\n${P1} const link = document.createElement('link');\n${P1} link.rel = 'modulepreload';\n${P1} link.href = url;\n${P1} link.crossOrigin = 'anonymous';\n${P1} document.head.appendChild(link);\n${P1} });\n${P1}</script>`);\n const texts = preloadLinks.map((_, link) => (link.next?.type === 'text' ? link.next : null));\n texts.remove();\n preloadLinks.remove();\n }\n\n // Transform @react-refresh script\n if (context.server?.config.command === 'serve') {\n const scripts = $('head script[type=module]').toArray();\n const refreshScript = scripts.find((s) => /@react-refresh\";$/m.test($(s).html() ?? ''));\n if (refreshScript) {\n const refreshScript$ = $(refreshScript);\n const R1 = detectIndent(html, refreshScript) + space(2);\n const content = refreshScript$.html();\n const regExp = /import\\s*{([^}]*)}\\s*from\\s*\"([^\"]*@react-refresh)\";/m;\n const match = content?.match(regExp);\n if (content && match) {\n const sentence = match[0];\n const imports = match[1];\n const from = match[2];\n const rest = content.replace(sentence, '');\n refreshScript$.removeAttr('type');\n refreshScript$.html(`\n${R1}import(${normalizeUrl(from, { changeScriptOrigin })}).then(({${imports}}) => {\n${R1} ${rest\n .split('\\n')\n .map((s) => s.trim())\n .filter(Boolean)\n .join(`\\n${R1} `)}\n${R1}});`);\n }\n }\n }\n\n // Add extra script to export lifecycles\n const bodyBaseIndent = detectIndent(html, $('body').get(0));\n const B1 = bodyBaseIndent + space(2);\n const B2 = B1 + space(2);\n $('body').append(`\n${B1}<script>\n${B2}${exportLifeCycles(appName, { indent: B2 })}\n${B1}</script>\n`);\n const output = $.html();\n return output;\n } else {\n console.warn('\\x1b[33m%s\\x1b[0m', '⚠️ Patch for qiankun failed, because the entry script was not found.');\n return html;\n }\n },\n configureServer(server) {\n const base = server.config.base;\n return () => {\n // Only apply to / i.e. the mount point of the app\n server.middlewares.use((req, res, next) => {\n const end = res.end.bind(res);\n res.end = function (this: typeof res, chunk: unknown, ...rest: any[]) {\n if (typeof chunk === 'string') {\n const $ = load(chunk);\n module2DynamicImport({ $, scriptTag: $(`script[src=\"${base}@vite/client\"]`).get(0), changeScriptOrigin });\n chunk = $.html();\n }\n end(chunk, ...rest);\n return this;\n } as unknown as typeof res.end;\n next();\n });\n };\n },\n };\n};\n\nfunction module2DynamicImport(\n options: { $: CheerioAPI; scriptTag: Element | undefined; ident?: string } & Pick<MicroOption, 'changeScriptOrigin'>,\n) {\n const { $, scriptTag, changeScriptOrigin, ident = '' } = options;\n if (!scriptTag) {\n return;\n }\n const script$ = $(scriptTag);\n const moduleSrc = script$.attr('src');\n script$.removeAttr('src');\n script$.removeAttr('type');\n const space = ident;\n script$.html(`\n${space}import(${normalizeUrl(moduleSrc, { changeScriptOrigin })})`);\n return script$;\n}\n\nfunction exportLifeCycles(qiankunName: string, options?: { indent?: string }) {\n const { indent: space = ' ' } = options ?? {};\n return `\n${space}const makeLifeCycle = (hookName) => {\n${space} const promise = new Promise((resolve, reject) => {\n${space} if (window.proxy) {\n${space} window.proxy[\\`vpq_\\${hookName}\\`] = resolve;\n${space} }\n${space} })\n${space} return (props) => promise.then(fn => fn(props));\n${space}};\n${space}window['${qiankunName}'] = {\n${space} bootstrap: makeLifeCycle('bootstrap'),\n${space} mount: makeLifeCycle('mount'),\n${space} unmount: makeLifeCycle('unmount'),\n${space} update: makeLifeCycle('update')\n${space}};`.trimStart();\n}\n\nexport default qiankunPlugin;\n"],
5
+ "mappings": "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",
6
+ "names": ["url", "_a", "space"]
7
7
  }
package/lib/utils.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Element } from 'domhandler';
2
- export declare function detectIndent(html: string, entryScript: Element | undefined): string;
2
+ export declare function detectIndent(html: string, element: Element | undefined): string;
3
3
  export declare function space(num: number): string;
4
4
  export declare function normalizeUrl(url: string | undefined, options?: {
5
5
  changeScriptOrigin?: boolean;
package/lib/utils.js CHANGED
@@ -24,20 +24,20 @@ __export(utils_exports, {
24
24
  space: () => space
25
25
  });
26
26
  module.exports = __toCommonJS(utils_exports);
27
- function detectIndent(html, entryScript) {
27
+ function detectIndent(html, element) {
28
28
  let baseIndent = "";
29
- if (entryScript == null ? void 0 : entryScript.sourceCodeLocation) {
29
+ if (element == null ? void 0 : element.sourceCodeLocation) {
30
30
  const newline = html.includes("\r\n") ? "\r\n" : "\n";
31
31
  const lines = html.split(newline);
32
- const lineStr = lines[entryScript.sourceCodeLocation.startLine - 1];
32
+ const lineStr = lines[element.sourceCodeLocation.startLine - 1];
33
33
  if (lineStr) {
34
- const startTag = "<script";
34
+ const startTag = `<${element.tagName}`;
35
35
  const tagNameFromHtml = lineStr.substring(
36
- entryScript.sourceCodeLocation.startCol - 1,
37
- entryScript.sourceCodeLocation.startCol - 1 + startTag.length
36
+ element.sourceCodeLocation.startCol - 1,
37
+ element.sourceCodeLocation.startCol - 1 + startTag.length
38
38
  );
39
39
  if (tagNameFromHtml === startTag) {
40
- for (let i = 0; i < entryScript.sourceCodeLocation.startCol - 1; i++) {
40
+ for (let i = 0; i < element.sourceCodeLocation.startCol - 1; i++) {
41
41
  if (/\s/.test(lineStr[i])) {
42
42
  baseIndent += lineStr[i];
43
43
  } else {
@@ -56,7 +56,7 @@ function normalizeUrl(url, options) {
56
56
  const { changeScriptOrigin = true } = options ?? {};
57
57
  let appendBase = "''";
58
58
  if (changeScriptOrigin) {
59
- appendBase = "window.proxy?.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''";
59
+ appendBase = "window.proxy && window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''";
60
60
  }
61
61
  return (url == null ? void 0 : url.match(/^https?/i)) ? `'${url}'` : `(${appendBase}) + '${url}'`;
62
62
  }
package/lib/utils.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/utils.ts"],
4
- "sourcesContent": ["import type { Element } from 'domhandler';\n\nexport function detectIndent(html: string, entryScript: Element | undefined) {\n let baseIndent = '';\n if (entryScript?.sourceCodeLocation) {\n const newline = html.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = html.split(newline);\n const lineStr = lines[entryScript.sourceCodeLocation.startLine - 1];\n if (lineStr) {\n const startTag = '<script';\n const tagNameFromHtml = lineStr.substring(\n entryScript.sourceCodeLocation.startCol - 1,\n entryScript.sourceCodeLocation.startCol - 1 + startTag.length,\n );\n if (tagNameFromHtml === startTag) {\n for (let i = 0; i < entryScript.sourceCodeLocation.startCol - 1; i++) {\n if (/\\s/.test(lineStr[i])) {\n baseIndent += lineStr[i];\n } else {\n break;\n }\n }\n }\n }\n }\n return baseIndent;\n}\n\nexport function space(num: number) {\n return new Array(num + 1).join(' ');\n}\n\nexport function normalizeUrl(url: string | undefined, options?: { changeScriptOrigin?: boolean }) {\n const { changeScriptOrigin = true } = options ?? {};\n let appendBase = \"''\";\n if (changeScriptOrigin) {\n appendBase = \"window.proxy?.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''\";\n }\n return url?.match(/^https?/i) ? `'${url}'` : `(${appendBase}) + '${url}'`;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,aAAa,MAAc,aAAkC;AAC3E,MAAI,aAAa;AACjB,MAAI,2CAAa,oBAAoB;AACnC,UAAM,UAAU,KAAK,SAAS,MAAM,IAAI,SAAS;AACjD,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,UAAM,UAAU,MAAM,YAAY,mBAAmB,YAAY,CAAC;AAClE,QAAI,SAAS;AACX,YAAM,WAAW;AACjB,YAAM,kBAAkB,QAAQ;AAAA,QAC9B,YAAY,mBAAmB,WAAW;AAAA,QAC1C,YAAY,mBAAmB,WAAW,IAAI,SAAS;AAAA,MACzD;AACA,UAAI,oBAAoB,UAAU;AAChC,iBAAS,IAAI,GAAG,IAAI,YAAY,mBAAmB,WAAW,GAAG,KAAK;AACpE,cAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,GAAG;AACzB,0BAAc,QAAQ,CAAC;AAAA,UACzB,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,MAAM,KAAa;AACjC,SAAO,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACpC;AAEO,SAAS,aAAa,KAAyB,SAA4C;AAChG,QAAM,EAAE,qBAAqB,KAAK,IAAI,WAAW,CAAC;AAClD,MAAI,aAAa;AACjB,MAAI,oBAAoB;AACtB,iBAAa;AAAA,EACf;AACA,UAAO,2BAAK,MAAM,eAAc,IAAI,SAAS,IAAI,kBAAkB;AACrE;",
4
+ "sourcesContent": ["import type { Element } from 'domhandler';\n\nexport function detectIndent(html: string, element: Element | undefined) {\n let baseIndent = '';\n if (element?.sourceCodeLocation) {\n const newline = html.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = html.split(newline);\n const lineStr = lines[element.sourceCodeLocation.startLine - 1];\n if (lineStr) {\n const startTag = `<${element.tagName}`;\n const tagNameFromHtml = lineStr.substring(\n element.sourceCodeLocation.startCol - 1,\n element.sourceCodeLocation.startCol - 1 + startTag.length,\n );\n if (tagNameFromHtml === startTag) {\n for (let i = 0; i < element.sourceCodeLocation.startCol - 1; i++) {\n if (/\\s/.test(lineStr[i])) {\n baseIndent += lineStr[i];\n } else {\n break;\n }\n }\n }\n }\n }\n return baseIndent;\n}\n\nexport function space(num: number) {\n return new Array(num + 1).join(' ');\n}\n\nexport function normalizeUrl(url: string | undefined, options?: { changeScriptOrigin?: boolean }) {\n const { changeScriptOrigin = true } = options ?? {};\n let appendBase = \"''\";\n if (changeScriptOrigin) {\n appendBase = \"window.proxy && window.proxy.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ || ''\";\n }\n return url?.match(/^https?/i) ? `'${url}'` : `(${appendBase}) + '${url}'`;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,aAAa,MAAc,SAA8B;AACvE,MAAI,aAAa;AACjB,MAAI,mCAAS,oBAAoB;AAC/B,UAAM,UAAU,KAAK,SAAS,MAAM,IAAI,SAAS;AACjD,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,UAAM,UAAU,MAAM,QAAQ,mBAAmB,YAAY,CAAC;AAC9D,QAAI,SAAS;AACX,YAAM,WAAW,IAAI,QAAQ;AAC7B,YAAM,kBAAkB,QAAQ;AAAA,QAC9B,QAAQ,mBAAmB,WAAW;AAAA,QACtC,QAAQ,mBAAmB,WAAW,IAAI,SAAS;AAAA,MACrD;AACA,UAAI,oBAAoB,UAAU;AAChC,iBAAS,IAAI,GAAG,IAAI,QAAQ,mBAAmB,WAAW,GAAG,KAAK;AAChE,cAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,GAAG;AACzB,0BAAc,QAAQ,CAAC;AAAA,UACzB,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,MAAM,KAAa;AACjC,SAAO,IAAI,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACpC;AAEO,SAAS,aAAa,KAAyB,SAA4C;AAChG,QAAM,EAAE,qBAAqB,KAAK,IAAI,WAAW,CAAC;AAClD,MAAI,aAAa;AACjB,MAAI,oBAAoB;AACtB,iBAAa;AAAA,EACf;AACA,UAAO,2BAAK,MAAM,eAAc,IAAI,SAAS,IAAI,kBAAkB;AACrE;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tiny-codes/vite-plugin-qiankun",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "vite for qiankun. This is a forked version of vite-plugin-qiankun.",
5
5
  "keywords": [
6
6
  "qiankun",
package/readme.md CHANGED
@@ -6,7 +6,7 @@
6
6
  - 一键配置,不影响已有的vite配置
7
7
  - 支持vite开发环境
8
8
 
9
- forked from [vite-plugin-qiankun](https://github.com/tengmaoqing/vite-plugin-qiankun)
9
+ Forked from [vite-plugin-qiankun](https://github.com/tengmaoqing/vite-plugin-qiankun)
10
10
 
11
11
  ## 快速开始
12
12
 
@@ -17,7 +17,7 @@ forked from [vite-plugin-qiankun](https://github.com/tengmaoqing/vite-plugin-qia
17
17
  import qiankun from '@tiny-codes/vite-plugin-qiankun';
18
18
 
19
19
  export default {
20
- // 这里的 'myMicroAppName' 是子应用名,主应用注册时AppName需保持一致
20
+ // 这里的 subApp 是子应用名,主应用注册时 name 需保持一致
21
21
  plugins: [
22
22
  // ...
23
23
  qiankun('subApp'),
@@ -27,30 +27,34 @@ export default {
27
27
 
28
28
  ### 2、在入口文件里面写入乾坤的生命周期配置
29
29
 
30
- ```typescript
30
+ ```ts
31
31
  // main.ts
32
- import { qiankunWindow, renderWithQiankun } from '@tiny-codes/vite-plugin-qiankun';
32
+ import { qiankunWindow, exportQiankunLifeCycles } from '@tiny-codes/vite-plugin-qiankun';
33
33
 
34
- // some code
35
- renderWithQiankun({
36
- mount(props) {
37
- console.log('mount');
38
- render(props);
39
- },
40
- bootstrap() {
41
- console.log('bootstrap');
42
- },
43
- unmount(props: any) {
44
- console.log('unmount');
45
- const { container } = props;
46
- const mountRoot = container?.querySelector('#root');
47
- ReactDOM.unmountComponentAtNode(mountRoot || document.querySelector('#root'));
48
- },
49
- });
34
+ const root = createRoot(document.getElementById('root'));
50
35
 
51
- if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
52
- render({});
36
+ if (qiankunWindow.__POWERED_BY_QIANKUN__) {
37
+ exportQiankunLifeCycles({
38
+ bootstrap(props) {
39
+ console.log('bootstrap');
40
+ },
41
+ mount(props) {
42
+ console.log('mount');
43
+ root.render(<App/>);
44
+ },
45
+ unmount(props) {
46
+ console.log('unmount');
47
+ root.unmount();
48
+ },
49
+ update(props) {
50
+ console.log('update', props);
51
+ }
52
+ });
53
+ }
54
+ else {
55
+ root.render(<App/>);
53
56
  }
57
+
54
58
  ```
55
59
 
56
60
  ### 3、子应用部署到不同的域名
@@ -77,18 +81,45 @@ loadMicroApp(
77
81
 
78
82
  qiankun会默认取最后一个 `script` 标签作为子应用的入口文件,但如果由于特殊原因不能把入口文件放到最后,也可以显式指定入口文件,在script标签上添加 `entry` 属性即可,详情参考[官方文档](https://qiankun.umijs.org/zh/faq)。
79
83
 
80
- ### 5、其它使用注意点 `qiankunWindow`
84
+ ### 5、全局事件
85
+
86
+ 本插件会在子应用加载完成后触发 `qiankun:loaded` 事件,在子应用入口脚本加载失败时触发 `qiankun:fetchEntryError` 事件,在子应用运行时发生错误时触发 `qiankun:runtimeError` 事件。可以通过监听这些事件来处理相应的逻辑,或在页面上显示相应的操作提示。
87
+
88
+ ```typescript
89
+ window.addEventListener('qiankun:loaded', () => {
90
+ console.log('The sub-application has been loaded successfully.');
91
+ });
92
+
93
+ window.addEventListener('qiankun:fetchEntryError', (event) => {
94
+ console.error('The sub-application entry script failed to load', event.detail);
95
+ document.querySelector('#root').innerHTML = `
96
+ If the main application is hosted on a different domain, make sure getPublicPath is configured to return the domain of sub app. For example:
97
+ <pre>
98
+ loadMicroApp({
99
+ name: "subApp",
100
+ entry: 'https://domain-to-subApp/pages'
101
+ }, {
102
+ getPublicPath: () => "https://domain-to-subApp"
103
+ });
104
+ </pre>`;
105
+ });
106
+
107
+ window.addEventListener('qiankun:runtimeError', (event) => {
108
+ console.error('The sub-application runtime error occurred', event.detail);
109
+ });
110
+ ```
111
+
112
+ ### 6、其它使用注意点 `qiankunWindow`
81
113
 
82
114
  因为 esm 模块加载与`qiankun`的实现方式有些冲突,所以使用本插件实现的`qiankun`微应用里面没有运行在js沙盒中。所以在不可避免需要设置window上的属性时,尽量显式地操作js沙盒,否则可能会对其它子应用产生副作用。qiankun沙盒对象的使用方式:
83
115
 
84
116
  ```typescript
85
117
  import { qiankunWindow } from '@tiny-codes/vite-plugin-qiankun';
86
118
 
87
- qiankunWindow.customxxx = 'ssss';
88
-
89
119
  if (qiankunWindow.__POWERED_BY_QIANKUN__) {
90
- console.log('我正在作为子应用运行');
120
+ console.log('I am running as a sub-application');
91
121
  }
122
+ qiankunWindow.foo = 'bar';
92
123
  ```
93
124
 
94
125
  ## 例子