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,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://turbo.build/schema.json",
|
|
3
|
+
"globalEnv": ["CDN_PUBLIC_PATH"],
|
|
4
|
+
"tasks": {
|
|
5
|
+
"build": {
|
|
6
|
+
"dependsOn": ["^build"],
|
|
7
|
+
"inputs": [
|
|
8
|
+
"$TURBO_DEFAULT$",
|
|
9
|
+
".env",
|
|
10
|
+
".env.local",
|
|
11
|
+
".env.production",
|
|
12
|
+
".env.production.local"
|
|
13
|
+
],
|
|
14
|
+
"outputs": ["dist/**"]
|
|
15
|
+
},
|
|
16
|
+
"build:development": {
|
|
17
|
+
"dependsOn": ["^build:development"],
|
|
18
|
+
"inputs": [
|
|
19
|
+
"$TURBO_DEFAULT$",
|
|
20
|
+
".env",
|
|
21
|
+
".env.local",
|
|
22
|
+
".env.development",
|
|
23
|
+
".env.development.local"
|
|
24
|
+
],
|
|
25
|
+
"outputs": ["dist/**"]
|
|
26
|
+
},
|
|
27
|
+
"build:testing": {
|
|
28
|
+
"dependsOn": ["^build:testing"],
|
|
29
|
+
"inputs": [
|
|
30
|
+
"$TURBO_DEFAULT$",
|
|
31
|
+
".env",
|
|
32
|
+
".env.local",
|
|
33
|
+
".env.testing",
|
|
34
|
+
".env.testing.local"
|
|
35
|
+
],
|
|
36
|
+
"outputs": ["dist/**"]
|
|
37
|
+
},
|
|
38
|
+
"build:production": {
|
|
39
|
+
"dependsOn": ["^build:production"],
|
|
40
|
+
"inputs": [
|
|
41
|
+
"$TURBO_DEFAULT$",
|
|
42
|
+
".env",
|
|
43
|
+
".env.local",
|
|
44
|
+
".env.production",
|
|
45
|
+
".env.production.local"
|
|
46
|
+
],
|
|
47
|
+
"outputs": ["dist/**"]
|
|
48
|
+
},
|
|
49
|
+
"build:local": {
|
|
50
|
+
"dependsOn": ["^build:local"],
|
|
51
|
+
"inputs": ["$TURBO_DEFAULT$", ".env", ".env.local"],
|
|
52
|
+
"outputs": ["dist/**"]
|
|
53
|
+
},
|
|
54
|
+
"dev": {
|
|
55
|
+
"cache": false,
|
|
56
|
+
"persistent": true
|
|
57
|
+
},
|
|
58
|
+
"lint": {
|
|
59
|
+
"outputs": []
|
|
60
|
+
},
|
|
61
|
+
"lint:fix": {
|
|
62
|
+
"outputs": []
|
|
63
|
+
},
|
|
64
|
+
"test": {
|
|
65
|
+
"outputs": []
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const Generator = require('yeoman-generator');
|
|
4
|
+
const fs = require('node:fs');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
const {
|
|
7
|
+
toKebab,
|
|
8
|
+
toPascal,
|
|
9
|
+
collectFiles,
|
|
10
|
+
transformDestPath,
|
|
11
|
+
isTemplateFile,
|
|
12
|
+
setupErrorHandlers
|
|
13
|
+
} = require('../../lib/utils');
|
|
14
|
+
|
|
15
|
+
const IGNORE_LIST = require('./ignore-list.json');
|
|
16
|
+
|
|
17
|
+
// 安装全局错误处理
|
|
18
|
+
setupErrorHandlers();
|
|
19
|
+
|
|
20
|
+
module.exports = class extends Generator {
|
|
21
|
+
initializing() {
|
|
22
|
+
this.monorepoRoot = process.cwd();
|
|
23
|
+
const appsDir = path.join(this.monorepoRoot, 'apps');
|
|
24
|
+
const workspaceFile = path.join(this.monorepoRoot, 'pnpm-workspace.yaml');
|
|
25
|
+
|
|
26
|
+
if (!fs.existsSync(appsDir)) {
|
|
27
|
+
console.error('');
|
|
28
|
+
console.error('❌ Error: apps directory not found.');
|
|
29
|
+
console.error('');
|
|
30
|
+
console.error(' This generator must be run from a monorepo root that contains an "apps" directory.');
|
|
31
|
+
console.error(` Current directory: ${this.monorepoRoot}`);
|
|
32
|
+
console.error('');
|
|
33
|
+
console.error(' Usage:');
|
|
34
|
+
console.error(' cd /path/to/your-monorepo');
|
|
35
|
+
console.error(' mico create subapp-react');
|
|
36
|
+
console.error('');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (!fs.existsSync(workspaceFile)) {
|
|
41
|
+
console.warn('');
|
|
42
|
+
console.warn('⚠️ Warning: pnpm-workspace.yaml not found.');
|
|
43
|
+
console.warn(' Make sure you are in the correct monorepo.');
|
|
44
|
+
console.warn('');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
_detectPackageScope() {
|
|
49
|
+
// 尝试从 packages/shared-styles/package.json 读取
|
|
50
|
+
const sharedStylesPath = path.join(this.monorepoRoot, 'packages/shared-styles/package.json');
|
|
51
|
+
if (fs.existsSync(sharedStylesPath)) {
|
|
52
|
+
try {
|
|
53
|
+
const pkg = JSON.parse(fs.readFileSync(sharedStylesPath, 'utf-8'));
|
|
54
|
+
if (pkg.name && pkg.name.startsWith('@')) {
|
|
55
|
+
const match = pkg.name.match(/^(@[^/]+)\//);
|
|
56
|
+
if (match) return match[1];
|
|
57
|
+
}
|
|
58
|
+
} catch (e) {
|
|
59
|
+
// 忽略解析错误
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// 尝试从根 package.json 读取
|
|
64
|
+
const rootPkgPath = path.join(this.monorepoRoot, 'package.json');
|
|
65
|
+
if (fs.existsSync(rootPkgPath)) {
|
|
66
|
+
try {
|
|
67
|
+
const pkg = JSON.parse(fs.readFileSync(rootPkgPath, 'utf-8'));
|
|
68
|
+
if (pkg.name) {
|
|
69
|
+
return `@${pkg.name}`;
|
|
70
|
+
}
|
|
71
|
+
} catch (e) {
|
|
72
|
+
// 忽略解析错误
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async prompting() {
|
|
80
|
+
try {
|
|
81
|
+
if (!this.monorepoRoot) {
|
|
82
|
+
console.error('');
|
|
83
|
+
console.error('❌ Error: Internal error - monorepoRoot not initialized.');
|
|
84
|
+
console.error('');
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const detectedScope = this._detectPackageScope();
|
|
89
|
+
|
|
90
|
+
this.answers = await this.prompt([
|
|
91
|
+
{
|
|
92
|
+
type: 'input',
|
|
93
|
+
name: 'appName',
|
|
94
|
+
message: 'Sub app name',
|
|
95
|
+
default: 'subapp',
|
|
96
|
+
filter: (input) => toKebab(input),
|
|
97
|
+
validate: (input) => {
|
|
98
|
+
const value = toKebab(input);
|
|
99
|
+
if (!value) return 'App name is required';
|
|
100
|
+
const destDir = path.join(this.monorepoRoot, 'apps', value);
|
|
101
|
+
if (fs.existsSync(destDir)) {
|
|
102
|
+
return `Target already exists: apps/${value}`;
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
type: 'input',
|
|
109
|
+
name: 'packageScope',
|
|
110
|
+
message: 'Package scope',
|
|
111
|
+
default: detectedScope || '@my-project',
|
|
112
|
+
validate: (input) => {
|
|
113
|
+
if (!input) return 'Package scope is required';
|
|
114
|
+
if (!input.startsWith('@')) return 'Package scope must start with @';
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
]);
|
|
119
|
+
|
|
120
|
+
this.appName = toKebab(this.answers.appName);
|
|
121
|
+
this.appNamePascal = toPascal(this.appName);
|
|
122
|
+
this.packageScope = this.answers.packageScope;
|
|
123
|
+
this.templateDir = this.templatePath('homepage');
|
|
124
|
+
this.destDir = path.join(this.monorepoRoot, 'apps', this.appName);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error('');
|
|
127
|
+
console.error('❌ Error during prompting:');
|
|
128
|
+
console.error(` ${error.message}`);
|
|
129
|
+
console.error('');
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
writing() {
|
|
135
|
+
try {
|
|
136
|
+
if (!fs.existsSync(this.templateDir)) {
|
|
137
|
+
console.error('');
|
|
138
|
+
console.error('❌ Error: Template directory not found.');
|
|
139
|
+
console.error(` Expected: ${this.templateDir}`);
|
|
140
|
+
console.error('');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const templateData = {
|
|
145
|
+
appName: this.appName,
|
|
146
|
+
AppName: this.appNamePascal,
|
|
147
|
+
packageScope: this.packageScope
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
const files = collectFiles(this.templateDir, this.templateDir, IGNORE_LIST);
|
|
151
|
+
|
|
152
|
+
if (files.length === 0) {
|
|
153
|
+
console.error('');
|
|
154
|
+
console.error('❌ Error: No template files found.');
|
|
155
|
+
console.error(` Template directory: ${this.templateDir}`);
|
|
156
|
+
console.error('');
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
for (const relPath of files) {
|
|
161
|
+
const srcPath = path.join(this.templateDir, relPath);
|
|
162
|
+
const destRelPath = transformDestPath(relPath);
|
|
163
|
+
const destPath = path.join(this.destDir, destRelPath);
|
|
164
|
+
|
|
165
|
+
if (isTemplateFile(relPath)) {
|
|
166
|
+
this.fs.copyTpl(srcPath, destPath, templateData);
|
|
167
|
+
} else {
|
|
168
|
+
this.fs.copy(srcPath, destPath);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error('');
|
|
173
|
+
console.error('❌ Error during file generation:');
|
|
174
|
+
console.error(` ${error.message}`);
|
|
175
|
+
console.error('');
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
end() {
|
|
181
|
+
this.log('');
|
|
182
|
+
this.log('✅ 子应用创建成功!');
|
|
183
|
+
this.log('');
|
|
184
|
+
this.log(` cd apps/${this.appName}`);
|
|
185
|
+
this.log(' pnpm install');
|
|
186
|
+
this.log(' pnpm dev');
|
|
187
|
+
this.log('');
|
|
188
|
+
}
|
|
189
|
+
};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# <%= appName %> 子应用
|
|
2
|
+
|
|
3
|
+
qiankun 微前端子应用,基于 UmiJS Max 构建。
|
|
4
|
+
|
|
5
|
+
## 快速开始
|
|
6
|
+
|
|
7
|
+
### 安装依赖
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 在项目根目录执行
|
|
11
|
+
pnpm install
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### 启动开发服务
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# 方式一:在项目根目录执行
|
|
18
|
+
pnpm -C apps/<%= appName %> dev
|
|
19
|
+
|
|
20
|
+
# 方式二:进入子应用目录执行
|
|
21
|
+
cd apps/<%= appName %>
|
|
22
|
+
pnpm dev
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 环境变量配置
|
|
26
|
+
|
|
27
|
+
在 `apps/<%= appName %>/.env.local` 文件中配置环境变量(如果不存在请创建):
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# 开发服务器端口号(默认 8000)
|
|
31
|
+
PORT=8001
|
|
32
|
+
|
|
33
|
+
# 其他环境变量示例
|
|
34
|
+
# MOCK=none # 禁用 mock 数据
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> **提示**:`.env.local` 文件不会被 Git 追踪,适合存放本地开发配置。
|
|
38
|
+
|
|
39
|
+
## 常用命令
|
|
40
|
+
|
|
41
|
+
| 命令 | 说明 |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `pnpm dev` | 启动开发服务器 |
|
|
44
|
+
| `pnpm start` | 同 `pnpm dev` |
|
|
45
|
+
| `pnpm build` | 生产环境构建 |
|
|
46
|
+
| `pnpm build:development` | 开发环境构建 |
|
|
47
|
+
| `pnpm build:testing` | 测试环境构建 |
|
|
48
|
+
| `pnpm build:production` | 生产环境构建 |
|
|
49
|
+
| `pnpm setup` | 初始化 Umi 配置 |
|
|
50
|
+
|
|
51
|
+
## 目录结构
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
<%= appName %>/
|
|
55
|
+
├── config/ # Umi 配置目录
|
|
56
|
+
│ ├── config.ts # 基础配置
|
|
57
|
+
│ ├── config.dev.ts # 开发环境配置
|
|
58
|
+
│ ├── config.prod.ts # 生产环境配置
|
|
59
|
+
│ ├── config.testing.ts # 测试环境配置
|
|
60
|
+
│ └── routes.ts # 路由配置
|
|
61
|
+
├── mock/ # Mock 数据
|
|
62
|
+
│ └── api.mock.ts
|
|
63
|
+
├── src/
|
|
64
|
+
│ ├── app.tsx # Umi 运行时配置
|
|
65
|
+
│ ├── assets/ # 静态资源
|
|
66
|
+
│ ├── common/ # 公共模块
|
|
67
|
+
│ │ ├── logger.ts # 日志工具
|
|
68
|
+
│ │ ├── mainApp.ts # 主应用通信
|
|
69
|
+
│ │ └── request.ts # 请求封装
|
|
70
|
+
│ ├── pages/ # 页面组件
|
|
71
|
+
│ ├── styles/ # 样式文件
|
|
72
|
+
│ └── global.less # 全局样式
|
|
73
|
+
├── .env.local # 本地环境变量(需自行创建)
|
|
74
|
+
├── package.json
|
|
75
|
+
└── tsconfig.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 微前端配置
|
|
79
|
+
|
|
80
|
+
本应用作为 qiankun 子应用运行,关键配置:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// config/config.ts
|
|
84
|
+
{
|
|
85
|
+
mountElementId: '<%= appName %>-root', // 挂载元素 ID
|
|
86
|
+
qiankun: {
|
|
87
|
+
slave: {}, // 启用子应用模式
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 共享依赖
|
|
93
|
+
|
|
94
|
+
如项目配置了共享样式包,可在 Less 文件中引入:
|
|
95
|
+
|
|
96
|
+
```less
|
|
97
|
+
@import '@your-scope/shared-styles/variables';
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 相关文档
|
|
101
|
+
|
|
102
|
+
### 项目文档
|
|
103
|
+
|
|
104
|
+
- [项目根目录 README](../../README.md)
|
|
105
|
+
|
|
106
|
+
### UmiJS 官方文档
|
|
107
|
+
|
|
108
|
+
| 文档 | 说明 |
|
|
109
|
+
|---|---|
|
|
110
|
+
| [快速上手](https://umijs.org/docs/guides/getting-started) | 环境准备、创建项目、启动与部署 |
|
|
111
|
+
| [目录结构](https://umijs.org/docs/guides/directory-structure) | 项目目录约定 |
|
|
112
|
+
| [路由](https://umijs.org/docs/guides/routes) | 路由配置与约定式路由 |
|
|
113
|
+
| [环境变量](https://umijs.org/docs/guides/env-variables) | `.env` 文件与环境变量配置 |
|
|
114
|
+
| [Mock 数据](https://umijs.org/docs/guides/mock) | 本地 Mock 数据配置 |
|
|
115
|
+
| [微前端](https://umijs.org/docs/max/micro-frontend) | qiankun 微前端集成 |
|
|
116
|
+
| [配置](https://umijs.org/docs/api/config) | 完整配置项参考 |
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// https://umijs.org/config/
|
|
2
|
+
|
|
3
|
+
import { defineConfig } from '@umijs/max';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 开发环境配置
|
|
7
|
+
* - 不配置 externals,直接打包依赖,方便独立运行调试
|
|
8
|
+
* - 生产环境通过 config.prod.ts 配置 externals 复用主应用依赖
|
|
9
|
+
*/
|
|
10
|
+
const config: ReturnType<typeof defineConfig> = {
|
|
11
|
+
publicPath: '/',
|
|
12
|
+
base: '/',
|
|
13
|
+
|
|
14
|
+
define: {
|
|
15
|
+
'process.env.NODE_ENV': 'development',
|
|
16
|
+
},
|
|
17
|
+
// /**
|
|
18
|
+
// * @name 脚本加载配置
|
|
19
|
+
// * @description 开发环境独立运行时,通过 CDN 加载公共依赖
|
|
20
|
+
// * 作为微前端子应用运行时,这些库由主应用提供
|
|
21
|
+
// */
|
|
22
|
+
// headScripts: [
|
|
23
|
+
// 'https://unpkg.com/react@18/umd/react.development.js',
|
|
24
|
+
// 'https://unpkg.com/react-dom@18/umd/react-dom.development.js',
|
|
25
|
+
// 'https://unpkg.com/@arco-design/web-react@latest/dist/arco.min.js',
|
|
26
|
+
// ],
|
|
27
|
+
|
|
28
|
+
// /**
|
|
29
|
+
// * @name 样式加载配置
|
|
30
|
+
// * @description 开发环境独立运行时加载 Arco Design CSS
|
|
31
|
+
// */
|
|
32
|
+
// links: [
|
|
33
|
+
// {
|
|
34
|
+
// rel: 'stylesheet',
|
|
35
|
+
// href: 'https://unpkg.com/@arco-design/web-react@latest/dist/css/arco.min.css',
|
|
36
|
+
// },
|
|
37
|
+
// ],
|
|
38
|
+
|
|
39
|
+
// /**
|
|
40
|
+
// * @name 外部依赖配置
|
|
41
|
+
// * @description 开发环境也需要 externals,配合 CDN 使用
|
|
42
|
+
// */
|
|
43
|
+
// externals: {
|
|
44
|
+
// react: 'window.React',
|
|
45
|
+
// 'react-dom': 'window.ReactDOM',
|
|
46
|
+
// '@arco-design/web-react': 'window.arco',
|
|
47
|
+
// },
|
|
48
|
+
/**
|
|
49
|
+
* @name 样式加载配置
|
|
50
|
+
* @description 开发环境独立运行时加载 Arco Design CSS
|
|
51
|
+
* 作为微前端子应用运行时,样式由主应用提供
|
|
52
|
+
*/
|
|
53
|
+
styles: [
|
|
54
|
+
// Arco Design 基础样式
|
|
55
|
+
'https://unpkg.com/@arco-design/web-react@2.66.6/dist/css/arco.min.css',
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default defineConfig(config);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// https://umijs.org/config/
|
|
2
|
+
|
|
3
|
+
import { defineConfig } from '@umijs/max';
|
|
4
|
+
const { CDN_PUBLIC_PATH } = process.env;
|
|
5
|
+
|
|
6
|
+
const PUBLIC_PATH: string = CDN_PUBLIC_PATH
|
|
7
|
+
? `${CDN_PUBLIC_PATH.replace(/\/?$/, '/') }homepage/`
|
|
8
|
+
: '/homepage/';
|
|
9
|
+
|
|
10
|
+
const config: ReturnType<typeof defineConfig> = {
|
|
11
|
+
// 生产环境:将所有代码打包到一个文件
|
|
12
|
+
extraBabelPlugins: ['babel-plugin-dynamic-import-node'],
|
|
13
|
+
|
|
14
|
+
// 禁用代码分割,只输出一个 JS 和一个 CSS
|
|
15
|
+
chainWebpack(memo) {
|
|
16
|
+
// 禁用 splitChunks
|
|
17
|
+
memo.optimization.splitChunks(false);
|
|
18
|
+
// 禁用 runtimeChunk
|
|
19
|
+
memo.optimization.runtimeChunk(false);
|
|
20
|
+
return memo;
|
|
21
|
+
},
|
|
22
|
+
publicPath: PUBLIC_PATH,
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @name 外部依赖配置
|
|
27
|
+
* @description 将大型公共库排除打包,运行时从主应用获取
|
|
28
|
+
* @doc https://umijs.org/docs/api/config#externals
|
|
29
|
+
*
|
|
30
|
+
* 作为 qiankun 子应用时,这些库由主应用提供:
|
|
31
|
+
* - react / react-dom: 主应用已加载,避免多实例问题
|
|
32
|
+
* - @arco-design/web-react: 主应用已加载,复用组件和样式
|
|
33
|
+
*/
|
|
34
|
+
externals: {
|
|
35
|
+
react: 'React',
|
|
36
|
+
'react-dom': 'ReactDOM',
|
|
37
|
+
'@arco-design/web-react': 'arco',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default defineConfig(config);
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// https://umijs.org/config/
|
|
2
|
+
|
|
3
|
+
import { defineConfig } from '@umijs/max';
|
|
4
|
+
const { CDN_PUBLIC_PATH } = process.env;
|
|
5
|
+
|
|
6
|
+
const PUBLIC_PATH: string = CDN_PUBLIC_PATH
|
|
7
|
+
? `${CDN_PUBLIC_PATH.replace(/\/?$/, '/')}homepage/`
|
|
8
|
+
: '/homepage/';
|
|
9
|
+
|
|
10
|
+
const config: ReturnType<typeof defineConfig> = {
|
|
11
|
+
// 测试环境:将所有代码打包到一个文件
|
|
12
|
+
extraBabelPlugins: ['babel-plugin-dynamic-import-node'],
|
|
13
|
+
|
|
14
|
+
// 禁用代码分割,只输出一个 JS 和一个 CSS
|
|
15
|
+
chainWebpack(memo) {
|
|
16
|
+
// 禁用 splitChunks
|
|
17
|
+
memo.optimization.splitChunks(false);
|
|
18
|
+
// 禁用 runtimeChunk
|
|
19
|
+
memo.optimization.runtimeChunk(false);
|
|
20
|
+
return memo;
|
|
21
|
+
},
|
|
22
|
+
publicPath: PUBLIC_PATH,
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @name 外部依赖配置
|
|
26
|
+
* @description 将大型公共库排除打包,运行时从主应用获取
|
|
27
|
+
* @doc https://umijs.org/docs/api/config#externals
|
|
28
|
+
*
|
|
29
|
+
* 作为 qiankun 子应用时,这些库由主应用提供:
|
|
30
|
+
* - react / react-dom: 主应用已加载,避免多实例问题
|
|
31
|
+
* - @arco-design/web-react: 主应用已加载,复用组件和样式
|
|
32
|
+
*/
|
|
33
|
+
externals: {
|
|
34
|
+
react: 'React',
|
|
35
|
+
'react-dom': 'ReactDOM',
|
|
36
|
+
'@arco-design/web-react': 'arco',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default defineConfig(config);
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// https://umijs.org/config/
|
|
2
|
+
|
|
3
|
+
import { defineConfig } from '@umijs/max';
|
|
4
|
+
import routes from './routes';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @name 使用公共路径
|
|
8
|
+
* @description 部署时的路径
|
|
9
|
+
*/
|
|
10
|
+
const PUBLIC_PATH = '/dist/<%= appName %>/';
|
|
11
|
+
|
|
12
|
+
const config: ReturnType<typeof defineConfig> = {
|
|
13
|
+
/**
|
|
14
|
+
* @name 挂载元素 ID
|
|
15
|
+
* @description React 应用挂载的 DOM 元素 id
|
|
16
|
+
*/
|
|
17
|
+
mountElementId: '<%= appName %>-root',
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @name 基础路径
|
|
21
|
+
* @description 子应用的路由前缀
|
|
22
|
+
*/
|
|
23
|
+
base: '/',
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @name 开启 hash 模式
|
|
27
|
+
* @description 让 build 之后的产物包含 hash 后缀
|
|
28
|
+
*/
|
|
29
|
+
hash: false,
|
|
30
|
+
|
|
31
|
+
publicPath: PUBLIC_PATH,
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @name 路由配置
|
|
35
|
+
*/
|
|
36
|
+
routes,
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @name moment 的国际化配置
|
|
40
|
+
*/
|
|
41
|
+
ignoreMomentLocale: true,
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @name 快速热更新配置
|
|
45
|
+
*/
|
|
46
|
+
fastRefresh: true,
|
|
47
|
+
|
|
48
|
+
//============== 以下都是 max 的插件配置 ===============
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @name 网络请求配置
|
|
52
|
+
* @doc https://umijs.org/docs/max/request
|
|
53
|
+
*/
|
|
54
|
+
request: {},
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @name 数据流插件
|
|
58
|
+
* @doc https://umijs.org/docs/max/data-flow
|
|
59
|
+
*/
|
|
60
|
+
model: {},
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @name 全局初始状态
|
|
64
|
+
*/
|
|
65
|
+
initialState: {},
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @name layout 插件
|
|
69
|
+
* @description 禁用内置 layout,子应用使用自定义布局
|
|
70
|
+
*/
|
|
71
|
+
layout: false,
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @name 其他配置
|
|
75
|
+
*/
|
|
76
|
+
esbuildMinifyIIFE: true,
|
|
77
|
+
|
|
78
|
+
define: {
|
|
79
|
+
'process.env.NODE_ENV': process.env.NODE_ENV,
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @name qiankun 微前端配置
|
|
84
|
+
* @description 作为子应用
|
|
85
|
+
* @doc https://umijs.org/docs/max/micro-frontend
|
|
86
|
+
*/
|
|
87
|
+
qiankun: {
|
|
88
|
+
slave: {},
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @name 代码拆分配置
|
|
93
|
+
* @description 确保动态 import 的模块打包为独立 chunk
|
|
94
|
+
* @doc https://umijs.org/docs/api/config#codeSplitting
|
|
95
|
+
*/
|
|
96
|
+
codeSplitting: {
|
|
97
|
+
jsStrategy: 'granularChunks',
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export default defineConfig(config);
|
|
102
|
+
|