@moluoxixi/create-app 2.0.402 → 2.0.403
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/types/features.d.ts +1 -1
- package/dist/types/features.js +1 -0
- package/package.json +1 -1
- package/templates/react/base/src/main.tsx.ejs +51 -6
- package/templates/react/features/qiankun/package.json +6 -0
- package/templates/react/features/qiankun/src/qiankun/index.ts +80 -0
- package/templates/vue/base/src/main.ts.ejs +9 -25
- package/templates/vue/base/src/router/index.ts.ejs +10 -13
package/dist/types/features.d.ts
CHANGED
|
@@ -20,6 +20,6 @@ export declare const VUE_FEATURES: readonly ["router", "pinia", "eslint", "i18n"
|
|
|
20
20
|
/**
|
|
21
21
|
* React 特性 ID
|
|
22
22
|
*/
|
|
23
|
-
export declare const REACT_FEATURES: readonly ["router", "zustand", "eslint", "i18n", "sentry", "ant-design"];
|
|
23
|
+
export declare const REACT_FEATURES: readonly ["router", "zustand", "eslint", "i18n", "sentry", "qiankun", "ant-design"];
|
|
24
24
|
export type VueFeatureId = typeof VUE_FEATURES[number];
|
|
25
25
|
export type ReactFeatureId = typeof REACT_FEATURES[number];
|
package/dist/types/features.js
CHANGED
package/package.json
CHANGED
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
* 初始化 React 应用并挂载到 DOM
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
<% if (qiankun) { -%>
|
|
7
|
+
import { qiankunWindow, renderWithQiankun } from 'vite-plugin-qiankun/dist/helper'
|
|
8
|
+
<% } -%>
|
|
6
9
|
import React from 'react'
|
|
7
10
|
import ReactDOM from 'react-dom/client'
|
|
8
11
|
import { RouterProvider } from 'react-router-dom'
|
|
@@ -29,11 +32,53 @@ initSentry({
|
|
|
29
32
|
})
|
|
30
33
|
|
|
31
34
|
<% } -%>
|
|
32
|
-
|
|
35
|
+
let root: ReturnType<typeof ReactDOM.createRoot> | null = null
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 渲染应用
|
|
39
|
+
* @param props 渲染属性
|
|
40
|
+
*/
|
|
41
|
+
async function render(props: Record<string, unknown> = {}): Promise<void> {
|
|
42
|
+
const { container } = props as { container?: Element }
|
|
43
|
+
<% if (qiankun) { -%>
|
|
44
|
+
const basename = qiankunWindow.__POWERED_BY_QIANKUN__
|
|
45
|
+
? (qiankunWindow as { __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string }).__INJECTED_PUBLIC_PATH_BY_QIANKUN__?.split('/')[1]
|
|
46
|
+
: undefined
|
|
47
|
+
const router = createRouter({ basename })
|
|
48
|
+
<% } else { -%>
|
|
49
|
+
const router = createRouter()
|
|
50
|
+
<% } -%>
|
|
51
|
+
|
|
52
|
+
const containerElement = container
|
|
53
|
+
? container.querySelector('#root') || container
|
|
54
|
+
: document.getElementById('root')!
|
|
33
55
|
|
|
34
|
-
ReactDOM.createRoot(
|
|
35
|
-
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
56
|
+
root = ReactDOM.createRoot(containerElement)
|
|
57
|
+
root.render(
|
|
58
|
+
<React.StrictMode>
|
|
59
|
+
<RouterProvider router={router} />
|
|
60
|
+
</React.StrictMode>,
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
<% if (qiankun) { -%>
|
|
65
|
+
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
|
|
66
|
+
render({})
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
renderWithQiankun({
|
|
70
|
+
async mount(props: Record<string, unknown>) {
|
|
71
|
+
await render(props)
|
|
72
|
+
},
|
|
73
|
+
bootstrap() {},
|
|
74
|
+
unmount() {
|
|
75
|
+
root?.unmount()
|
|
76
|
+
root = null
|
|
77
|
+
},
|
|
78
|
+
update() {},
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
<% } else { -%>
|
|
82
|
+
render({})
|
|
83
|
+
<% } -%>
|
|
39
84
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { ReactNode } from 'react'
|
|
2
|
+
import type { Router } from '@remix-run/router'
|
|
3
|
+
import {
|
|
4
|
+
renderWithQiankun,
|
|
5
|
+
qiankunWindow,
|
|
6
|
+
} from 'vite-plugin-qiankun/dist/helper'
|
|
7
|
+
|
|
8
|
+
let root: ReturnType<typeof import('react-dom/client').createRoot> | null = null
|
|
9
|
+
let router: Router | null = null
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Qiankun 微前端 Props 接口
|
|
13
|
+
*/
|
|
14
|
+
interface QiankunProps {
|
|
15
|
+
/** 容器元素(可选) */
|
|
16
|
+
container?: Element
|
|
17
|
+
/** 其他自定义属性 */
|
|
18
|
+
[key: string]: unknown
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Qiankun 渲染选项接口
|
|
23
|
+
*/
|
|
24
|
+
interface RenderOptions {
|
|
25
|
+
/** 创建 React 根节点的函数 */
|
|
26
|
+
createRoot: (container: Element | DocumentFragment) => ReturnType<typeof import('react-dom/client').createRoot>
|
|
27
|
+
/** 创建 React Router 实例的函数 */
|
|
28
|
+
createRouter: (basename?: string) => Router
|
|
29
|
+
/** 创建应用组件的函数 */
|
|
30
|
+
createApp: (router: Router) => ReactNode
|
|
31
|
+
/** 容器选择器或元素 */
|
|
32
|
+
container?: string | Element
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 设置 Qiankun 微前端
|
|
37
|
+
* @param options 渲染选项
|
|
38
|
+
*/
|
|
39
|
+
export function setupQiankun(options: RenderOptions): void {
|
|
40
|
+
const { createRoot, createRouter, createApp, container = '#root' } = options
|
|
41
|
+
|
|
42
|
+
renderWithQiankun({
|
|
43
|
+
mount(props: QiankunProps) {
|
|
44
|
+
const containerElement = props.container
|
|
45
|
+
? props.container.querySelector('#root') || props.container
|
|
46
|
+
: typeof container === 'string'
|
|
47
|
+
? document.querySelector(container)!
|
|
48
|
+
: container
|
|
49
|
+
|
|
50
|
+
root = createRoot(containerElement)
|
|
51
|
+
const basename = qiankunWindow.__POWERED_BY_QIANKUN__
|
|
52
|
+
? (qiankunWindow as { __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string }).__INJECTED_PUBLIC_PATH_BY_QIANKUN__?.split('/')[1]
|
|
53
|
+
: undefined
|
|
54
|
+
router = createRouter(basename)
|
|
55
|
+
root.render(createApp(router))
|
|
56
|
+
},
|
|
57
|
+
bootstrap() {
|
|
58
|
+
console.log('[Qiankun] bootstrap')
|
|
59
|
+
},
|
|
60
|
+
unmount() {
|
|
61
|
+
if (root) {
|
|
62
|
+
root.unmount()
|
|
63
|
+
root = null
|
|
64
|
+
router = null
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
update() {
|
|
68
|
+
console.log('[Qiankun] update')
|
|
69
|
+
},
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 判断是否运行在 Qiankun 微前端环境中
|
|
75
|
+
* @returns 是否在 Qiankun 环境中
|
|
76
|
+
*/
|
|
77
|
+
export function isQiankun(): boolean {
|
|
78
|
+
return qiankunWindow.__POWERED_BY_QIANKUN__ || false
|
|
79
|
+
}
|
|
80
|
+
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
<% if (qiankun) { -%>
|
|
7
|
-
import type { QiankunProps } from 'vite-plugin-qiankun/dist/helper'
|
|
8
7
|
import { qiankunWindow, renderWithQiankun } from 'vite-plugin-qiankun/dist/helper'
|
|
9
8
|
<% } -%>
|
|
10
9
|
import { createApp } from 'vue'
|
|
@@ -26,11 +25,14 @@ import '@/assets/styles/element/index.scss'
|
|
|
26
25
|
import '@/assets/styles/main.scss'
|
|
27
26
|
import '@/assets/fonts/index.css'
|
|
28
27
|
|
|
29
|
-
<% if (qiankun) { -%>
|
|
30
28
|
let app: ReturnType<typeof createApp> | null = null
|
|
31
29
|
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
/**
|
|
31
|
+
* 渲染应用
|
|
32
|
+
* @param props 渲染属性
|
|
33
|
+
*/
|
|
34
|
+
async function render(props: Record<string, unknown> = {}): Promise<void> {
|
|
35
|
+
const { container } = props as { container?: Element }
|
|
34
36
|
app = createApp(App)
|
|
35
37
|
|
|
36
38
|
directives(app)
|
|
@@ -59,12 +61,13 @@ async function render(props: QiankunProps = {}): Promise<void> {
|
|
|
59
61
|
}
|
|
60
62
|
}
|
|
61
63
|
|
|
64
|
+
<% if (qiankun) { -%>
|
|
62
65
|
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
|
|
63
66
|
render({})
|
|
64
67
|
}
|
|
65
68
|
else {
|
|
66
69
|
renderWithQiankun({
|
|
67
|
-
async mount(props:
|
|
70
|
+
async mount(props: Record<string, unknown>) {
|
|
68
71
|
await render(props)
|
|
69
72
|
},
|
|
70
73
|
bootstrap() {},
|
|
@@ -76,25 +79,6 @@ else {
|
|
|
76
79
|
})
|
|
77
80
|
}
|
|
78
81
|
<% } else { -%>
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
directives(app)
|
|
82
|
-
const router = getRouter({})
|
|
83
|
-
|
|
84
|
-
<% if (sentry) { -%>
|
|
85
|
-
initSentry(app, router, {
|
|
86
|
-
dsn: import.meta.env.VITE_SENTRY_DSN,
|
|
87
|
-
environment: import.meta.env.MODE,
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
<% } -%>
|
|
91
|
-
app.use(store)
|
|
92
|
-
<% if (i18n) { -%>
|
|
93
|
-
app.use(i18n)
|
|
94
|
-
<% } -%>
|
|
95
|
-
app.use(router)
|
|
96
|
-
app.config.warnHandler = () => null
|
|
97
|
-
|
|
98
|
-
app.mount('#app')
|
|
82
|
+
render({})
|
|
99
83
|
<% } -%>
|
|
100
84
|
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
<% if (qiankun) { -%>
|
|
6
|
-
import type { QiankunProps } from 'vite-plugin-qiankun/dist/helper'
|
|
7
6
|
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
|
|
8
7
|
<% } -%>
|
|
9
8
|
import { createRouter, createWebHistory } from 'vue-router'
|
|
@@ -13,27 +12,25 @@ import routes from '~pages'
|
|
|
13
12
|
import { routes } from './routes'
|
|
14
13
|
<% } -%>
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/**
|
|
16
|
+
* 获取路由实例
|
|
17
|
+
* @param props 路由属性
|
|
18
|
+
* @returns 路由实例
|
|
19
|
+
*/
|
|
20
|
+
export default function getRouter(props: Record<string, unknown> = {}) {
|
|
18
21
|
const router = createRouter({
|
|
19
22
|
history: createWebHistory(
|
|
23
|
+
<% if (qiankun) { -%>
|
|
20
24
|
qiankunWindow.__POWERED_BY_QIANKUN__
|
|
21
25
|
? '/sub-app/'
|
|
22
26
|
: import.meta.env.BASE_URL,
|
|
23
|
-
),
|
|
24
|
-
routes,
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
return router
|
|
28
|
-
}
|
|
29
27
|
<% } else { -%>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
import.meta.env.BASE_URL,
|
|
29
|
+
<% } -%>
|
|
30
|
+
),
|
|
33
31
|
routes,
|
|
34
32
|
})
|
|
35
33
|
|
|
36
34
|
return router
|
|
37
35
|
}
|
|
38
|
-
<% } -%>
|
|
39
36
|
|