generator-mico-cli 0.1.29 → 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.
Files changed (160) hide show
  1. package/README.md +199 -15
  2. package/bin/mico.js +232 -27
  3. package/generators/micro-react/index.js +200 -18
  4. package/generators/micro-react/meta.json +13 -0
  5. package/generators/micro-react/templates/.commitlintrc.js +1 -0
  6. package/generators/micro-react/templates/.cursor/rules/always-read-docs.mdc +14 -4
  7. package/generators/micro-react/templates/.cursor/rules/cicd-deploy.mdc +10 -8
  8. package/generators/micro-react/templates/.cursor/rules/coding-conventions.mdc +1 -1
  9. package/generators/micro-react/templates/.cursor/rules/development-guide.mdc +3 -4
  10. package/generators/micro-react/templates/.cursor/rules/layout-app.mdc +38 -31
  11. package/generators/micro-react/templates/.cursor/rules/project-overview.mdc +7 -4
  12. package/generators/micro-react/templates/.cursor/rules/theme-system.mdc +10 -12
  13. package/generators/micro-react/templates/.eslintrc.js +25 -1
  14. package/generators/micro-react/templates/AGENTS.md +5 -2
  15. package/generators/micro-react/templates/CICD/before_build.sh +76 -0
  16. package/generators/micro-react/templates/CICD/start_dev.sh +27 -3
  17. package/generators/micro-react/templates/CICD/start_prod.sh +26 -3
  18. package/generators/micro-react/templates/CICD/start_test.sh +28 -3
  19. package/generators/micro-react/templates/CICD/wangsu_fresh_dev.sh +4 -4
  20. package/generators/micro-react/templates/CICD/wangsu_fresh_prod.sh +4 -4
  21. package/generators/micro-react/templates/CICD/wangsu_fresh_test.sh +4 -4
  22. package/generators/micro-react/templates/CLAUDE.md +16 -9
  23. package/generators/micro-react/templates/README.md +42 -4
  24. package/generators/micro-react/templates/_gitignore +4 -0
  25. package/generators/micro-react/templates/_npmrc +4 -0
  26. package/generators/micro-react/templates/apps/layout/config/config.dev.ts +33 -17
  27. package/generators/micro-react/templates/apps/layout/config/config.prod.development.ts +24 -29
  28. package/generators/micro-react/templates/apps/layout/config/config.prod.testing.ts +25 -6
  29. package/generators/micro-react/templates/apps/layout/config/config.prod.ts +16 -7
  30. package/generators/micro-react/templates/apps/layout/config/config.ts +27 -4
  31. package/generators/micro-react/templates/apps/layout/config/routes.ts +10 -5
  32. 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
  33. package/generators/micro-react/templates/apps/layout/docs/arch-/350/257/267/346/261/202/346/250/241/345/235/227.md +1 -1
  34. package/generators/micro-react/templates/apps/layout/docs/common-intl.md +372 -0
  35. 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
  36. package/generators/micro-react/templates/apps/layout/docs/feature-404/351/241/265/351/235/242.md +103 -0
  37. 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
  38. 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
  39. 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 +420 -0
  40. 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
  41. 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
  42. package/generators/micro-react/templates/apps/layout/docs/utils-timezone.md +324 -0
  43. package/generators/micro-react/templates/apps/layout/mock/api.mock.ts +81 -61
  44. package/generators/micro-react/templates/apps/layout/mock/menus.ts +114 -4
  45. package/generators/micro-react/templates/apps/layout/mock/pages.ts +86 -0
  46. package/generators/micro-react/templates/apps/layout/package.json +7 -4
  47. package/generators/micro-react/templates/apps/layout/src/app.tsx +122 -83
  48. package/generators/micro-react/templates/apps/layout/src/common/auth/index.ts +3 -0
  49. package/generators/micro-react/templates/apps/layout/src/common/helpers.ts +177 -0
  50. package/generators/micro-react/templates/apps/layout/src/common/locale.ts +22 -17
  51. package/generators/micro-react/templates/apps/layout/src/common/menu/parser.ts +283 -28
  52. package/generators/micro-react/templates/apps/layout/src/common/menu/types.ts +69 -5
  53. package/generators/micro-react/templates/apps/layout/src/common/micro/index.ts +34 -0
  54. package/generators/micro-react/templates/apps/layout/src/common/micro-prefetch.ts +109 -0
  55. package/generators/micro-react/templates/apps/layout/src/common/portal-data.ts +45 -0
  56. package/generators/micro-react/templates/apps/layout/src/common/request/config.ts +72 -10
  57. package/generators/micro-react/templates/apps/layout/src/common/request/index.ts +2 -2
  58. package/generators/micro-react/templates/apps/layout/src/common/request/interceptors.ts +31 -3
  59. package/generators/micro-react/templates/apps/layout/src/common/request/sso.ts +29 -11
  60. package/generators/micro-react/templates/apps/layout/src/common/request/url-resolver.ts +23 -8
  61. package/generators/micro-react/templates/apps/layout/src/common/route-guard.ts +345 -0
  62. package/generators/micro-react/templates/apps/layout/src/common/theme.ts +2 -4
  63. package/generators/micro-react/templates/apps/layout/src/common/upload/oss.ts +3 -4
  64. package/generators/micro-react/templates/apps/layout/src/common/upload/types.ts +1 -1
  65. package/generators/micro-react/templates/apps/layout/src/common/uploadFiles.ts +1 -1
  66. package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.less +8 -3
  67. package/generators/micro-react/templates/apps/layout/src/components/AppTabs/index.tsx +25 -8
  68. package/generators/micro-react/templates/apps/layout/src/components/HeaderDropdown/index.tsx +20 -0
  69. package/generators/micro-react/templates/apps/layout/src/components/IconFont/index.tsx +5 -6
  70. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.less +21 -6
  71. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/index.tsx +83 -107
  72. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/micro-app-manager.ts +569 -0
  73. package/generators/micro-react/templates/apps/layout/src/components/RightContent/AvatarDropdown.tsx +383 -0
  74. package/generators/micro-react/templates/apps/layout/src/components/RightContent/avatar-dropdown.less +35 -0
  75. package/generators/micro-react/templates/apps/layout/src/components/RightContent/index.ts +2 -0
  76. package/generators/micro-react/templates/apps/layout/src/constants/index.ts +170 -6
  77. package/generators/micro-react/templates/apps/layout/src/global.less +19 -6
  78. package/generators/micro-react/templates/apps/layout/src/hooks/useMenu.ts +3 -2
  79. package/generators/micro-react/templates/apps/layout/src/hooks/useRoutePermissionRefresh.ts +72 -0
  80. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.less +3 -1
  81. package/generators/micro-react/templates/apps/layout/src/layouts/components/header/index.tsx +10 -55
  82. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.less +34 -4
  83. package/generators/micro-react/templates/apps/layout/src/layouts/components/menu/index.tsx +33 -9
  84. package/generators/micro-react/templates/apps/layout/src/layouts/index.less +84 -13
  85. package/generators/micro-react/templates/apps/layout/src/layouts/index.tsx +178 -47
  86. package/generators/micro-react/templates/apps/layout/src/locales/en-US.ts +12 -0
  87. package/generators/micro-react/templates/apps/layout/src/locales/zh-CN.ts +12 -0
  88. package/generators/micro-react/templates/apps/layout/src/pages/403/index.tsx +34 -0
  89. package/generators/micro-react/templates/apps/layout/src/pages/404/index.tsx +78 -0
  90. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.less +3 -0
  91. package/generators/micro-react/templates/apps/layout/src/pages/Home/index.tsx +7 -1
  92. package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.less +1 -1
  93. package/generators/micro-react/templates/apps/layout/src/pages/User/Login/index.tsx +9 -5
  94. package/generators/micro-react/templates/apps/layout/src/requestErrorConfig.ts +1 -1
  95. package/generators/micro-react/templates/apps/layout/src/services/config/index.ts +63 -0
  96. package/generators/micro-react/templates/apps/layout/src/services/config/type.ts +30 -0
  97. package/generators/micro-react/templates/apps/layout/src/services/user.ts +29 -2
  98. package/generators/micro-react/templates/apps/layout/tailwind.config.js +3 -0
  99. package/generators/micro-react/templates/deployDesc.md +3 -3
  100. package/generators/micro-react/templates/dev.preset.json +14 -0
  101. package/generators/micro-react/templates/docs/dev-preset.md +130 -0
  102. package/generators/micro-react/templates/package.json +21 -6
  103. package/generators/micro-react/templates/packages/common-intl/README.md +427 -0
  104. package/generators/micro-react/templates/packages/common-intl/package.json +34 -0
  105. package/generators/micro-react/templates/packages/common-intl/src/index.ts +7 -0
  106. package/generators/micro-react/templates/packages/common-intl/src/indexedDBUtils.ts +51 -0
  107. package/generators/micro-react/templates/packages/common-intl/src/intl.ts +50 -0
  108. package/generators/micro-react/templates/packages/common-intl/src/utils.ts +482 -0
  109. package/generators/micro-react/templates/packages/common-intl/tsconfig.json +22 -0
  110. package/generators/micro-react/templates/packages/common-intl/vite.config.ts +25 -0
  111. package/generators/micro-react/templates/scripts/apply-sentry-plugin.ts +45 -0
  112. package/generators/micro-react/templates/scripts/collect-dist.js +10 -0
  113. package/generators/micro-react/templates/scripts/dev-preset.js +265 -0
  114. package/generators/micro-react/templates/scripts/dev-preset.schema.json +39 -0
  115. package/generators/micro-react/templates/turbo.json +4 -1
  116. package/generators/subapp-react/index.js +326 -40
  117. package/generators/subapp-react/meta.json +10 -0
  118. package/generators/subapp-react/templates/homepage/.env +2 -1
  119. package/generators/subapp-react/templates/homepage/README.md +3 -3
  120. package/generators/subapp-react/templates/homepage/config/config.dev.ts +14 -7
  121. package/generators/subapp-react/templates/homepage/config/config.prod.development.ts +16 -5
  122. package/generators/subapp-react/templates/homepage/config/config.prod.testing.ts +16 -5
  123. package/generators/subapp-react/templates/homepage/config/config.prod.ts +14 -5
  124. package/generators/subapp-react/templates/homepage/config/config.ts +27 -0
  125. package/generators/subapp-react/templates/homepage/config/routes.ts +2 -2
  126. package/generators/subapp-react/templates/homepage/mock/api.mock.ts +2 -2
  127. package/generators/subapp-react/templates/homepage/package.json +7 -4
  128. package/generators/subapp-react/templates/homepage/src/app.tsx +18 -27
  129. package/generators/subapp-react/templates/homepage/src/common/request.ts +29 -2
  130. package/generators/subapp-react/templates/homepage/src/global.less +6 -5
  131. package/generators/subapp-react/templates/homepage/src/pages/index.less +3 -3
  132. package/generators/subapp-react/templates/homepage/src/pages/index.tsx +99 -60
  133. package/generators/subapp-react/templates/homepage/src/styles/theme.less +1 -1
  134. package/generators/subapp-umd/ignore-list.json +5 -0
  135. package/generators/subapp-umd/index.js +309 -0
  136. package/generators/subapp-umd/meta.json +11 -0
  137. package/generators/subapp-umd/templates/README.md +94 -0
  138. package/generators/subapp-umd/templates/package.json +35 -0
  139. package/generators/subapp-umd/templates/public/index.html +34 -0
  140. package/generators/subapp-umd/templates/src/App.less +15 -0
  141. package/generators/subapp-umd/templates/src/App.tsx +13 -0
  142. package/generators/subapp-umd/templates/src/index.ts +2 -0
  143. package/generators/subapp-umd/templates/tsconfig.json +27 -0
  144. package/generators/subapp-umd/templates/webpack.config.js +70 -0
  145. package/lib/utils.js +332 -2
  146. package/package.json +15 -2
  147. package/generators/micro-react/templates/apps/layout/mock/menus.json +0 -100
  148. package/generators/micro-react/templates/apps/layout/src/common/constants.ts +0 -38
  149. package/generators/micro-react/templates/apps/layout/src/components/MicroAppLoader/container-manager.ts +0 -202
  150. package/generators/micro-react/templates/packages/shared-styles/README.md +0 -124
  151. package/generators/micro-react/templates/packages/shared-styles/arco-design-mobile-override.less +0 -91
  152. package/generators/micro-react/templates/packages/shared-styles/arco-override.less +0 -119
  153. package/generators/micro-react/templates/packages/shared-styles/index.d.ts +0 -44
  154. package/generators/micro-react/templates/packages/shared-styles/index.less +0 -13
  155. package/generators/micro-react/templates/packages/shared-styles/package.json +0 -30
  156. package/generators/micro-react/templates/packages/shared-styles/theme-inject.less +0 -10
  157. package/generators/micro-react/templates/packages/shared-styles/themes/dark/custom-var.less +0 -290
  158. package/generators/micro-react/templates/packages/shared-styles/themes/normal/custom-var.less +0 -269
  159. package/generators/micro-react/templates/packages/shared-styles/variables-only.less +0 -433
  160. package/generators/micro-react/templates/packages/shared-styles/variables.less +0 -452
@@ -0,0 +1,309 @@
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
+ toCamel,
10
+ collectFiles,
11
+ transformDestPath,
12
+ isTemplateFile,
13
+ detectPackageScope,
14
+ setupErrorHandlers,
15
+ createLogger,
16
+ loadMicorc,
17
+ } = require('../../lib/utils');
18
+
19
+ const IGNORE_LIST = require('./ignore-list.json');
20
+
21
+ setupErrorHandlers();
22
+
23
+ module.exports = class extends Generator {
24
+ initializing() {
25
+ this.monorepoRoot = process.cwd();
26
+ this.logger = createLogger(this);
27
+
28
+ this.isDryRun = this.options.dryRun || process.env.MICO_DRY_RUN === '1';
29
+
30
+ const { config: rcConfig, configPath } = loadMicorc(this.monorepoRoot);
31
+ this.rcConfig = rcConfig;
32
+ if (configPath) {
33
+ this.logger.verbose('Loaded config from:', configPath);
34
+ }
35
+
36
+ const packagesDir = path.join(this.monorepoRoot, 'packages');
37
+ const workspaceFile = path.join(this.monorepoRoot, 'pnpm-workspace.yaml');
38
+
39
+ if (!fs.existsSync(packagesDir)) {
40
+ console.error('');
41
+ console.error('❌ Error: packages directory not found.');
42
+ console.error('');
43
+ console.error(' This generator must be run from a monorepo root that contains a "packages" directory.');
44
+ console.error(` Current directory: ${this.monorepoRoot}`);
45
+ console.error('');
46
+ process.exit(1);
47
+ }
48
+
49
+ if (!fs.existsSync(workspaceFile)) {
50
+ console.warn('');
51
+ console.warn('⚠️ Warning: pnpm-workspace.yaml not found.');
52
+ console.warn(' Make sure you are in the correct monorepo.');
53
+ console.warn('');
54
+ }
55
+ }
56
+
57
+ async prompting() {
58
+ try {
59
+ const detectedScope = detectPackageScope(this.monorepoRoot);
60
+ const rc = this.rcConfig || {};
61
+
62
+ this.answers = await this.prompt([
63
+ {
64
+ type: 'input',
65
+ name: 'appName',
66
+ message: 'Package name (e.g. my-widget)',
67
+ default: rc.defaultUmdName || 'my-widget',
68
+ filter: (input) => toKebab(input),
69
+ validate: (input) => {
70
+ const value = toKebab(input);
71
+ if (!value) return 'Package name is required';
72
+ const destDir = path.join(this.monorepoRoot, 'packages', value);
73
+ if (fs.existsSync(destDir)) {
74
+ return `Target already exists: packages/${value}`;
75
+ }
76
+ return true;
77
+ },
78
+ },
79
+ {
80
+ type: 'input',
81
+ name: 'umdGlobalName',
82
+ message: 'UMD global variable name (e.g. MyWidget)',
83
+ default: (answers) => toPascal(answers.appName),
84
+ validate: (input) => {
85
+ if (!input) return 'UMD global name is required';
86
+ if (!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(input)) {
87
+ return 'Must be a valid JavaScript identifier';
88
+ }
89
+ return true;
90
+ },
91
+ },
92
+ {
93
+ type: 'input',
94
+ name: 'packageScope',
95
+ message: 'Package scope',
96
+ default: rc.packageScope || detectedScope || '@my-project',
97
+ validate: (input) => {
98
+ if (!input) return 'Package scope is required';
99
+ if (!input.startsWith('@')) return 'Package scope must start with @';
100
+ return true;
101
+ },
102
+ },
103
+ {
104
+ type: 'input',
105
+ name: 'devPort',
106
+ message: 'Dev server port',
107
+ default: rc.umdDevPort || '9100',
108
+ validate: (input) => {
109
+ const port = Number(input);
110
+ if (!Number.isInteger(port) || port < 1024 || port > 65535) {
111
+ return 'Port must be an integer between 1024 and 65535';
112
+ }
113
+ return true;
114
+ },
115
+ },
116
+ ]);
117
+
118
+ this.appName = toKebab(this.answers.appName);
119
+ this.appNamePascal = toPascal(this.appName);
120
+ this.appNameCamel = toCamel(this.appName);
121
+ this.umdGlobalName = this.answers.umdGlobalName;
122
+ this.packageScope = this.answers.packageScope;
123
+ this.devPort = this.answers.devPort;
124
+ this.templateDir = this.templatePath();
125
+ this.destDir = path.join(this.monorepoRoot, 'packages', this.appName);
126
+ } catch (error) {
127
+ console.error('');
128
+ console.error('❌ Error during prompting:');
129
+ console.error(` ${error.message}`);
130
+ console.error('');
131
+ process.exit(1);
132
+ }
133
+ }
134
+
135
+ async writing() {
136
+ try {
137
+ if (!fs.existsSync(this.templateDir)) {
138
+ console.error('');
139
+ console.error('❌ Error: Template directory not found.');
140
+ console.error(` Expected: ${this.templateDir}`);
141
+ console.error('');
142
+ process.exit(1);
143
+ }
144
+
145
+ this.logger.verbose('Template directory:', this.templateDir);
146
+ this.logger.verbose('Destination directory:', this.destDir);
147
+
148
+ const templateData = {
149
+ appName: this.appName,
150
+ AppName: this.appNamePascal,
151
+ appNameCamel: this.appNameCamel,
152
+ umdGlobalName: this.umdGlobalName,
153
+ packageScope: this.packageScope,
154
+ devPort: this.devPort,
155
+ };
156
+
157
+ this.logger.verbose('Template data:', JSON.stringify(templateData, null, 2));
158
+
159
+ const files = collectFiles(this.templateDir, this.templateDir, IGNORE_LIST);
160
+
161
+ if (files.length === 0) {
162
+ console.error('');
163
+ console.error('❌ Error: No template files found.');
164
+ console.error(` Template directory: ${this.templateDir}`);
165
+ console.error('');
166
+ process.exit(1);
167
+ }
168
+
169
+ if (this.isDryRun) {
170
+ this.log('');
171
+ this.log('\x1b[33m📋 Dry run mode - no files will be created\x1b[0m');
172
+ this.log('');
173
+ this.log(` Package: ${this.appName}`);
174
+ this.log(` UMD global: ${this.umdGlobalName}`);
175
+ this.log(` Scope: ${this.packageScope}`);
176
+ this.log(` Dev port: ${this.devPort}`);
177
+ this.log(` Destination: packages/${this.appName}`);
178
+ this.log('');
179
+ this.log(' Would create the following files:');
180
+ this.log('');
181
+
182
+ let templateCount = 0;
183
+ let copyCount = 0;
184
+
185
+ for (const relPath of files) {
186
+ const destRelPath = transformDestPath(relPath);
187
+ const isTemplate = isTemplateFile(relPath);
188
+ const tag = isTemplate ? '\x1b[32m[tpl]\x1b[0m' : '\x1b[36m[cpy]\x1b[0m';
189
+ this.log(` ${tag} packages/${this.appName}/${destRelPath}`);
190
+
191
+ if (isTemplate) {
192
+ templateCount++;
193
+ } else {
194
+ copyCount++;
195
+ }
196
+ }
197
+
198
+ this.log('');
199
+ this.log(` Total: ${files.length} files (${templateCount} templates, ${copyCount} static)`);
200
+ this.log('');
201
+ this.log(' Run without --dry-run to actually create these files.');
202
+ this.log('');
203
+
204
+ this._skipInstall = true;
205
+ return;
206
+ }
207
+
208
+ this.log('');
209
+ this.log(`📦 Creating UMD package: ${this.appName}`);
210
+ this.log(` UMD global: ${this.umdGlobalName}`);
211
+ this.log(` Destination: packages/${this.appName}`);
212
+ this.log('');
213
+
214
+ let templateCount = 0;
215
+ let copyCount = 0;
216
+
217
+ for (const relPath of files) {
218
+ const srcPath = path.join(this.templateDir, relPath);
219
+ const destRelPath = transformDestPath(relPath);
220
+ const destPath = path.join(this.destDir, destRelPath);
221
+
222
+ if (isTemplateFile(relPath)) {
223
+ this.logger.file('template', destRelPath);
224
+ this.fs.copyTpl(srcPath, destPath, templateData);
225
+ templateCount++;
226
+ } else {
227
+ this.logger.file('copy', destRelPath);
228
+ this.fs.copy(srcPath, destPath);
229
+ copyCount++;
230
+ }
231
+ }
232
+
233
+ this.logger.verbose(`Processed: ${templateCount} templates, ${copyCount} copied`);
234
+ } catch (error) {
235
+ console.error('');
236
+ console.error('❌ Error during file generation:');
237
+ console.error(` ${error.message}`);
238
+ console.error('');
239
+ process.exit(1);
240
+ }
241
+ }
242
+
243
+ install() {
244
+ if (this._skipInstall) return;
245
+
246
+ this.log('');
247
+ this.log('📦 正在安装依赖...');
248
+ try {
249
+ this.spawnCommandSync('pnpm', ['install'], {
250
+ cwd: this.monorepoRoot,
251
+ });
252
+ } catch (e) {
253
+ this._installFailed = true;
254
+ this.log('');
255
+ this.log('⚠️ 依赖安装失败,但 UMD 包文件已全部生成。');
256
+ this.logger.verbose('Install error:', e.message);
257
+ return;
258
+ }
259
+
260
+ // 依赖安装成功后,格式化生成的文件
261
+ const prettierConfig = path.join(this.monorepoRoot, 'apps/layout/.prettierrc');
262
+ if (fs.existsSync(prettierConfig)) {
263
+ try {
264
+ this.spawnCommandSync(
265
+ 'pnpm',
266
+ [
267
+ '-C', 'apps/layout', 'exec', 'prettier',
268
+ '--config', prettierConfig,
269
+ '--write',
270
+ `${this.destDir}/**/*.{ts,tsx,js,jsx,json,less,md}`,
271
+ ],
272
+ { cwd: this.monorepoRoot },
273
+ );
274
+ } catch (e) {
275
+ this.logger.verbose('Formatting failed (non-critical):', e.message);
276
+ }
277
+ }
278
+ }
279
+
280
+ end() {
281
+ if (this._skipInstall) return;
282
+
283
+ this.log('');
284
+
285
+ if (this._installFailed) {
286
+ this.log('⚠️ UMD 包文件已创建,但依赖安装未完成。');
287
+ this.log('');
288
+ this.log(' 请手动安装依赖:');
289
+ this.log('');
290
+ this.log(' pnpm install');
291
+ this.log('');
292
+ this.log(' 如果安装仍然失败,可尝试:');
293
+ this.log(' pnpm install --network-concurrency 4');
294
+ } else {
295
+ this.log('✅ UMD 包创建成功!');
296
+ }
297
+
298
+ this.log('');
299
+ this.log(' 后续步骤:');
300
+ this.log('');
301
+ this.log(` cd packages/${this.appName}`);
302
+ this.log(' pnpm dev');
303
+ this.log('');
304
+ this.log(' 开发模式:');
305
+ this.log(` • 预览页面: http://localhost:${this.devPort}/`);
306
+ this.log(` • UMD 文件: http://localhost:${this.devPort}/${this.appName}.umd.js`);
307
+ this.log('');
308
+ }
309
+ };
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "subapp-umd",
3
+ "description": "在现有 Monorepo 中创建 UMD 组件包(Webpack 构建)",
4
+ "usage": "cd <monorepo-root> && mico create subapp-umd",
5
+ "features": [
6
+ "Webpack UMD 构建",
7
+ "React 18 + TypeScript",
8
+ "dev server 同时提供 HTML 预览和 UMD JS",
9
+ "Source Map 源码调试"
10
+ ]
11
+ }
@@ -0,0 +1,94 @@
1
+ # <%= AppName %>
2
+
3
+ UMD 组件包,基于 Webpack 构建,支持通过 `<script>` 标签加载。
4
+
5
+ ## 快速开始
6
+
7
+ ### 安装依赖
8
+
9
+ ```bash
10
+ # 在项目根目录执行
11
+ pnpm install
12
+ ```
13
+
14
+ ### 本地开发
15
+
16
+ ```bash
17
+ pnpm dev
18
+ ```
19
+
20
+ 启动后可通过两种方式使用:
21
+
22
+ | URL | 用途 |
23
+ |---|---|
24
+ | `http://localhost:<%= devPort %>/` | HTML 预览页,独立调试组件 |
25
+ | `http://localhost:<%= devPort %>/<%= appName %>.umd.js` | UMD JS 文件,供主应用联调 |
26
+
27
+ DevTools Sources 面板中可在 `webpack://<%= appName %>/src/` 下定位原始 TypeScript 源码进行断点调试。
28
+
29
+ ### 构建
30
+
31
+ ```bash
32
+ pnpm build
33
+ ```
34
+
35
+ 产物输出到 `dist/` 目录:
36
+ - `dist/<%= appName %>.umd.js` — UMD bundle
37
+ - `dist/<%= appName %>.css` — 样式文件(如有)
38
+
39
+ ### 在浏览器中使用
40
+
41
+ ```html
42
+ <!-- 1. 加载 React(宿主环境提供) -->
43
+ <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
44
+ <script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
45
+
46
+ <!-- 2. 加载 UMD 组件 -->
47
+ <link rel="stylesheet" href="path/to/<%= appName %>.css" />
48
+ <script src="path/to/<%= appName %>.umd.js"></script>
49
+
50
+ <!-- 3. 使用 -->
51
+ <script>
52
+ var App = window['<%= umdGlobalName %>'].default;
53
+ var root = ReactDOM.createRoot(document.getElementById('root'));
54
+ root.render(React.createElement(App));
55
+ </script>
56
+ ```
57
+
58
+ ### 主应用联调
59
+
60
+ 在主应用的 mock 菜单中配置 `jsUrls` 指向本地 dev server:
61
+
62
+ ```json
63
+ {
64
+ "jsUrls": ["//localhost:<%= devPort %>/<%= appName %>.umd.js"]
65
+ }
66
+ ```
67
+
68
+ ## 目录结构
69
+
70
+ ```
71
+ <%= appName %>/
72
+ ├── public/
73
+ │ └── index.html # 本地开发预览页
74
+ ├── src/
75
+ │ ├── index.ts # UMD 入口
76
+ │ ├── App.tsx # 主组件
77
+ │ └── App.less # 样式
78
+ ├── webpack.config.js # Webpack 配置
79
+ ├── tsconfig.json # TypeScript 配置
80
+ └── package.json
81
+ ```
82
+
83
+ ## 全局变量
84
+
85
+ UMD 包加载后,可通过 `window.<%= umdGlobalName %>` 访问导出内容。
86
+
87
+ ## External 依赖
88
+
89
+ 以下依赖不打入包体,需由宿主环境提供:
90
+
91
+ | 包名 | 全局变量 |
92
+ |---|---|
93
+ | `react` | `React` |
94
+ | `react-dom` | `ReactDOM` |
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "<%= packageScope %>/<%= appName %>",
3
+ "version": "0.0.1",
4
+ "description": "UMD package - <%= appName %>",
5
+ "main": "./dist/<%= appName %>.umd.js",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "scripts": {
10
+ "dev": "webpack serve --mode development",
11
+ "build": "webpack --mode production",
12
+ "build:development": "webpack --mode development",
13
+ "clean": "rm -rf dist"
14
+ },
15
+ "peerDependencies": {
16
+ "react": "^18.0.0",
17
+ "react-dom": "^18.0.0",
18
+ "@mico-platform/ui": ">=0.0.13"
19
+ },
20
+ "devDependencies": {
21
+ "@types/react": "^18.3.26",
22
+ "@types/react-dom": "^18.3.7",
23
+ "css-loader": "^7.1.2",
24
+ "style-loader": "^4.0.0",
25
+ "html-webpack-plugin": "^5.6.3",
26
+ "less": "^4.3.0",
27
+ "less-loader": "^12.2.0",
28
+ "mini-css-extract-plugin": "^2.9.2",
29
+ "ts-loader": "^9.5.2",
30
+ "typescript": "^5.8.3",
31
+ "webpack": "^5.99.9",
32
+ "webpack-cli": "^6.0.1",
33
+ "webpack-dev-server": "^5.2.1"
34
+ }
35
+ }
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title><%= AppName %> - UMD Dev Preview</title>
7
+ <style>
8
+ body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
9
+ #root { padding: 24px; }
10
+ </style>
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+
15
+ <!-- React (external, provided by host environment) -->
16
+ <script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
17
+ <script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
18
+
19
+ <!-- UMD Bundle -->
20
+ <script src="/<%= appName %>.umd.js"></script>
21
+
22
+ <script>
23
+ var mod = window['<%= umdGlobalName %>'];
24
+ var App = mod && (mod.default || mod.App || mod);
25
+ if (App) {
26
+ var root = ReactDOM.createRoot(document.getElementById('root'));
27
+ root.render(React.createElement(App));
28
+ } else {
29
+ document.getElementById('root').innerHTML =
30
+ '<p style="color:red">Error: window.<%= umdGlobalName %> not found. Check UMD global name.</p>';
31
+ }
32
+ </script>
33
+ </body>
34
+ </html>
@@ -0,0 +1,15 @@
1
+ .<%= appName %>-container {
2
+ padding: 16px;
3
+
4
+ h2 {
5
+ margin: 0 0 8px;
6
+ font-size: 20px;
7
+ color: #1d2129;
8
+ }
9
+
10
+ p {
11
+ margin: 0;
12
+ color: #86909c;
13
+ font-size: 14px;
14
+ }
15
+ }
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import './App.less';
3
+
4
+ const App: React.FC = () => {
5
+ return (
6
+ <div className="<%= appName %>-container">
7
+ <h2><%= AppName %></h2>
8
+ <p>UMD component is working.</p>
9
+ </div>
10
+ );
11
+ };
12
+
13
+ export default App;
@@ -0,0 +1,2 @@
1
+ export { default } from './App';
2
+ export { default as App } from './App';
@@ -0,0 +1,27 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ESNext",
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "jsx": "react-jsx",
7
+ "moduleResolution": "bundler",
8
+ "resolveJsonModule": true,
9
+ "isolatedModules": true,
10
+ "strict": true,
11
+ "esModuleInterop": true,
12
+ "skipLibCheck": true,
13
+ "noUnusedLocals": false,
14
+ "noUnusedParameters": false,
15
+ "noFallthroughCasesInSwitch": true,
16
+ "declaration": true,
17
+ "declarationMap": true,
18
+ "declarationDir": "./dist",
19
+ "outDir": "./dist",
20
+ "baseUrl": ".",
21
+ "paths": {
22
+ "@/*": ["src/*"]
23
+ }
24
+ },
25
+ "include": ["src/**/*"],
26
+ "exclude": ["node_modules", "dist"]
27
+ }
@@ -0,0 +1,70 @@
1
+ const path = require('path');
2
+ const HtmlWebpackPlugin = require('html-webpack-plugin');
3
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
4
+
5
+ module.exports = (env, argv) => {
6
+ const isProd = argv.mode === 'production';
7
+ const outputFilename = '<%= appName %>.umd.js';
8
+
9
+ return {
10
+ entry: './src/index.ts',
11
+ output: {
12
+ path: path.resolve(__dirname, 'dist'),
13
+ filename: outputFilename,
14
+ publicPath: '/',
15
+ library: '<%= umdGlobalName %>',
16
+ libraryTarget: 'umd',
17
+ umdNamedDefine: true,
18
+ globalObject: 'typeof self !== "undefined" ? self : this',
19
+ clean: true,
20
+ },
21
+ externals: {
22
+ react: 'React',
23
+ 'react-dom': 'ReactDOM',
24
+ '@mico-platform/ui': 'micoUI',
25
+ },
26
+ resolve: {
27
+ extensions: ['.ts', '.tsx', '.js', '.jsx'],
28
+ },
29
+ module: {
30
+ rules: [
31
+ {
32
+ test: /\.tsx?$/,
33
+ use: 'ts-loader',
34
+ exclude: /node_modules/,
35
+ },
36
+ {
37
+ test: /\.less$/,
38
+ use: ['style-loader', 'css-loader', 'less-loader'],
39
+ },
40
+ {
41
+ test: /\.css$/,
42
+ use: ['style-loader', 'css-loader'],
43
+ },
44
+ ],
45
+ },
46
+ plugins: [
47
+ new HtmlWebpackPlugin({
48
+ template: './public/index.html',
49
+ inject: false,
50
+ }),
51
+ ...(isProd
52
+ ? [new MiniCssExtractPlugin({ filename: '<%= appName %>.css' })]
53
+ : []),
54
+ ],
55
+ devtool: isProd ? false : 'source-map',
56
+ devServer: {
57
+ port: <%= devPort %>,
58
+ hot: true,
59
+ open: false,
60
+ allowedHosts: 'all',
61
+ headers: {
62
+ 'Access-Control-Allow-Origin': '*',
63
+ 'Access-Control-Allow-Methods': 'GET',
64
+ },
65
+ static: {
66
+ directory: path.join(__dirname, 'public'),
67
+ },
68
+ },
69
+ };
70
+ };