generator-mico-cli 0.2.1 → 0.2.2-8.beta.1
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 +199 -15
- package/bin/mico.js +232 -27
- package/generators/micro-react/index.js +200 -18
- package/generators/micro-react/meta.json +13 -0
- package/generators/micro-react/templates/.commitlintrc.js +1 -0
- package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +14 -4
- package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +10 -8
- package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +1 -1
- package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +3 -4
- package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +38 -31
- package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +7 -4
- package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +10 -12
- package/generators/micro-react/templates/.eslintrc.js +25 -1
- package/generators/micro-react/templates/AGENTS.md +5 -2
- package/generators/micro-react/templates/CICD/before_build.sh +76 -0
- package/generators/micro-react/templates/CICD/start_dev.sh +27 -3
- package/generators/micro-react/templates/CICD/start_prod.sh +26 -3
- package/generators/micro-react/templates/CICD/start_test.sh +28 -3
- package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +4 -4
- package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +4 -4
- package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +4 -4
- package/generators/micro-react/templates/CLAUDE.md +16 -9
- package/generators/micro-react/templates/README.md +42 -4
- package/generators/micro-react/templates/_gitignore +4 -0
- package/generators/micro-react/templates/_npmrc +4 -0
- package/generators/micro-react/templates/apps/layout/config/config.dev.ts +32 -16
- package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +24 -29
- package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +25 -6
- package/generators/micro-react/templates/apps/layout/config/config.prod.ts +16 -7
- package/generators/micro-react/templates/apps/layout/config/config.ts +27 -4
- package/generators/micro-react/templates/apps/layout/config/routes.ts +5 -5
- package/generators/micro-react/templates/apps/layout/docs/arch-/346/227/245/345/277/227/344/270/216/345/270/270/351/207/217.md +2 -2
- package/generators/micro-react/templates/apps/layout/docs/common-intl.md +372 -0
- package/generators/micro-react/templates/apps/layout/docs/feat-/346/236/204/345/273/272define/344/270/216/345/205/215/350/256/244/350/257/201/345/210/235/345/247/213/346/200/201.md +44 -0
- package/generators/micro-react/templates/apps/layout/docs/feature-404/351/241/265/351/235/242.md +103 -0
- package/generators/micro-react/templates/apps/layout/docs/feature-/344/270/273/351/242/230/350/211/262/345/210/207/346/215/242.md +22 -26
- package/generators/micro-react/templates/apps/layout/docs/feature-/345/276/256/345/211/215/347/253/257/346/250/241/345/274/217.md +185 -28
- package/generators/micro-react/templates/apps/layout/docs/feature-/350/217/234/345/215/225/346/235/203/351/231/220/346/216/247/345/210/266.md +308 -63
- package/generators/micro-react/templates/apps/layout/docs/feature-/350/267/257/347/224/261/344/270/216/350/217/234/345/215/225/350/247/243/350/200/246.md +179 -0
- package/generators/micro-react/templates/apps/layout/docs/fix-SSO/346/227/240/351/231/220/351/207/215/345/256/232/345/220/221.md +88 -0
- package/generators/micro-react/templates/apps/layout/docs/utils-timezone.md +324 -0
- package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +81 -61
- package/generators/micro-react/templates/apps/layout/mock/menus.ts +114 -4
- package/generators/micro-react/templates/apps/layout/mock/pages.ts +86 -0
- package/generators/micro-react/templates/apps/layout/package.json +7 -4
- package/generators/micro-react/templates/apps/layout/src/app.tsx +111 -76
- package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +3 -0
- package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +177 -0
- package/generators/micro-react/templates/apps/layout/src/common/locale.ts +22 -17
- package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +192 -42
- package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +69 -5
- package/generators/micro-react/templates/apps/layout/src/common/micro/index.ts +34 -0
- package/generators/micro-react/templates/apps/layout/src/common/micro-prefetch.ts +109 -0
- package/generators/micro-react/templates/apps/layout/src/common/portal-data.ts +45 -0
- package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +72 -10
- package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +2 -2
- package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +31 -3
- package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +29 -11
- package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/common/route-guard.ts +345 -0
- package/generators/micro-react/templates/apps/layout/src/common/theme.ts +2 -4
- package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +3 -4
- package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.less +8 -3
- package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.tsx +25 -8
- package/generators/micro-react/templates/apps/layout/src/components/HeaderDropdown/index.tsx +20 -0
- package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +5 -6
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +21 -6
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +83 -149
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/micro-app-manager.ts +569 -0
- package/generators/micro-react/templates/apps/layout/src/components/RightContent/AvatarDropdown.tsx +383 -0
- package/generators/micro-react/templates/apps/layout/src/components/RightContent/avatar-dropdown.less +35 -0
- package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +2 -0
- package/generators/micro-react/templates/apps/layout/src/constants/index.ts +170 -6
- package/generators/micro-react/templates/apps/layout/src/global.less +18 -9
- package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +3 -2
- package/generators/micro-react/templates/apps/layout/src/hooks/useRoutePermissionRefresh.ts +72 -0
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +3 -1
- package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +10 -55
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +34 -4
- package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +24 -8
- package/generators/micro-react/templates/apps/layout/src/layouts/index.less +84 -13
- package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +156 -69
- package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +12 -0
- package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +12 -0
- package/generators/micro-react/templates/apps/layout/src/pages/403/index.tsx +8 -2
- package/generators/micro-react/templates/apps/layout/src/pages/404/index.tsx +78 -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 -1
- package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.less +1 -1
- package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.tsx +3 -3
- package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +1 -1
- package/generators/micro-react/templates/apps/layout/src/services/config/index.ts +63 -0
- package/generators/micro-react/templates/apps/layout/src/services/config/type.ts +30 -0
- package/generators/micro-react/templates/apps/layout/src/services/user.ts +29 -2
- package/generators/micro-react/templates/apps/layout/tailwind.config.js +3 -0
- package/generators/micro-react/templates/deployDesc.md +3 -3
- package/generators/micro-react/templates/dev.preset.json +14 -0
- package/generators/micro-react/templates/docs/dev-preset.md +130 -0
- package/generators/micro-react/templates/package.json +21 -6
- package/generators/micro-react/templates/packages/common-intl/README.md +427 -0
- package/generators/micro-react/templates/packages/common-intl/package.json +34 -0
- package/generators/micro-react/templates/packages/common-intl/src/index.ts +7 -0
- package/generators/micro-react/templates/packages/common-intl/src/indexedDBUtils.ts +51 -0
- package/generators/micro-react/templates/packages/common-intl/src/intl.ts +50 -0
- package/generators/micro-react/templates/packages/common-intl/src/utils.ts +482 -0
- package/generators/micro-react/templates/packages/common-intl/tsconfig.json +22 -0
- package/generators/micro-react/templates/packages/common-intl/vite.config.ts +25 -0
- package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +45 -0
- package/generators/micro-react/templates/scripts/collect-dist.js +10 -0
- package/generators/micro-react/templates/scripts/dev-preset.js +265 -0
- package/generators/micro-react/templates/scripts/dev-preset.schema.json +39 -0
- package/generators/micro-react/templates/turbo.json +4 -1
- package/generators/subapp-react/index.js +326 -40
- package/generators/subapp-react/meta.json +10 -0
- package/generators/subapp-react/templates/homepage/.env +2 -1
- package/generators/subapp-react/templates/homepage/README.md +3 -3
- package/generators/subapp-react/templates/homepage/config/config.dev.ts +14 -7
- package/generators/subapp-react/templates/homepage/config/config.prod.development.ts +16 -5
- package/generators/subapp-react/templates/homepage/config/config.prod.testing.ts +16 -5
- package/generators/subapp-react/templates/homepage/config/config.prod.ts +14 -5
- package/generators/subapp-react/templates/homepage/config/config.ts +21 -0
- package/generators/subapp-react/templates/homepage/config/routes.ts +2 -2
- package/generators/subapp-react/templates/homepage/mock/api.mock.ts +2 -2
- package/generators/subapp-react/templates/homepage/package.json +7 -4
- package/generators/subapp-react/templates/homepage/src/app.tsx +18 -27
- package/generators/subapp-react/templates/homepage/src/common/request.ts +29 -2
- package/generators/subapp-react/templates/homepage/src/global.less +6 -5
- package/generators/subapp-react/templates/homepage/src/pages/index.less +3 -3
- package/generators/subapp-react/templates/homepage/src/pages/index.tsx +99 -60
- package/generators/subapp-react/templates/homepage/src/styles/theme.less +1 -1
- package/generators/subapp-umd/ignore-list.json +5 -0
- package/generators/subapp-umd/index.js +309 -0
- package/generators/subapp-umd/meta.json +11 -0
- package/generators/subapp-umd/templates/README.md +94 -0
- package/generators/subapp-umd/templates/package.json +35 -0
- package/generators/subapp-umd/templates/public/index.html +34 -0
- package/generators/subapp-umd/templates/src/App.less +15 -0
- package/generators/subapp-umd/templates/src/App.tsx +13 -0
- package/generators/subapp-umd/templates/src/index.ts +2 -0
- package/generators/subapp-umd/templates/tsconfig.json +27 -0
- package/generators/subapp-umd/templates/webpack.config.js +70 -0
- package/lib/utils.js +332 -2
- package/package.json +15 -2
- package/generators/micro-react/templates/apps/layout/mock/menus.json +0 -100
- package/generators/micro-react/templates/apps/layout/src/common/constants.ts +0 -38
- package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/container-manager.ts +0 -202
- package/generators/micro-react/templates/packages/shared-styles/README.md +0 -124
- package/generators/micro-react/templates/packages/shared-styles/arco-design-mobile-override.less +0 -91
- package/generators/micro-react/templates/packages/shared-styles/arco-override.less +0 -119
- package/generators/micro-react/templates/packages/shared-styles/index.d.ts +0 -44
- package/generators/micro-react/templates/packages/shared-styles/index.less +0 -13
- package/generators/micro-react/templates/packages/shared-styles/package.json +0 -30
- package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +0 -10
- package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +0 -290
- package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +0 -269
- package/generators/micro-react/templates/packages/shared-styles/variables-only.less +0 -433
- package/generators/micro-react/templates/packages/shared-styles/variables.less +0 -452
|
@@ -18,7 +18,7 @@ globs: ["**/themes/**", "**/useTheme**", "**/*.less"]
|
|
|
18
18
|
│ └─────────────────────────────────────────────────────────┘│
|
|
19
19
|
│ ↓ │
|
|
20
20
|
│ ┌─────────────────────────────────────────────────────────┐│
|
|
21
|
-
│ │ body[arco-theme="dark"] →
|
|
21
|
+
│ │ body[arco-theme="dark"] → @mico-platform/ui 组件 ││
|
|
22
22
|
│ │ body[data-theme="dark"] → 自定义 CSS 变量 ││
|
|
23
23
|
│ └─────────────────────────────────────────────────────────┘│
|
|
24
24
|
└─────────────────────────────────────────────────────────────┘
|
|
@@ -28,12 +28,10 @@ globs: ["**/themes/**", "**/useTheme**", "**/*.less"]
|
|
|
28
28
|
|
|
29
29
|
| 文件 | 说明 |
|
|
30
30
|
|------|------|
|
|
31
|
-
| `
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
| `packages/shared-styles/themes/dark/custom-var.less` | 暗黑主题变量 |
|
|
36
|
-
| `packages/shared-styles/arco-override.less` | Arco Design 变量覆盖 |
|
|
31
|
+
| `@mico-platform/theme` | **主题包(主应用和子应用共用)** |
|
|
32
|
+
| `@mico-platform/theme` | 主入口,CSS 变量 + Less 变量 |
|
|
33
|
+
| `@mico-platform/theme/variables` | 仅 Less 变量(子应用用) |
|
|
34
|
+
| `@mico-platform/theme/theme-inject` | 子应用独立运行时注入主题 |
|
|
37
35
|
| `apps/layout/src/hooks/useTheme.ts` | 主题管理 Hook |
|
|
38
36
|
| `apps/layout/src/common/theme.ts` | 主题初始化 |
|
|
39
37
|
|
|
@@ -54,7 +52,7 @@ interface UseThemeReturn {
|
|
|
54
52
|
### 使用示例
|
|
55
53
|
```tsx
|
|
56
54
|
import { useTheme } from '@/hooks/useTheme';
|
|
57
|
-
import { IconSun, IconMoon } from '@
|
|
55
|
+
import { IconSun, IconMoon } from '@mico-platform/ui/ic';
|
|
58
56
|
|
|
59
57
|
const ThemeToggle: React.FC = () => {
|
|
60
58
|
const { isDark, toggleTheme } = useTheme();
|
|
@@ -124,7 +122,7 @@ body[data-theme='dark'] {
|
|
|
124
122
|
|
|
125
123
|
## 主要颜色变量
|
|
126
124
|
|
|
127
|
-
>
|
|
125
|
+
> 完整列表见:@mico-platform/theme 包文档
|
|
128
126
|
|
|
129
127
|
| 分类 | 变量 | 说明 |
|
|
130
128
|
|------|------|------|
|
|
@@ -139,7 +137,7 @@ body[data-theme='dark'] {
|
|
|
139
137
|
```typescript
|
|
140
138
|
const applyTheme = (theme: Theme) => {
|
|
141
139
|
if (theme === 'dark') {
|
|
142
|
-
//
|
|
140
|
+
// @mico-platform/ui 暗黑模式(arco-theme)
|
|
143
141
|
document.body.setAttribute('arco-theme', 'dark');
|
|
144
142
|
// 自定义 CSS 变量
|
|
145
143
|
document.body.setAttribute('data-theme', 'dark');
|
|
@@ -178,7 +176,7 @@ const getStoredTheme = (): Theme => {
|
|
|
178
176
|
|
|
179
177
|
```less
|
|
180
178
|
// global.less - 仅导入 Less 变量(不打包 CSS 变量)
|
|
181
|
-
@import '
|
|
179
|
+
@import '@mico-platform/theme/variables';
|
|
182
180
|
```
|
|
183
181
|
|
|
184
182
|
```typescript
|
|
@@ -203,4 +201,4 @@ if (process.env.NODE_ENV === 'development') {
|
|
|
203
201
|
3. **优先 Less 变量**: 使用 Less 变量有编辑器提示和类型检查
|
|
204
202
|
4. **避免硬编码颜色**: 所有颜色都应使用主题变量
|
|
205
203
|
5. **系统跟随**: 未手动设置主题时会跟随系统偏好变化
|
|
206
|
-
6. **子应用共享**: 子应用使用
|
|
204
|
+
6. **子应用共享**: 子应用使用 `@mico-platform/theme` 包复用主题
|
|
@@ -19,12 +19,36 @@ module.exports = {
|
|
|
19
19
|
},
|
|
20
20
|
],
|
|
21
21
|
},
|
|
22
|
-
|
|
22
|
+
// TypeScript 文件使用专门的 parser
|
|
23
|
+
overrides: [
|
|
24
|
+
{
|
|
25
|
+
files: ["*.ts", "*.tsx"],
|
|
26
|
+
parser: "@typescript-eslint/parser",
|
|
27
|
+
plugins: ["@typescript-eslint"],
|
|
28
|
+
extends: [
|
|
29
|
+
"eslint:recommended",
|
|
30
|
+
"plugin:@typescript-eslint/recommended",
|
|
31
|
+
],
|
|
32
|
+
rules: {
|
|
33
|
+
// 使用 TS 版本的 no-unused-vars
|
|
34
|
+
"no-unused-vars": "off",
|
|
35
|
+
"@typescript-eslint/no-unused-vars": [
|
|
36
|
+
"warn",
|
|
37
|
+
{
|
|
38
|
+
argsIgnorePattern: "^_",
|
|
39
|
+
varsIgnorePattern: "^_",
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
// 忽略 apps/ 子包和 scripts/,apps由内部的eslint规则处理
|
|
23
46
|
ignorePatterns: [
|
|
24
47
|
'node_modules/',
|
|
25
48
|
'dist/',
|
|
26
49
|
'apps/',
|
|
27
50
|
'scripts/',
|
|
51
|
+
'**/*.d.ts',
|
|
28
52
|
],
|
|
29
53
|
};
|
|
30
54
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
- `apps/` 存放业务应用。当前应用:`apps/layout/`(主应用)、`apps/subapp/`(子应用)。
|
|
6
6
|
- 应用源码位于 `apps/<app>/src/`,包含 `pages/`、`layouts/`、`components/`、`common/`、`hooks/`、`styles/` 等目录。
|
|
7
|
-
- `packages/`
|
|
7
|
+
- `packages/` 可存放其他共享包。
|
|
8
8
|
- `scripts/` 包含仓库工具脚本(如 `scripts/dev.js`、`scripts/collect-dist.js`)。
|
|
9
9
|
- `docs/` 存放工作流文档;`CICD/` 包含部署相关资源。
|
|
10
10
|
- `dist/` 是生成的构建产物(收集于仓库根目录)。
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
- **Monorepo**:Turborepo + pnpm Workspace
|
|
15
15
|
- **前端框架**:UmiJS 4 / @umijs/max、React 18、TypeScript
|
|
16
16
|
- **微前端**:qiankun
|
|
17
|
-
- **UI
|
|
17
|
+
- **UI 组件**:@mico-platform/ui
|
|
18
18
|
- **样式方案**:Tailwind CSS + Less
|
|
19
19
|
- **代码规范**:ESLint、Stylelint、Husky、Commitlint
|
|
20
20
|
|
|
@@ -22,6 +22,9 @@
|
|
|
22
22
|
|
|
23
23
|
- `pnpm install` 安装 workspace 依赖。
|
|
24
24
|
- `pnpm dev` 运行交互式开发启动器(选择应用)。
|
|
25
|
+
- `pnpm dev:preset` 根据 `dev.preset.json` 配置,一次性并行启动多个应用。
|
|
26
|
+
- `pnpm dev:preset <preset>` 使用指定预设启动多应用。
|
|
27
|
+
- `pnpm list:preset` 列出所有可用的启动预设。
|
|
25
28
|
- `pnpm -C apps/<app> dev` 直接运行指定应用。
|
|
26
29
|
- `pnpm build` 构建所有应用用于生产环境;`pnpm build:development|testing|production|local` 设置不同环境模式。
|
|
27
30
|
- `pnpm lint` 运行 ESLint + Turbo lint 检查;`pnpm lint:fix` 自动修复。
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# 计算当前构建分支的 BASE_REF,并为 Turbo 增量构建准备 TURBO_FILTER
|
|
4
|
+
# 该脚本会被其他脚本 source 调用,不要在这里直接 exit 1
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
# 获取项目根目录(如果调用方已设置 PROJECT_ROOT,则使用;否则使用当前工作目录)
|
|
9
|
+
PROJECT_ROOT="${PROJECT_ROOT:-$(pwd)}"
|
|
10
|
+
|
|
11
|
+
# 获取当前构建的分支(去掉 origin/ 前缀,用于比较)
|
|
12
|
+
# 优先使用环境变量 CURRENT_BRANCH(Jenkins 传入,格式可能是 origin/main、origin/feat/xxx)
|
|
13
|
+
# 其次使用 BRANCH_OR_TAG,最后从 git 获取
|
|
14
|
+
if [ -n "${CURRENT_BRANCH}" ]; then
|
|
15
|
+
CURRENT_BRANCH_NAME="${CURRENT_BRANCH#origin/}" # 去掉 origin/ 前缀
|
|
16
|
+
elif [ -n "${BRANCH_OR_TAG}" ]; then
|
|
17
|
+
CURRENT_BRANCH_NAME="${BRANCH_OR_TAG#origin/}" # 去掉 origin/ 前缀
|
|
18
|
+
else
|
|
19
|
+
CURRENT_BRANCH_NAME="$(git rev-parse --abbrev-ref HEAD)"
|
|
20
|
+
fi
|
|
21
|
+
|
|
22
|
+
echo "[before_build] Current branch (without origin/): ${CURRENT_BRANCH_NAME}"
|
|
23
|
+
|
|
24
|
+
# 比较当前分支和上次成功构建的分支是否一致
|
|
25
|
+
# LAST_SUCCESS_BRANCH 由 Jenkins 在构建时设置(从上次构建的结果中获取,格式可能是 origin/main、origin/feat/xxx)
|
|
26
|
+
if [ -n "${LAST_SUCCESS_BRANCH}" ]; then
|
|
27
|
+
# 去掉 LAST_SUCCESS_BRANCH 的 origin/ 前缀,用于比较
|
|
28
|
+
LAST_SUCCESS_BRANCH_NAME="${LAST_SUCCESS_BRANCH#origin/}"
|
|
29
|
+
echo "[before_build] Last success branch (without origin/): ${LAST_SUCCESS_BRANCH_NAME}"
|
|
30
|
+
|
|
31
|
+
if [ "${CURRENT_BRANCH_NAME}" != "${LAST_SUCCESS_BRANCH_NAME}" ]; then
|
|
32
|
+
# 分支不一致,需要全量构建
|
|
33
|
+
echo "[before_build] Branch changed: ${LAST_SUCCESS_BRANCH_NAME} -> ${CURRENT_BRANCH_NAME}, will perform full build (no filter)"
|
|
34
|
+
unset TURBO_FILTER
|
|
35
|
+
else
|
|
36
|
+
# 分支一致,尝试使用 PREVIOUS_COMMIT 进行增量构建
|
|
37
|
+
echo "[before_build] Branch unchanged: ${CURRENT_BRANCH_NAME}, checking PREVIOUS_COMMIT for incremental build"
|
|
38
|
+
if [ -n "${PREVIOUS_COMMIT}" ]; then
|
|
39
|
+
# 验证 commit 是否存在且有效
|
|
40
|
+
if git rev-parse --verify "${PREVIOUS_COMMIT}" >/dev/null 2>&1; then
|
|
41
|
+
# 关键检查:验证 PREVIOUS_COMMIT 是否是当前 HEAD 的祖先
|
|
42
|
+
# 这可以避免以下问题:
|
|
43
|
+
# 1. Rebase/Force push:PREVIOUS_COMMIT 不再是当前分支的祖先
|
|
44
|
+
# 2. Tag 被其他分支更新:PREVIOUS_COMMIT 不是当前分支的祖先
|
|
45
|
+
CURRENT_HEAD="$(git rev-parse HEAD)"
|
|
46
|
+
if git merge-base --is-ancestor "${PREVIOUS_COMMIT}" "${CURRENT_HEAD}" 2>/dev/null; then
|
|
47
|
+
# PREVIOUS_COMMIT 是当前 HEAD 的祖先,可以安全使用
|
|
48
|
+
BASE_REF="${PREVIOUS_COMMIT}"
|
|
49
|
+
echo "[before_build] Use PREVIOUS_COMMIT as BASE_REF: ${BASE_REF} (ancestor check passed)"
|
|
50
|
+
# 为 turbo --filter 准备语法形如 ...[<BASE_REF>]
|
|
51
|
+
TURBO_FILTER="...[${BASE_REF}]"
|
|
52
|
+
export TURBO_FILTER
|
|
53
|
+
echo "[before_build] TURBO_FILTER=${TURBO_FILTER} (incremental build)"
|
|
54
|
+
else
|
|
55
|
+
# PREVIOUS_COMMIT 不是当前 HEAD 的祖先,降级为全量构建
|
|
56
|
+
echo "[before_build] Warning: PREVIOUS_COMMIT=${PREVIOUS_COMMIT} is not an ancestor of HEAD=${CURRENT_HEAD}"
|
|
57
|
+
echo "[before_build] Possible reasons: rebase/force-push, tag updated by another branch, or shallow clone issue"
|
|
58
|
+
echo "[before_build] Falling back to full build (no filter)"
|
|
59
|
+
unset TURBO_FILTER
|
|
60
|
+
fi
|
|
61
|
+
else
|
|
62
|
+
echo "[before_build] Warning: PREVIOUS_COMMIT=${PREVIOUS_COMMIT} is not a valid commit, will perform full build"
|
|
63
|
+
unset TURBO_FILTER
|
|
64
|
+
fi
|
|
65
|
+
else
|
|
66
|
+
# PREVIOUS_COMMIT 未设置,进行全量构建
|
|
67
|
+
echo "[before_build] PREVIOUS_COMMIT not set, will perform full build (no filter)"
|
|
68
|
+
unset TURBO_FILTER
|
|
69
|
+
fi
|
|
70
|
+
fi
|
|
71
|
+
else
|
|
72
|
+
# LAST_SUCCESS_BRANCH 未设置,说明是第一次构建或 Jenkins 未配置该环境变量
|
|
73
|
+
echo "[before_build] LAST_SUCCESS_BRANCH not set, will perform full build (no filter)"
|
|
74
|
+
# 不设置 TURBO_FILTER,这样 package.json 中的 ${TURBO_FILTER:+--filter=${TURBO_FILTER}} 不会生效
|
|
75
|
+
unset TURBO_FILTER
|
|
76
|
+
fi
|
|
@@ -20,11 +20,35 @@ echo "项目版本: $VERSION"
|
|
|
20
20
|
# 切换到项目根目录,确保后续命令在根目录下运行
|
|
21
21
|
cd "$PROJECT_ROOT"
|
|
22
22
|
|
|
23
|
+
# 导出 PROJECT_ROOT 供 before_build.sh 使用
|
|
24
|
+
export PROJECT_ROOT
|
|
25
|
+
|
|
26
|
+
# 在执行构建前,计算 BASE_REF / TURBO_FILTER 等增量构建信息
|
|
27
|
+
if [ -f "$PROJECT_ROOT/CICD/before_build.sh" ]; then
|
|
28
|
+
# shellcheck disable=SC1090
|
|
29
|
+
source "$PROJECT_ROOT/CICD/before_build.sh"
|
|
30
|
+
fi
|
|
31
|
+
|
|
23
32
|
# 设置子应用的 CDN 公共路径(开发环境)
|
|
24
|
-
|
|
33
|
+
# 路径格式: https://cdn-xxx.com/<prefix>/<projectName>/<version>/
|
|
34
|
+
export CDN_PUBLIC_PATH="https://cdn-portal-dev.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/${VERSION}/"
|
|
25
35
|
echo "CDN_PUBLIC_PATH: $CDN_PUBLIC_PATH"
|
|
26
36
|
|
|
27
|
-
|
|
37
|
+
# 开发环境,不上传 sourcemap。调试时如有需要再解开
|
|
38
|
+
# # ========== Sentry Auth Token ==========
|
|
39
|
+
# # SENTRY_AUTH_TOKEN 从 Jenkins 服务器文件读取(敏感信息,不写在脚本中)
|
|
40
|
+
# SENTRY_TOKEN_FILE="/var/lib/jenkins/.portal_sentry_auth_token"
|
|
41
|
+
# if [ -f "$SENTRY_TOKEN_FILE" ]; then
|
|
42
|
+
# export SENTRY_AUTH_TOKEN=$(cat "$SENTRY_TOKEN_FILE")
|
|
43
|
+
# fi
|
|
28
44
|
|
|
29
|
-
|
|
45
|
+
# if [ -z "$SENTRY_AUTH_TOKEN" ]; then
|
|
46
|
+
# echo "警告:SENTRY_AUTH_TOKEN 未设置(文件 $SENTRY_TOKEN_FILE 不存在),跳过 sourcemap 上传"
|
|
47
|
+
# fi
|
|
48
|
+
|
|
49
|
+
pnpm run build:development
|
|
30
50
|
|
|
51
|
+
# 只有在 CI 环境时才写入版本号文件(覆盖写入)
|
|
52
|
+
if [ "${CI}" = "true" ]; then
|
|
53
|
+
echo "VERSION=$VERSION" > .env_x_<%= projectName %>
|
|
54
|
+
fi
|
|
@@ -20,11 +20,34 @@ echo "项目版本: $VERSION"
|
|
|
20
20
|
# 切换到项目根目录,确保后续命令在根目录下运行
|
|
21
21
|
cd "$PROJECT_ROOT"
|
|
22
22
|
|
|
23
|
+
# 导出 PROJECT_ROOT 供 before_build.sh 使用
|
|
24
|
+
export PROJECT_ROOT
|
|
25
|
+
|
|
26
|
+
# 在执行构建前,计算 BASE_REF / TURBO_FILTER 等增量构建信息(用于增量构建)
|
|
27
|
+
if [ -f "$PROJECT_ROOT/CICD/before_build.sh" ]; then
|
|
28
|
+
# shellcheck disable=SC1090
|
|
29
|
+
source "$PROJECT_ROOT/CICD/before_build.sh"
|
|
30
|
+
fi
|
|
31
|
+
|
|
23
32
|
# 设置子应用的 CDN 公共路径(生产环境)
|
|
24
|
-
|
|
33
|
+
# 路径格式: https://cdn-xxx.com/<prefix>/<projectName>/<version>/
|
|
34
|
+
export CDN_PUBLIC_PATH="https://cdn-portal.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/${VERSION}/"
|
|
25
35
|
echo "CDN_PUBLIC_PATH: $CDN_PUBLIC_PATH"
|
|
26
36
|
|
|
27
|
-
|
|
37
|
+
# ========== Sentry Auth Token ==========
|
|
38
|
+
# SENTRY_AUTH_TOKEN 从 Jenkins 服务器文件读取(敏感信息,不写在脚本中)
|
|
39
|
+
SENTRY_TOKEN_FILE="/var/lib/jenkins/.portal_sentry_auth_token"
|
|
40
|
+
if [ -f "$SENTRY_TOKEN_FILE" ]; then
|
|
41
|
+
export SENTRY_AUTH_TOKEN=$(cat "$SENTRY_TOKEN_FILE")
|
|
42
|
+
fi
|
|
28
43
|
|
|
29
|
-
|
|
44
|
+
if [ -z "$SENTRY_AUTH_TOKEN" ]; then
|
|
45
|
+
echo "警告:SENTRY_AUTH_TOKEN 未设置(文件 $SENTRY_TOKEN_FILE 不存在),跳过 sourcemap 上传"
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
pnpm run build:production
|
|
30
49
|
|
|
50
|
+
# 只有在 CI 环境时才写入版本号文件(覆盖写入)
|
|
51
|
+
if [ "${CI}" = "true" ]; then
|
|
52
|
+
echo "VERSION=$VERSION" > .env_x_<%= projectName %>
|
|
53
|
+
fi
|
|
@@ -20,11 +20,36 @@ echo "项目版本: $VERSION"
|
|
|
20
20
|
# 切换到项目根目录,确保后续命令在根目录下运行
|
|
21
21
|
cd "$PROJECT_ROOT"
|
|
22
22
|
|
|
23
|
+
# 导出 PROJECT_ROOT 供 before_build.sh 使用
|
|
24
|
+
export PROJECT_ROOT
|
|
25
|
+
|
|
26
|
+
# 在执行构建前,计算 BASE_REF / TURBO_FILTER 等增量构建信息
|
|
27
|
+
if [ -f "$PROJECT_ROOT/CICD/before_build.sh" ]; then
|
|
28
|
+
# shellcheck disable=SC1090
|
|
29
|
+
source "$PROJECT_ROOT/CICD/before_build.sh"
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
|
|
23
33
|
# 设置子应用的 CDN 公共路径(测试环境)
|
|
24
|
-
|
|
34
|
+
# 路径格式: https://cdn-xxx.com/<prefix>/<projectName>/<version>/
|
|
35
|
+
export CDN_PUBLIC_PATH="https://cdn-portal-test.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/${VERSION}/"
|
|
25
36
|
echo "CDN_PUBLIC_PATH: $CDN_PUBLIC_PATH"
|
|
26
37
|
|
|
27
|
-
|
|
38
|
+
# 测试环境,不上传 sourcemap。调试时如有需要再解开
|
|
39
|
+
# # ========== Sentry Auth Token ==========
|
|
40
|
+
# # SENTRY_AUTH_TOKEN 从 Jenkins 服务器文件读取(敏感信息,不写在脚本中)
|
|
41
|
+
# SENTRY_TOKEN_FILE="/var/lib/jenkins/.portal_sentry_auth_token"
|
|
42
|
+
# if [ -f "$SENTRY_TOKEN_FILE" ]; then
|
|
43
|
+
# export SENTRY_AUTH_TOKEN=$(cat "$SENTRY_TOKEN_FILE")
|
|
44
|
+
# fi
|
|
45
|
+
|
|
46
|
+
# if [ -z "$SENTRY_AUTH_TOKEN" ]; then
|
|
47
|
+
# echo "警告:SENTRY_AUTH_TOKEN 未设置(文件 $SENTRY_TOKEN_FILE 不存在),跳过 sourcemap 上传"
|
|
48
|
+
# fi
|
|
28
49
|
|
|
29
|
-
|
|
50
|
+
pnpm run build:testing
|
|
30
51
|
|
|
52
|
+
# 只有在 CI 环境时才写入版本号文件(覆盖写入)
|
|
53
|
+
if [ "${CI}" = "true" ]; then
|
|
54
|
+
echo "VERSION=$VERSION" > .env_x_<%= projectName %>
|
|
55
|
+
fi
|
|
@@ -5,13 +5,13 @@ apiKey=$(cat ~/.wangsu_key)
|
|
|
5
5
|
date=`env LANG="en_US.UTF-8" date -u "+%a, %d %b %Y %H:%M:%S GMT"`
|
|
6
6
|
password=`echo -en "$date" | openssl dgst -sha1 -hmac $apiKey -binary | openssl enc -base64`
|
|
7
7
|
echo "打印刷新地址"
|
|
8
|
-
echo "dir1:http://cdn-portal-dev.micoplatform.com/<%= projectName %>/$version/"
|
|
9
|
-
echo "dir2:https://cdn-portal-dev.micoplatform.com/<%= projectName %>/$version/"
|
|
8
|
+
echo "dir1:http://cdn-portal-dev.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version/"
|
|
9
|
+
echo "dir2:https://cdn-portal-dev.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version/"
|
|
10
10
|
curl -i --url "https://open.chinanetcenter.com/ccm/purge/ItemIdReceiver" -X "POST" -u "$username:$password" -H "Date:$date" -H "Content-Type: application/json" --data-binary @- <<EOF
|
|
11
11
|
{
|
|
12
12
|
"dirs": [
|
|
13
|
-
"http://cdn-portal-dev.micoplatform.com/<%= projectName %>/$version",
|
|
14
|
-
"https://cdn-portal-dev.micoplatform.com/<%= projectName %>/$version"
|
|
13
|
+
"http://cdn-portal-dev.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version",
|
|
14
|
+
"https://cdn-portal-dev.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version"
|
|
15
15
|
],
|
|
16
16
|
"dirAction":"expire"
|
|
17
17
|
}
|
|
@@ -5,13 +5,13 @@ apiKey=$(cat ~/.wangsu_key)
|
|
|
5
5
|
date=`env LANG="en_US.UTF-8" date -u "+%a, %d %b %Y %H:%M:%S GMT"`
|
|
6
6
|
password=`echo -en "$date" | openssl dgst -sha1 -hmac $apiKey -binary | openssl enc -base64`
|
|
7
7
|
echo "打印刷新地址"
|
|
8
|
-
echo "dir1:http://cdn-portal.micoplatform.com/<%= projectName %>/$version/"
|
|
9
|
-
echo "dir2:https://cdn-portal.micoplatform.com/<%= projectName %>/$version/"
|
|
8
|
+
echo "dir1:http://cdn-portal.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version/"
|
|
9
|
+
echo "dir2:https://cdn-portal.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version/"
|
|
10
10
|
curl -i --url "https://open.chinanetcenter.com/ccm/purge/ItemIdReceiver" -X "POST" -u "$username:$password" -H "Date:$date" -H "Content-Type: application/json" --data-binary @- <<EOF
|
|
11
11
|
{
|
|
12
12
|
"dirs": [
|
|
13
|
-
"http://cdn-portal.micoplatform.com/<%= projectName %>/$version",
|
|
14
|
-
"https://cdn-portal.micoplatform.com/<%= projectName %>/$version"
|
|
13
|
+
"http://cdn-portal.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version",
|
|
14
|
+
"https://cdn-portal.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version"
|
|
15
15
|
],
|
|
16
16
|
"dirAction":"expire"
|
|
17
17
|
}
|
|
@@ -5,13 +5,13 @@ apiKey=$(cat ~/.wangsu_key)
|
|
|
5
5
|
date=`env LANG="en_US.UTF-8" date -u "+%a, %d %b %Y %H:%M:%S GMT"`
|
|
6
6
|
password=`echo -en "$date" | openssl dgst -sha1 -hmac $apiKey -binary | openssl enc -base64`
|
|
7
7
|
echo "打印刷新地址"
|
|
8
|
-
echo "dir1:http://cdn-portal-test.micoplatform.com/<%= projectName %>/$version/"
|
|
9
|
-
echo "dir2:https://cdn-portal-test.micoplatform.com/<%= projectName %>/$version/"
|
|
8
|
+
echo "dir1:http://cdn-portal-test.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version/"
|
|
9
|
+
echo "dir2:https://cdn-portal-test.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version/"
|
|
10
10
|
curl -i --url "https://open.chinanetcenter.com/ccm/purge/ItemIdReceiver" -X "POST" -u "$username:$password" -H "Date:$date" -H "Content-Type: application/json" --data-binary @- <<EOF
|
|
11
11
|
{
|
|
12
12
|
"dirs": [
|
|
13
|
-
"http://cdn-portal-test.micoplatform.com/<%= projectName %>/$version",
|
|
14
|
-
"https://cdn-portal-test.micoplatform.com/<%= projectName %>/$version"
|
|
13
|
+
"http://cdn-portal-test.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version",
|
|
14
|
+
"https://cdn-portal-test.micoplatform.com/<%= cdnPrefixPath %><%= projectName %>/$version"
|
|
15
15
|
],
|
|
16
16
|
"dirAction":"expire"
|
|
17
17
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- **Monorepo**: Turborepo + pnpm Workspace
|
|
12
12
|
- **前端框架**: UmiJS 4 (@umijs/max)、React 18、TypeScript
|
|
13
13
|
- **微前端**: qiankun
|
|
14
|
-
- **UI 组件**:
|
|
14
|
+
- **UI 组件**: @mico-platform/ui
|
|
15
15
|
- **样式方案**: Tailwind CSS + Less
|
|
16
16
|
- **代码规范**: ESLint、Stylelint、Husky、Commitlint
|
|
17
17
|
|
|
@@ -53,16 +53,21 @@ apps/ # Workspace 应用目录(微前端子应用)
|
|
|
53
53
|
│ │ ├── app.tsx # Umi 运行时配置
|
|
54
54
|
│ │ ├── layouts/ # 布局组件
|
|
55
55
|
│ │ ├── pages/ # 路由页面
|
|
56
|
-
│ │ ├── components/ #
|
|
56
|
+
│ │ ├── components/ # 公共组件(MicroAppLoader 等)
|
|
57
57
|
│ │ ├── common/ # 工具模块(auth、request、upload、menu)
|
|
58
|
+
│ │ ├── constants/ # 常量定义(路由、主题、时区等)
|
|
58
59
|
│ │ ├── hooks/ # 自定义 Hooks
|
|
59
60
|
│ │ ├── services/ # API 服务层
|
|
60
61
|
│ │ ├── models/ # Umi model(全局状态)
|
|
61
|
-
│ │
|
|
62
|
-
│ │ └── styles/ # 主题变量与样式覆盖
|
|
62
|
+
│ │ └── locales/ # 国际化文件(zh-CN、en-US)
|
|
63
63
|
│ └── config/ # Umi 配置
|
|
64
|
-
|
|
65
|
-
├──
|
|
64
|
+
├── basis/ # 基础数据子应用(货币管理等)
|
|
65
|
+
│ ├── src/
|
|
66
|
+
│ │ ├── pages/ # 路由页面
|
|
67
|
+
│ │ ├── locales/ # 国际化文件
|
|
68
|
+
│ │ └── common/ # 工具模块
|
|
69
|
+
│ └── config/ # Umi 配置
|
|
70
|
+
packages/ # 共享包(common-intl 等)
|
|
66
71
|
scripts/ # 构建与开发脚本
|
|
67
72
|
CICD/ # 部署资源
|
|
68
73
|
```
|
|
@@ -98,13 +103,13 @@ refactor(auth): 重构认证服务
|
|
|
98
103
|
API 请求配置在 `src/common/request/`(模块化拆分为 6 个文件),错误处理在 `src/requestErrorConfig.ts`。详见 [请求模块架构](./apps/layout/docs/arch-请求模块.md)。
|
|
99
104
|
|
|
100
105
|
### 日志与常量
|
|
101
|
-
Logger 工具在 `src/common/logger.ts`,常量定义在 `src/
|
|
106
|
+
Logger 工具在 `src/common/logger.ts`,常量定义在 `src/constants/index.ts`。详见 [日志与常量](./apps/layout/docs/arch-日志与常量.md)。
|
|
102
107
|
|
|
103
108
|
### 认证模块
|
|
104
109
|
认证逻辑在 `src/common/auth/`,核心文件 `auth-manager.ts` 管理 Token 存储和用户信息。SSO 登录在 `getInitialState()` 中完成,确保 UI 渲染前认证已就绪。
|
|
105
110
|
|
|
106
|
-
###
|
|
107
|
-
菜单解析与类型定义在 `src/common/menu
|
|
111
|
+
### 菜单与路由系统
|
|
112
|
+
菜单解析与类型定义在 `src/common/menu/`。路由注册消费 `window.__MICO_PAGES__`(页面列表),菜单栏消费 `window.__MICO_MENUS__`(菜单树),两者解耦运作。权限通过菜单交叉引用 + 页面级兜底的双层策略控制。详见 [路由与菜单解耦](./apps/layout/docs/feature-路由与菜单解耦.md) 和 [菜单权限控制](./apps/layout/docs/feature-菜单权限控制.md)。
|
|
108
113
|
|
|
109
114
|
### 微前端
|
|
110
115
|
layout 应用作为 qiankun 主应用,子应用通过 Umi 配置中的 qiankun 配置注册。详见 [微前端模式](./apps/layout/docs/feature-微前端模式.md)。
|
|
@@ -116,6 +121,8 @@ layout 应用作为 qiankun 主应用,子应用通过 Umi 配置中的 qiankun
|
|
|
116
121
|
| [README.md](./README.md) | 项目入口、技术栈、常用命令 |
|
|
117
122
|
| [提交规范](./docs/commit-message.md) | Git Commit 详细规范 |
|
|
118
123
|
| [微前端模式](./apps/layout/docs/feature-微前端模式.md) | qiankun 架构、MicroAppLoader、子应用配置 |
|
|
124
|
+
| [路由与菜单解耦](./apps/layout/docs/feature-路由与菜单解耦.md) | PAGES/MENUS 数据源分离、双层权限控制 |
|
|
125
|
+
| [菜单权限控制](./apps/layout/docs/feature-菜单权限控制.md) | sideMenus 白名单、认证与授权分离 |
|
|
119
126
|
| [主题色切换](./apps/layout/docs/feature-主题色切换.md) | useTheme Hook、CSS 变量系统 |
|
|
120
127
|
| [请求模块架构](./apps/layout/docs/arch-请求模块.md) | HTTP 请求层模块化设计 |
|
|
121
128
|
| [日志与常量](./apps/layout/docs/arch-日志与常量.md) | Logger 工具与常量管理 |
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- **Monorepo**:Turborepo + pnpm Workspace
|
|
8
8
|
- **前端框架**:UmiJS 4 / @umijs/max
|
|
9
9
|
- **微前端**:qiankun
|
|
10
|
-
- **UI
|
|
10
|
+
- **UI 组件**:@mico-platform/ui
|
|
11
11
|
- **样式方案**:Tailwind CSS + Less
|
|
12
12
|
- **代码规范**:ESLint、Stylelint、lint-staged、Husky、Commitlint
|
|
13
13
|
|
|
@@ -27,22 +27,59 @@ pnpm install
|
|
|
27
27
|
| 命令 | 说明 |
|
|
28
28
|
|------|------|
|
|
29
29
|
| `pnpm dev` | 交互式选择并启动应用开发服务器 |
|
|
30
|
+
| `pnpm dev:preset` | 根据配置文件并行启动多个应用 |
|
|
31
|
+
| `pnpm dev:preset <preset>` | 使用指定预设启动(如 `pnpm dev:preset full`) |
|
|
32
|
+
| `pnpm list:preset` | 列出所有可用的启动预设 |
|
|
30
33
|
| `pnpm build` | 构建所有应用(生产环境) |
|
|
31
34
|
| `pnpm build:development` | 构建所有应用(开发环境) |
|
|
32
35
|
| `pnpm build:testing` | 构建所有应用(测试环境) |
|
|
33
36
|
| `pnpm build:production` | 构建所有应用(生产环境) |
|
|
34
37
|
| `pnpm lint` | 运行 ESLint + Turborepo lint 校验 |
|
|
35
38
|
| `pnpm lint:fix` | 自动修复 lint 问题 |
|
|
39
|
+
| `pnpm create:umi-app` | 基于 Umi 模板创建新子应用 |
|
|
36
40
|
|
|
37
41
|
> **提示**:也可以使用 `pnpm -C apps/<app-name> dev` 直接启动指定应用,例如 `pnpm -C apps/layout dev`。
|
|
38
42
|
|
|
43
|
+
### 多应用并行启动
|
|
44
|
+
|
|
45
|
+
通过 `dev.preset.json` 配置预设,一条命令并行启动多个应用:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 使用默认预设启动
|
|
49
|
+
pnpm dev:preset
|
|
50
|
+
|
|
51
|
+
# 使用指定预设
|
|
52
|
+
pnpm dev:preset full
|
|
53
|
+
|
|
54
|
+
# 查看所有预设
|
|
55
|
+
pnpm list:preset
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
预设配置文件 `dev.preset.json` 示例:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"presets": {
|
|
63
|
+
"full": {
|
|
64
|
+
"description": "启动所有应用",
|
|
65
|
+
"apps": ["layout", "subapp"]
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"default": "full"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
每个应用的日志会以不同颜色的前缀区分,按 `Ctrl+C` 同时停止所有应用。
|
|
73
|
+
|
|
74
|
+
详细说明请参考 [多应用并行启动文档](./docs/dev-preset.md)。
|
|
75
|
+
|
|
39
76
|
## 新建子应用
|
|
40
77
|
|
|
41
78
|
使用 Mico CLI 快速创建新的 React 子应用:
|
|
42
79
|
|
|
43
80
|
```bash
|
|
44
81
|
# 全局安装(一次性)
|
|
45
|
-
pnpm add -g
|
|
82
|
+
pnpm add -g generator-mico-cli
|
|
46
83
|
|
|
47
84
|
# 在仓库根目录执行
|
|
48
85
|
mico create subapp-react
|
|
@@ -55,11 +92,12 @@ mico create subapp-react
|
|
|
55
92
|
├── apps/ # 业务应用目录
|
|
56
93
|
│ └── layout/ # 主应用(qiankun master)
|
|
57
94
|
├── packages/ # 共享包目录
|
|
58
|
-
│ └── shared-styles/ # 共享样式
|
|
59
95
|
├── scripts/ # 构建与开发脚本
|
|
60
|
-
│ ├── dev.js #
|
|
96
|
+
│ ├── dev.js # 交互式启动脚本(单应用)
|
|
97
|
+
│ ├── dev-preset.js # 多应用并行启动脚本
|
|
61
98
|
│ ├── collect-dist.js # 构建产物收集
|
|
62
99
|
│ └── create-umi-app.sh # 创建新应用
|
|
100
|
+
├── dev.preset.json # 多应用启动预设配置
|
|
63
101
|
├── turbo.json # Turborepo 任务管道
|
|
64
102
|
├── pnpm-workspace.yaml # Workspace 包含范围
|
|
65
103
|
└── .editorconfig # 编辑器统一约束
|
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
registry=https://registry.npmjs.com/
|
|
2
|
+
@mico-platform:registry=https://nexus-vywrajy.micoworld.net/repository/mico-base-common/
|
|
3
|
+
@common-web:registry=https://nexus-vywrajy.micoworld.net/repository/mico-base-common/
|
|
4
|
+
package-lock=false
|
|
5
|
+
//nexus-vywrajy.micoworld.net/repository/mico-base-common/:_auth=bWljby1ucG06SDR4WUROazdad1NeczltblJMTw==
|
|
2
6
|
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
// https://umijs.org/config/
|
|
2
2
|
|
|
3
3
|
import { defineConfig } from '@umijs/max';
|
|
4
|
-
import fs from 'fs';
|
|
5
|
-
import path from 'path';
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
);
|
|
5
|
+
|
|
6
|
+
import mockMenus from '../mock/menus';
|
|
7
|
+
import mockPages from '../mock/pages';
|
|
11
8
|
|
|
12
9
|
const config: ReturnType<typeof defineConfig> = {
|
|
13
10
|
publicPath: '/',
|
|
@@ -20,25 +17,48 @@ const config: ReturnType<typeof defineConfig> = {
|
|
|
20
17
|
{
|
|
21
18
|
content: `
|
|
22
19
|
window.__MICO_MENUS__ = ${JSON.stringify(mockMenus)};
|
|
20
|
+
window.__MICO_PAGES__ = ${JSON.stringify(mockPages)};
|
|
23
21
|
window.__MICO_CONFIG__ = {
|
|
24
|
-
|
|
22
|
+
appId: '<%= projectName %>',
|
|
23
|
+
appName: '<%= projectName %>',
|
|
24
|
+
title: '测试样例',
|
|
25
|
+
logo: '',
|
|
25
26
|
apiBaseUrl: '',
|
|
27
|
+
defaultPath: '',
|
|
28
|
+
// 免认证路由(跳过 SSO 登录),支持 /* 前缀匹配
|
|
29
|
+
// noAuthRouteList: ['/*'],
|
|
30
|
+
// 免权限校验路由(跳过菜单权限检查)
|
|
31
|
+
noPermissionRouteList: [],
|
|
32
|
+
// 不显示布局的路由(全屏页面)
|
|
33
|
+
// noLayoutRouteList: [],
|
|
34
|
+
// 关闭权限控制(调试用)
|
|
35
|
+
disableAuth: false,
|
|
36
|
+
// SSO 外跳地址(与 resolveExternalLoginPath 读取的 externalLoginPath 一致;生产由注入的 __MICO_CONFIG__ 提供)
|
|
37
|
+
externalLoginPath:
|
|
38
|
+
'https://micous-idp.cig.tencentcs.com/sso/xxxxxxx/cas',
|
|
26
39
|
};
|
|
27
40
|
`,
|
|
28
41
|
},
|
|
29
42
|
],
|
|
30
43
|
|
|
44
|
+
/**
|
|
45
|
+
* @name Monorepo 重定向
|
|
46
|
+
* @description 开发时将 workspace 包指向源码,支持热更新
|
|
47
|
+
* @doc https://umijs.org/docs/api/config#monoreporedirect
|
|
48
|
+
*/
|
|
49
|
+
monorepoRedirect: {},
|
|
50
|
+
|
|
31
51
|
proxy: {
|
|
32
52
|
'/api': {
|
|
33
53
|
// 要代理的地址
|
|
34
|
-
target: 'https://dashboard-api-test.micoplatform.
|
|
54
|
+
target: 'https://dashboard-api-test.micoplatform.com',
|
|
35
55
|
// 配置了这个可以从 http 代理到 https
|
|
36
56
|
// 依赖 origin 的功能可能需要这个,比如 cookie
|
|
37
57
|
changeOrigin: true,
|
|
38
58
|
},
|
|
39
|
-
'/proxy
|
|
59
|
+
'/proxy/<%= projectName %>_svr': {
|
|
40
60
|
// 要代理的地址
|
|
41
|
-
target: 'https://dashboard-api-test.micoplatform.
|
|
61
|
+
target: 'https://dashboard-api-test.micoplatform.com',
|
|
42
62
|
// 配置了这个可以从 http 代理到 https
|
|
43
63
|
// 依赖 origin 的功能可能需要这个,比如 cookie
|
|
44
64
|
changeOrigin: true,
|
|
@@ -46,15 +66,11 @@ const config: ReturnType<typeof defineConfig> = {
|
|
|
46
66
|
},
|
|
47
67
|
define: {
|
|
48
68
|
'process.env.NODE_ENV': 'development',
|
|
49
|
-
'process.env.APP_ID': 'mibot_dev',
|
|
50
69
|
'process.env.API_BASE_URL': '',
|
|
51
|
-
'process.env.PROXY_SUFFIX': '/',
|
|
52
70
|
'process.env.LOGIN_ENDPOINT':
|
|
53
|
-
'',
|
|
71
|
+
'https://dashboard-api-test.micoplatform.com/api/yufu_login/',
|
|
54
72
|
'process.env.REFRESH_ENDPOINT':
|
|
55
|
-
'',
|
|
56
|
-
'process.env.EXTERNAL_LOGIN_PATH':
|
|
57
|
-
'',
|
|
73
|
+
'https://dashboard-api-test.micoplatform.com/api/yufu_login/refresh/',
|
|
58
74
|
},
|
|
59
75
|
};
|
|
60
76
|
|