@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 +11 -0
- package/es/helper.d.ts +7 -6
- package/es/helper.js +4 -9
- package/es/helper.js.map +1 -1
- package/es/index.js +29 -16
- package/es/index.js.map +1 -1
- package/es/utils.d.ts +1 -1
- package/es/utils.js +7 -7
- package/es/utils.js.map +1 -1
- package/lib/helper.d.ts +7 -6
- package/lib/helper.js +6 -13
- package/lib/helper.js.map +2 -2
- package/lib/index.js +64 -39
- package/lib/index.js.map +3 -3
- package/lib/utils.d.ts +1 -1
- package/lib/utils.js +8 -8
- package/lib/utils.js.map +2 -2
- package/package.json +1 -1
- package/readme.md +57 -26
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
|
|
7
|
-
mount
|
|
8
|
-
unmount
|
|
9
|
-
update
|
|
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
|
|
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
|
|
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
|
-
|
|
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","
|
|
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(), ".
|
|
41
|
-
|
|
42
|
-
|
|
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*{
|
|
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
|
|
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(({
|
|
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(
|
|
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
|
|
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
|
|
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,
|
|
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,
|
|
1
|
+
export function detectIndent(html, element) {
|
|
2
2
|
var baseIndent = '';
|
|
3
|
-
if (
|
|
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[
|
|
6
|
+
var lineStr = lines[element.sourceCodeLocation.startLine - 1];
|
|
7
7
|
if (lineStr) {
|
|
8
|
-
var startTag =
|
|
9
|
-
var tagNameFromHtml = lineStr.substring(
|
|
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 <
|
|
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
|
|
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","
|
|
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
|
|
7
|
-
mount
|
|
8
|
-
unmount
|
|
9
|
-
update
|
|
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
|
|
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
|
-
|
|
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
|
|
27
|
+
var exportQiankunLifeCycles = (qiankunLifeCycle) => {
|
|
29
28
|
if (qiankunWindow == null ? void 0 : qiankunWindow.__POWERED_BY_QIANKUN__) {
|
|
30
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
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(
|
|
49
|
-
|
|
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*{
|
|
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
|
|
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(({
|
|
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}${
|
|
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
|
|
166
|
+
function exportLifeCycles(qiankunName, options) {
|
|
124
167
|
const { indent: space2 = " " } = options ?? {};
|
|
125
168
|
return `
|
|
126
|
-
${space2}const
|
|
127
|
-
${space2}
|
|
128
|
-
${space2}
|
|
129
|
-
${space2}
|
|
130
|
-
${space2}
|
|
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 =>
|
|
175
|
+
${space2} return (props) => promise.then(fn => fn(props));
|
|
143
176
|
${space2}};
|
|
144
|
-
${space2}
|
|
145
|
-
${space2}
|
|
146
|
-
${space2}
|
|
147
|
-
${space2}
|
|
148
|
-
|
|
149
|
-
${space2}(
|
|
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
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAqB;AAGrB,mBAAkD;AAElD,wBAAc,qBANd;AAiCA,IAAM,gBAA0B,CAAC,SAAS,gBAAgB,CAAC,MAAM;AAC/D,QAAM,EAAE,qBAAqB,KAAK,IAAI;AAEtC,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,mBAAmB,MAAc,SAAS;AAvC9C;AAwCM,YAAM,QAAI,qBAAK,MAAM,EAAE,wBAAwB,KAAK,CAAC;AAErD,YAAM,cACJ,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,EAAE,uDAAuD,EAAE,IAAI,CAAC;AAC/F,UAAI,aAAa;AACf,cAAM,uBAAmB,2BAAa,MAAM,WAAW;AACvD,cAAM,KAAK;AACX,cAAM,KAAK,uBAAmB,oBAAM,CAAC;AACrC,cAAM,
|
|
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,
|
|
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,
|
|
27
|
+
function detectIndent(html, element) {
|
|
28
28
|
let baseIndent = "";
|
|
29
|
-
if (
|
|
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[
|
|
32
|
+
const lineStr = lines[element.sourceCodeLocation.startLine - 1];
|
|
33
33
|
if (lineStr) {
|
|
34
|
-
const startTag =
|
|
34
|
+
const startTag = `<${element.tagName}`;
|
|
35
35
|
const tagNameFromHtml = lineStr.substring(
|
|
36
|
-
|
|
37
|
-
|
|
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 <
|
|
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
|
|
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,
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,SAAS,aAAa,MAAc,
|
|
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
package/readme.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
- 一键配置,不影响已有的vite配置
|
|
7
7
|
- 支持vite开发环境
|
|
8
8
|
|
|
9
|
-
|
|
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
|
-
// 这里的
|
|
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
|
-
```
|
|
30
|
+
```ts
|
|
31
31
|
// main.ts
|
|
32
|
-
import { qiankunWindow,
|
|
32
|
+
import { qiankunWindow, exportQiankunLifeCycles } from '@tiny-codes/vite-plugin-qiankun';
|
|
33
33
|
|
|
34
|
-
|
|
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 (
|
|
52
|
-
|
|
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
|
|
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
|
## 例子
|