generator-mico-cli 0.1.18
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/README.md +84 -0
- package/bin/mico.js +316 -0
- package/generators/micro-react/ignore-list.json +8 -0
- package/generators/micro-react/index.js +158 -0
- package/generators/micro-react/templates/.commitlintrc.js +6 -0
- package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +129 -0
- package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +143 -0
- package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +206 -0
- package/generators/micro-react/templates/.cursor/rules/commit-conventions.mdc +111 -0
- package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +295 -0
- package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +275 -0
- package/generators/micro-react/templates/.cursor/rules/micro-frontend.mdc +196 -0
- package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +128 -0
- package/generators/micro-react/templates/.cursor/rules/request-auth.mdc +220 -0
- package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +206 -0
- package/generators/micro-react/templates/.editorconfig +16 -0
- package/generators/micro-react/templates/.env +3 -0
- package/generators/micro-react/templates/.eslintrc.js +30 -0
- package/generators/micro-react/templates/.husky/commit-msg +2 -0
- package/generators/micro-react/templates/.husky/pre-commit +2 -0
- package/generators/micro-react/templates/.lintstagedrc +5 -0
- package/generators/micro-react/templates/.stylelintrc.js +25 -0
- package/generators/micro-react/templates/AGENTS.md +39 -0
- package/generators/micro-react/templates/CICD/start_dev.sh +30 -0
- package/generators/micro-react/templates/CICD/start_local.sh +30 -0
- package/generators/micro-react/templates/CICD/start_prod.sh +30 -0
- package/generators/micro-react/templates/CICD/start_test.sh +30 -0
- package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +19 -0
- package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +19 -0
- package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +19 -0
- package/generators/micro-react/templates/CLAUDE.md +106 -0
- package/generators/micro-react/templates/README.md +84 -0
- package/generators/micro-react/templates/_gitignore +57 -0
- package/generators/micro-react/templates/_npmrc +2 -0
- package/generators/micro-react/templates/apps/layout/.env +4 -0
- package/generators/micro-react/templates/apps/layout/.eslintrc.js +10 -0
- package/generators/micro-react/templates/apps/layout/.lintstagedrc +17 -0
- package/generators/micro-react/templates/apps/layout/.prettierignore +3 -0
- package/generators/micro-react/templates/apps/layout/.prettierrc +8 -0
- package/generators/micro-react/templates/apps/layout/.stylelintrc.js +20 -0
- package/generators/micro-react/templates/apps/layout/README.md +37 -0
- package/generators/micro-react/templates/apps/layout/config/config.dev.ts +54 -0
- package/generators/micro-react/templates/apps/layout/config/config.prod.ts +37 -0
- package/generators/micro-react/templates/apps/layout/config/config.testing.ts +27 -0
- package/generators/micro-react/templates/apps/layout/config/config.ts +132 -0
- package/generators/micro-react/templates/apps/layout/config/routes.ts +13 -0
- package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +78 -0
- package/generators/micro-react/templates/apps/layout/mock/menus.json +100 -0
- package/generators/micro-react/templates/apps/layout/mock/menus.ts +11 -0
- package/generators/micro-react/templates/apps/layout/mock/user.mock.ts +20 -0
- package/generators/micro-react/templates/apps/layout/package.json +45 -0
- package/generators/micro-react/templates/apps/layout/public/font/ar-SA.js +54 -0
- package/generators/micro-react/templates/apps/layout/public/font/default.js +54 -0
- package/generators/micro-react/templates/apps/layout/src/app.tsx +123 -0
- package/generators/micro-react/templates/apps/layout/src/assets/.gitkeep +0 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/cs-auth-manager.ts +220 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +41 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/tool.ts +3 -0
- package/generators/micro-react/templates/apps/layout/src/common/auth/type.ts +6 -0
- package/generators/micro-react/templates/apps/layout/src/common/constants.ts +38 -0
- package/generators/micro-react/templates/apps/layout/src/common/env.ts +73 -0
- package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +69 -0
- package/generators/micro-react/templates/apps/layout/src/common/locale.ts +123 -0
- package/generators/micro-react/templates/apps/layout/src/common/logger.ts +45 -0
- package/generators/micro-react/templates/apps/layout/src/common/menu/index.ts +2 -0
- package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +143 -0
- package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +92 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +73 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +188 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +186 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +132 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/token-refresh.ts +136 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/types.ts +44 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +75 -0
- package/generators/micro-react/templates/apps/layout/src/common/theme.ts +107 -0
- package/generators/micro-react/templates/apps/layout/src/common/types.ts +7 -0
- package/generators/micro-react/templates/apps/layout/src/common/upload/index.ts +2 -0
- package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +401 -0
- package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +47 -0
- package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +35 -0
- package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +25 -0
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +44 -0
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +121 -0
- package/generators/micro-react/templates/apps/layout/src/constants/index.ts +15 -0
- package/generators/micro-react/templates/apps/layout/src/global.less +13 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/index.ts +3 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useAuth.ts +75 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +35 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useMenuState.ts +112 -0
- package/generators/micro-react/templates/apps/layout/src/hooks/useTheme.ts +124 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +109 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +97 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +164 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +165 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/index.less +71 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +91 -0
- package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +20 -0
- package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +19 -0
- package/generators/micro-react/templates/apps/layout/src/models/global.ts +13 -0
- package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
- package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -0
- package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +171 -0
- package/generators/micro-react/templates/apps/layout/src/services/auth.ts +37 -0
- package/generators/micro-react/templates/apps/layout/src/services/oss.ts +40 -0
- package/generators/micro-react/templates/apps/layout/src/styles/arco-override.less +78 -0
- package/generators/micro-react/templates/apps/layout/src/styles/themes/dark/custom-var.less +244 -0
- package/generators/micro-react/templates/apps/layout/src/styles/themes/normal/custom-var.less +195 -0
- package/generators/micro-react/templates/apps/layout/src/styles/variables.less +5 -0
- package/generators/micro-react/templates/apps/layout/src/utils/format.ts +4 -0
- package/generators/micro-react/templates/apps/layout/tailwind.config.js +7 -0
- package/generators/micro-react/templates/apps/layout/tailwind.css +3 -0
- package/generators/micro-react/templates/apps/layout/tsconfig.json +3 -0
- package/generators/micro-react/templates/apps/layout/typings.d.ts +1 -0
- package/generators/micro-react/templates/deployDesc.md +60 -0
- package/generators/micro-react/templates/docs/commit-message.md +98 -0
- package/generators/micro-react/templates/package.json +35 -0
- package/generators/micro-react/templates/packages/shared-styles/README.md +125 -0
- package/generators/micro-react/templates/packages/shared-styles/arco-override.less +78 -0
- package/generators/micro-react/templates/packages/shared-styles/index.less +14 -0
- package/generators/micro-react/templates/packages/shared-styles/package.json +27 -0
- package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +10 -0
- package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +246 -0
- package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +195 -0
- package/generators/micro-react/templates/packages/shared-styles/variables-only.less +301 -0
- package/generators/micro-react/templates/packages/shared-styles/variables.less +363 -0
- package/generators/micro-react/templates/pnpm-workspace.yaml +9 -0
- package/generators/micro-react/templates/scripts/collect-dist.js +68 -0
- package/generators/micro-react/templates/scripts/create-umi-app.sh +61 -0
- package/generators/micro-react/templates/scripts/dev.js +133 -0
- package/generators/micro-react/templates/turbo.json +68 -0
- package/generators/subapp-react/ignore-list.json +7 -0
- package/generators/subapp-react/index.js +189 -0
- package/generators/subapp-react/templates/homepage/.env +4 -0
- package/generators/subapp-react/templates/homepage/README.md +116 -0
- package/generators/subapp-react/templates/homepage/_gitignore +9 -0
- package/generators/subapp-react/templates/homepage/config/config.dev.ts +59 -0
- package/generators/subapp-react/templates/homepage/config/config.prod.ts +41 -0
- package/generators/subapp-react/templates/homepage/config/config.testing.ts +40 -0
- package/generators/subapp-react/templates/homepage/config/config.ts +102 -0
- package/generators/subapp-react/templates/homepage/config/routes.ts +7 -0
- package/generators/subapp-react/templates/homepage/mock/api.mock.ts +59 -0
- package/generators/subapp-react/templates/homepage/package.json +30 -0
- package/generators/subapp-react/templates/homepage/src/app.tsx +80 -0
- package/generators/subapp-react/templates/homepage/src/assets/yay.jpg +0 -0
- package/generators/subapp-react/templates/homepage/src/common/logger.ts +42 -0
- package/generators/subapp-react/templates/homepage/src/common/mainApp.ts +53 -0
- package/generators/subapp-react/templates/homepage/src/common/request.ts +49 -0
- package/generators/subapp-react/templates/homepage/src/global.less +26 -0
- package/generators/subapp-react/templates/homepage/src/pages/index.less +139 -0
- package/generators/subapp-react/templates/homepage/src/pages/index.tsx +342 -0
- package/generators/subapp-react/templates/homepage/src/styles/theme.less +6 -0
- package/generators/subapp-react/templates/homepage/tsconfig.json +3 -0
- package/generators/subapp-react/templates/homepage/typings.d.ts +17 -0
- package/lib/utils.js +165 -0
- package/package.json +31 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 开发指南 - 环境配置、常用命令、调试技巧
|
|
3
|
+
globs: []
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 开发指南
|
|
7
|
+
|
|
8
|
+
## 环境要求
|
|
9
|
+
|
|
10
|
+
- **Node.js**: ≥ 18
|
|
11
|
+
- **pnpm**: 10.18.2(推荐使用 corepack)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 启用 corepack 并安装指定版本 pnpm
|
|
15
|
+
corepack prepare pnpm@10.18.2 --activate
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 项目初始化
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 克隆项目
|
|
22
|
+
git clone <repo-url>
|
|
23
|
+
cd <%= projectName %>
|
|
24
|
+
|
|
25
|
+
# 安装依赖
|
|
26
|
+
pnpm install
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 开发命令
|
|
30
|
+
|
|
31
|
+
### 启动开发服务器
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 交互式选择应用
|
|
35
|
+
pnpm dev
|
|
36
|
+
|
|
37
|
+
# 直接启动指定应用
|
|
38
|
+
pnpm -C apps/layout dev
|
|
39
|
+
|
|
40
|
+
# 启动 layout 应用(不使用 mock)
|
|
41
|
+
pnpm -C apps/layout start:development:no-mock
|
|
42
|
+
|
|
43
|
+
# 使用测试环境配置
|
|
44
|
+
pnpm -C apps/layout start:testing
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 构建命令
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 生产环境构建(默认)
|
|
51
|
+
pnpm build
|
|
52
|
+
|
|
53
|
+
# 开发环境构建
|
|
54
|
+
pnpm build:development
|
|
55
|
+
|
|
56
|
+
# 测试环境构建
|
|
57
|
+
pnpm build:testing
|
|
58
|
+
|
|
59
|
+
# 生产环境构建
|
|
60
|
+
pnpm build:production
|
|
61
|
+
|
|
62
|
+
# 本地构建(不包含环境变量)
|
|
63
|
+
pnpm build:local
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 代码检查
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# 运行 lint
|
|
70
|
+
pnpm lint
|
|
71
|
+
|
|
72
|
+
# 自动修复
|
|
73
|
+
pnpm lint:fix
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 创建新应用
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 在 apps/ 下创建新的 Umi 应用
|
|
80
|
+
pnpm create:umi-app <app-name>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 环境变量配置
|
|
84
|
+
|
|
85
|
+
### 文件优先级
|
|
86
|
+
```
|
|
87
|
+
.env # 基础配置
|
|
88
|
+
.env.local # 本地覆盖(不提交)
|
|
89
|
+
.env.development # 开发环境
|
|
90
|
+
.env.development.local
|
|
91
|
+
.env.testing # 测试环境
|
|
92
|
+
.env.testing.local
|
|
93
|
+
.env.production # 生产环境
|
|
94
|
+
.env.production.local
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 常用变量
|
|
98
|
+
```bash
|
|
99
|
+
# API 基础地址
|
|
100
|
+
API_BASE_URL=https://api.example.com
|
|
101
|
+
|
|
102
|
+
# 代理路径
|
|
103
|
+
PROXY_SUFFIX=/api
|
|
104
|
+
|
|
105
|
+
# 应用 ID
|
|
106
|
+
APP_ID=<%= projectName %>
|
|
107
|
+
|
|
108
|
+
# CDN 公共路径
|
|
109
|
+
CDN_PUBLIC_PATH=/dist/
|
|
110
|
+
|
|
111
|
+
# SSO 配置
|
|
112
|
+
LOGIN_ENDPOINT=/auth/login
|
|
113
|
+
REFRESH_ENDPOINT=/auth/refresh
|
|
114
|
+
EXTERNAL_LOGIN_PATH=https://sso.example.com/login
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## 目录约定
|
|
118
|
+
|
|
119
|
+
### 新建页面
|
|
120
|
+
```
|
|
121
|
+
src/pages/
|
|
122
|
+
├── MyPage/
|
|
123
|
+
│ ├── index.tsx # 页面组件
|
|
124
|
+
│ ├── index.less # 页面样式
|
|
125
|
+
│ └── components/ # 页面私有组件
|
|
126
|
+
│ └── List.tsx
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 新建组件
|
|
130
|
+
```
|
|
131
|
+
src/components/
|
|
132
|
+
├── MyComponent/
|
|
133
|
+
│ ├── index.tsx # 组件入口
|
|
134
|
+
│ ├── index.less # 组件样式
|
|
135
|
+
│ └── types.ts # 类型定义(可选)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 新建 Hook
|
|
139
|
+
```
|
|
140
|
+
src/hooks/
|
|
141
|
+
├── useMyHook.ts # Hook 实现
|
|
142
|
+
└── index.ts # 统一导出
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 新建服务
|
|
146
|
+
```
|
|
147
|
+
src/services/
|
|
148
|
+
├── user.ts # 用户相关 API
|
|
149
|
+
└── auth.ts # 认证相关 API
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 调试技巧
|
|
153
|
+
|
|
154
|
+
### 查看微应用加载日志
|
|
155
|
+
```javascript
|
|
156
|
+
// 在浏览器控制台过滤
|
|
157
|
+
[MicroAppLoader]
|
|
158
|
+
[Layout]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 查看请求日志
|
|
162
|
+
```javascript
|
|
163
|
+
// 在 src/common/request/index.ts 中添加
|
|
164
|
+
addRequestInterceptor(async (ctx) => {
|
|
165
|
+
console.log('[Request]', ctx.url, ctx.options);
|
|
166
|
+
return ctx;
|
|
167
|
+
});
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 主题调试
|
|
171
|
+
```javascript
|
|
172
|
+
// 在控制台切换主题
|
|
173
|
+
document.body.setAttribute('arco-theme', 'dark');
|
|
174
|
+
document.body.setAttribute('data-theme', 'dark');
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Mock 数据
|
|
178
|
+
|
|
179
|
+
### 文件位置
|
|
180
|
+
```
|
|
181
|
+
apps/layout/mock/
|
|
182
|
+
├── menus.json # 菜单数据
|
|
183
|
+
├── menus.ts # 菜单数据处理
|
|
184
|
+
└── user.mock.ts # 用户相关 Mock API
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Mock 文件命名
|
|
188
|
+
- `*.mock.ts` - Mock API 文件
|
|
189
|
+
- `_mock.ts` - 页面级 Mock 文件
|
|
190
|
+
|
|
191
|
+
### 禁用 Mock
|
|
192
|
+
```bash
|
|
193
|
+
# 启动时禁用 mock
|
|
194
|
+
pnpm -C apps/layout start:development:no-mock
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Umi 配置
|
|
198
|
+
|
|
199
|
+
### 路由配置
|
|
200
|
+
```typescript
|
|
201
|
+
// config/routes.ts
|
|
202
|
+
export default [
|
|
203
|
+
{
|
|
204
|
+
path: '/',
|
|
205
|
+
component: '@/layouts/index',
|
|
206
|
+
routes: [
|
|
207
|
+
{ path: '/', component: '@/pages/Home' },
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
];
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 环境配置覆盖
|
|
214
|
+
```typescript
|
|
215
|
+
// config/config.dev.ts
|
|
216
|
+
export default {
|
|
217
|
+
define: {
|
|
218
|
+
'process.env.API_BASE': 'http://localhost:3000',
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## 常见问题
|
|
224
|
+
|
|
225
|
+
### 1. 依赖安装失败
|
|
226
|
+
```bash
|
|
227
|
+
# 清除缓存重新安装
|
|
228
|
+
pnpm store prune
|
|
229
|
+
rm -rf node_modules
|
|
230
|
+
pnpm install
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 2. TypeScript 类型报错
|
|
234
|
+
```bash
|
|
235
|
+
# 重新生成类型
|
|
236
|
+
pnpm -C apps/layout setup
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 3. 样式不生效
|
|
240
|
+
- 检查 Less 文件是否导入
|
|
241
|
+
- 检查类名是否正确
|
|
242
|
+
- 检查主题变量是否使用正确
|
|
243
|
+
|
|
244
|
+
### 4. 微应用加载失败
|
|
245
|
+
- 检查子应用是否启动
|
|
246
|
+
- 检查 CORS 配置
|
|
247
|
+
- 检查 entry URL 是否正确
|
|
248
|
+
- 查看控制台 `[MicroAppLoader]` 日志
|
|
249
|
+
|
|
250
|
+
## CI/CD 构建
|
|
251
|
+
|
|
252
|
+
### Jenkins 构建流程
|
|
253
|
+
|
|
254
|
+
Jenkins 根据不同环境执行 `CICD/` 目录下的脚本:
|
|
255
|
+
|
|
256
|
+
| 环境 | 脚本 | 构建命令 |
|
|
257
|
+
|------|------|---------|
|
|
258
|
+
| 开发 | `CICD/start_dev.sh` | `build:development` |
|
|
259
|
+
| 测试 | `CICD/start_test.sh` | `build:testing` |
|
|
260
|
+
| 生产 | `CICD/start_prod.sh` | `build:production` |
|
|
261
|
+
| 本地 | `CICD/start_local.sh` | `build:local` |
|
|
262
|
+
|
|
263
|
+
### 本地模拟构建
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
# 模拟测试环境构建
|
|
267
|
+
sh CICD/start_test.sh
|
|
268
|
+
|
|
269
|
+
# 模拟生产环境构建
|
|
270
|
+
sh CICD/start_prod.sh
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### CDN 路径
|
|
274
|
+
|
|
275
|
+
构建产物上传到 CDN:
|
|
276
|
+
```
|
|
277
|
+
cdn-portal[-env].micoplatform.com/<%= projectName %>/{version}/dist/{app}/
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
- `version`:`package.json` 的 version 字段
|
|
281
|
+
- `app`:`apps/` 目录下的应用名(layout、homepage 等)
|
|
282
|
+
|
|
283
|
+
### 分支策略
|
|
284
|
+
|
|
285
|
+
| 分支 | 环境 |
|
|
286
|
+
|------|------|
|
|
287
|
+
| `test` | 测试环境 |
|
|
288
|
+
| `main` | 生产环境 |
|
|
289
|
+
|
|
290
|
+
## 相关链接
|
|
291
|
+
|
|
292
|
+
- [UmiJS 文档](https://umijs.org/)
|
|
293
|
+
- [Arco Design](https://arco.design/)
|
|
294
|
+
- [qiankun 文档](https://qiankun.umijs.org/)
|
|
295
|
+
- [Turborepo 文档](https://turbo.build/repo)
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Layout 主应用详解 - 布局组件、菜单系统、路由管理
|
|
3
|
+
globs: ["apps/layout/**"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Layout 主应用
|
|
7
|
+
|
|
8
|
+
## 应用角色
|
|
9
|
+
|
|
10
|
+
Layout 是 qiankun 微前端架构的**主应用**,负责:
|
|
11
|
+
- 提供整体布局框架(Header + Menu + Content)
|
|
12
|
+
- 管理菜单导航和路由
|
|
13
|
+
- 处理认证和授权
|
|
14
|
+
- 加载和管理微前端子应用
|
|
15
|
+
- 提供主题切换功能
|
|
16
|
+
- 共享 request 实例给子应用
|
|
17
|
+
|
|
18
|
+
## 目录结构
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
apps/layout/
|
|
22
|
+
├── config/ # Umi 配置
|
|
23
|
+
│ ├── config.ts # 主配置
|
|
24
|
+
│ ├── config.dev.ts # 开发环境覆盖
|
|
25
|
+
│ ├── config.testing.ts # 测试环境覆盖
|
|
26
|
+
│ ├── config.prod.ts # 生产环境覆盖
|
|
27
|
+
│ └── routes.ts # 静态路由配置
|
|
28
|
+
├── docs/ # 功能文档
|
|
29
|
+
├── mock/ # Mock 数据
|
|
30
|
+
├── public/ # 静态资源
|
|
31
|
+
└── src/
|
|
32
|
+
├── app.tsx # Umi 运行时配置
|
|
33
|
+
├── global.less # 全局样式
|
|
34
|
+
├── layouts/ # 布局组件
|
|
35
|
+
│ ├── index.tsx # 主布局
|
|
36
|
+
│ ├── index.less
|
|
37
|
+
│ └── components/
|
|
38
|
+
│ ├── header/ # 顶部导航
|
|
39
|
+
│ └── menu/ # 侧边菜单
|
|
40
|
+
├── pages/ # 路由页面
|
|
41
|
+
│ └── Home/
|
|
42
|
+
├── components/ # 公共组件
|
|
43
|
+
│ ├── MicroAppLoader/ # 微应用加载器
|
|
44
|
+
│ └── IconFont/ # 图标组件
|
|
45
|
+
├── common/ # 工具模块
|
|
46
|
+
│ ├── auth/ # 认证模块
|
|
47
|
+
│ ├── request/ # 请求封装
|
|
48
|
+
│ ├── menu/ # 菜单解析
|
|
49
|
+
│ ├── upload/ # 上传模块
|
|
50
|
+
│ └── theme.ts # 主题初始化
|
|
51
|
+
├── hooks/ # 自定义 Hooks
|
|
52
|
+
├── services/ # API 服务
|
|
53
|
+
├── models/ # Umi Model
|
|
54
|
+
├── locales/ # 国际化
|
|
55
|
+
└── styles/ # 主题样式
|
|
56
|
+
├── themes/ # 主题变量
|
|
57
|
+
├── variables.less # Less 变量
|
|
58
|
+
└── arco-override.less # Arco 覆盖
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 核心模块
|
|
62
|
+
|
|
63
|
+
### 1. 布局组件 (layouts/index.tsx)
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
const BasicLayout: React.FC = () => {
|
|
67
|
+
const location = useLocation();
|
|
68
|
+
|
|
69
|
+
// 解析路由配置
|
|
70
|
+
const routes = useMemo(() => {
|
|
71
|
+
const menus = getWindowMenus();
|
|
72
|
+
return extractRoutes(menus);
|
|
73
|
+
}, []);
|
|
74
|
+
|
|
75
|
+
// 查找当前路由配置
|
|
76
|
+
const currentRoute = useMemo(() => {
|
|
77
|
+
return findRouteByPath(routes, location.pathname);
|
|
78
|
+
}, [routes, location.pathname]);
|
|
79
|
+
|
|
80
|
+
// 渲染页面内容
|
|
81
|
+
const renderContent = () => {
|
|
82
|
+
// 微应用类型使用 MicroAppLoader
|
|
83
|
+
if (currentRoute?.loadType === 'microapp' && currentRoute.entry) {
|
|
84
|
+
return <MicroAppLoader entry={currentRoute.entry} name={currentRoute.path} />;
|
|
85
|
+
}
|
|
86
|
+
// 内部路由使用 Outlet
|
|
87
|
+
return <Outlet />;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
return (
|
|
91
|
+
<Layout className="layout-container">
|
|
92
|
+
<LayoutHeader />
|
|
93
|
+
<Layout className="layout-content">
|
|
94
|
+
<LayoutMenu />
|
|
95
|
+
<Layout className="layout-content-right">
|
|
96
|
+
<Content>{renderContent()}</Content>
|
|
97
|
+
</Layout>
|
|
98
|
+
</Layout>
|
|
99
|
+
</Layout>
|
|
100
|
+
);
|
|
101
|
+
};
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 2. 菜单系统 (common/menu/)
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
// 获取菜单数据
|
|
108
|
+
const menus = getWindowMenus();
|
|
109
|
+
|
|
110
|
+
// 提取路由配置
|
|
111
|
+
const routes = extractRoutes(menus);
|
|
112
|
+
|
|
113
|
+
// 解析菜单项
|
|
114
|
+
const menuItems = parseMenuItems(menus);
|
|
115
|
+
|
|
116
|
+
// 查找当前路由
|
|
117
|
+
const currentRoute = findRouteByPath(routes, pathname);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 3. 动态路由 (app.tsx)
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
export function patchClientRoutes({ routes }: { routes: any[] }) {
|
|
124
|
+
const menus = getWindowMenus();
|
|
125
|
+
const dynamicRoutes = extractRoutes(menus);
|
|
126
|
+
|
|
127
|
+
const rootRoute = routes.find((r) => r.path === '/');
|
|
128
|
+
dynamicRoutes.forEach((route) => {
|
|
129
|
+
rootRoute.routes.push({
|
|
130
|
+
path: route.path,
|
|
131
|
+
name: route.name,
|
|
132
|
+
meta: {
|
|
133
|
+
loadType: route.loadType,
|
|
134
|
+
htmlUrl: route.htmlUrl,
|
|
135
|
+
jsUrls: route.jsUrls,
|
|
136
|
+
cssUrls: route.cssUrls,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 4. 认证初始化 (app.tsx)
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
export async function getInitialState() {
|
|
147
|
+
const authInfo = getAuthInfo();
|
|
148
|
+
return {
|
|
149
|
+
currentUser: {
|
|
150
|
+
name: authInfo.nickname,
|
|
151
|
+
avatar: authInfo.avatar,
|
|
152
|
+
userid: authInfo.uid,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Umi 配置要点
|
|
159
|
+
|
|
160
|
+
### config/config.ts
|
|
161
|
+
```typescript
|
|
162
|
+
export default defineConfig({
|
|
163
|
+
// 挂载元素
|
|
164
|
+
mountElementId: '<%= projectName %>',
|
|
165
|
+
|
|
166
|
+
// 禁用内置 layout,使用自定义布局
|
|
167
|
+
layout: false,
|
|
168
|
+
|
|
169
|
+
// 国际化
|
|
170
|
+
locale: {
|
|
171
|
+
default: 'zh-CN',
|
|
172
|
+
antd: false,
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
// qiankun 主应用配置
|
|
176
|
+
qiankun: {
|
|
177
|
+
master: {
|
|
178
|
+
apps: [], // 子应用在运行时动态注册
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
// Tailwind CSS
|
|
183
|
+
tailwindcss: {},
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## 常用 Hooks
|
|
188
|
+
|
|
189
|
+
### useTheme
|
|
190
|
+
```typescript
|
|
191
|
+
const { theme, isDark, toggleTheme, setTheme } = useTheme();
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### useMenu
|
|
195
|
+
```typescript
|
|
196
|
+
const { menuItems, selectedKey, openKeys } = useMenu();
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### useAuth
|
|
200
|
+
```typescript
|
|
201
|
+
const { isAuthenticated, user, logout } = useAuth();
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 样式系统
|
|
205
|
+
|
|
206
|
+
### 主题变量引入
|
|
207
|
+
```less
|
|
208
|
+
// 在组件样式中使用
|
|
209
|
+
@import '@/styles/variables.less';
|
|
210
|
+
|
|
211
|
+
.my-component {
|
|
212
|
+
background: @color-fill-1;
|
|
213
|
+
color: @color-text-2;
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Tailwind CSS 使用
|
|
218
|
+
```tsx
|
|
219
|
+
<div className="flex items-center gap-4 p-4">
|
|
220
|
+
<span className="text-gray-600">标题</span>
|
|
221
|
+
</div>
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## 国际化
|
|
225
|
+
|
|
226
|
+
### 定义翻译
|
|
227
|
+
```typescript
|
|
228
|
+
// locales/zh-CN.ts
|
|
229
|
+
export default {
|
|
230
|
+
'menu.home': '首页',
|
|
231
|
+
'menu.settings': '设置',
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
// locales/en-US.ts
|
|
235
|
+
export default {
|
|
236
|
+
'menu.home': 'Home',
|
|
237
|
+
'menu.settings': 'Settings',
|
|
238
|
+
};
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 使用翻译
|
|
242
|
+
```tsx
|
|
243
|
+
import { useIntl } from '@umijs/max';
|
|
244
|
+
|
|
245
|
+
const { formatMessage } = useIntl();
|
|
246
|
+
const title = formatMessage({ id: 'menu.home' });
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Model 状态管理
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
// models/global.ts
|
|
253
|
+
export default {
|
|
254
|
+
namespace: 'global',
|
|
255
|
+
state: {
|
|
256
|
+
collapsed: false,
|
|
257
|
+
},
|
|
258
|
+
reducers: {
|
|
259
|
+
toggleCollapsed(state) {
|
|
260
|
+
return { ...state, collapsed: !state.collapsed };
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// 使用
|
|
266
|
+
const { collapsed } = useModel('global');
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## 注意事项
|
|
270
|
+
|
|
271
|
+
1. **菜单数据来源**: 通过 `window.__MICO_MENUS__` 注入
|
|
272
|
+
2. **路由动态生成**: 在 `patchClientRoutes` 中根据菜单生成路由
|
|
273
|
+
3. **微应用判断**: 根据 `htmlUrl` 或 `jsUrls` 判断是否为微应用
|
|
274
|
+
4. **主题初始化**: 在 `app.tsx` 中调用 `initTheme()` 避免闪烁
|
|
275
|
+
5. **认证共享**: 子应用使用主应用传递的 `request` 实例
|