@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.
@@ -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];
@@ -36,5 +36,6 @@ export const REACT_FEATURES = [
36
36
  'eslint',
37
37
  'i18n',
38
38
  'sentry',
39
+ 'qiankun',
39
40
  'ant-design',
40
41
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moluoxixi/create-app",
3
- "version": "2.0.402",
3
+ "version": "2.0.403",
4
4
  "type": "module",
5
5
  "description": "Create Vue/React projects with atomic layered architecture",
6
6
  "main": "dist/index.js",
@@ -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
- const router = createRouter()
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(document.getElementById('root')!).render(
35
- <React.StrictMode>
36
- <RouterProvider router={router} />
37
- </React.StrictMode>,
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,6 @@
1
+ {
2
+ "dependencies": {
3
+ "vite-plugin-qiankun": "^1.0.15"
4
+ }
5
+ }
6
+
@@ -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
- async function render(props: QiankunProps = {}): Promise<void> {
33
- const { container } = props
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: QiankunProps) {
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
- const app = createApp(App)
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
- <% if (qiankun) { -%>
17
- export default function getRouter(props: QiankunProps = {}) {
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
- export default function getRouter(_props: Record<string, unknown> = {}) {
31
- const router = createRouter({
32
- history: createWebHistory(import.meta.env.BASE_URL),
28
+ import.meta.env.BASE_URL,
29
+ <% } -%>
30
+ ),
33
31
  routes,
34
32
  })
35
33
 
36
34
  return router
37
35
  }
38
- <% } -%>
39
36