cmpt-huitu-cli 1.0.0 → 1.0.2

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.
@@ -0,0 +1,711 @@
1
+ 你是一名前端架构师,React/Vue/Angular 专家。
2
+
3
+ # 模板项目规则提示词
4
+
5
+ > 本文档定义了基于 Vue 3 + Vite + Element Plus 的慧图标准模板项目的开发规则、最佳实践和注意事项。
6
+
7
+ ## 📋 目录
8
+
9
+ - [项目概述](#项目概述)
10
+ - [技术栈](#技术栈)
11
+ - [目录结构规范](#目录结构规范)
12
+ - [代码规范](#代码规范)
13
+ - [命名规范](#命名规范)
14
+ - [配置规范](#配置规范)
15
+ - [开发规范](#开发规范)
16
+ - [最佳实践](#最佳实践)
17
+ - [注意事项](#注意事项)
18
+
19
+ ---
20
+
21
+ ## 📖 项目概述
22
+
23
+ 这是一个基于 **Monorepo** 架构的 Vue 3 标准项目模板,使用 `cmpt-huitu-cli`
24
+ 工具创建。项目集成了共享的 UI 组件库(`cmpt-huitu-ui`)和工具函数库(`cmpt-huitu-utils`),遵循统一的开发规范,便于团队协作和代码复用。
25
+
26
+ ### 核心特性
27
+
28
+ - ✅ **Vue 3.5+**:使用 Composition API 和 `<script setup>` 语法
29
+ - ✅ **Vite 7**:极速构建工具,支持 HMR
30
+ - ✅ **Element Plus**:企业级 UI 组件库
31
+ - ✅ **Pinia**:Vue 3 官方状态管理
32
+ - ✅ **Vue Router 4**:官方路由管理器
33
+ - ✅ **TypeScript 支持**:自动导入类型声明
34
+ - ✅ **ESLint + Prettier**:代码格式化和检查
35
+ - ✅ **共享包集成**:cmpt-huitu-ui、cmpt-huitu-utils
36
+
37
+ ---
38
+
39
+ ## 🛠 技术栈
40
+
41
+ ### 核心框架
42
+
43
+ - **Vue**: `^3.5.18`
44
+ - **Vite**: `^7.1.5`
45
+ - **Vue Router**: `^4.5.1`
46
+ - **Pinia**: `^3.0.3`
47
+
48
+ ### UI 框架
49
+
50
+ - **Element Plus**: `^2.11.1`
51
+ - **@element-plus/icons-vue**: `^2.3.2`
52
+
53
+ ### 共享包
54
+
55
+ - **cmpt-huitu-ui**: `^1.0.0` - UI 组件库
56
+ - **cmpt-huitu-utils**: `^1.0.0` - 工具函数库
57
+
58
+ ### 工具库
59
+
60
+ - **axios**: `^1.11.0` - HTTP 客户端
61
+ - **dayjs**: `^1.11.18` - 时间处理
62
+ - **lodash-es**: `^4.17.21` - 工具函数
63
+ - **nprogress**: `^0.2.0` - 进度条
64
+
65
+ ---
66
+
67
+ ## 📁 目录结构规范
68
+
69
+ ```
70
+ 项目根目录/
71
+ ├── public/ # 静态资源目录(不会被 Vite 处理)
72
+ │ ├── config/ # 配置文件目录
73
+ │ │ └── envCfg.js # 环境配置文件(必需修改)
74
+ │ ├── images/ # 图片资源
75
+ │ │ └── favicon.ico # 网站图标
76
+ │ └── static/ # 静态文件
77
+
78
+ ├── src/ # 源代码目录
79
+ │ ├── assets/ # 资源文件(会被 Vite 处理)
80
+ │ │ ├── images/ # 图片资源
81
+ │ │ │ ├── 404/ # 404 页面图片
82
+ │ │ │ └── login/ # 登录页图片
83
+ │ │ └── empty.png # 空状态图片
84
+ │ │
85
+ │ ├── components/ # 全局组件目录
86
+ │ │ └── error/ # 错误处理组件
87
+ │ │ └── error.vue
88
+ │ │
89
+ │ ├── routers/ # 路由配置目录
90
+ │ │ ├── modules/ # 路由模块(自动导入)
91
+ │ │ │ └── example.js # 示例路由模块
92
+ │ │ ├── base.js # 基础路由(登录、404等)
93
+ │ │ ├── guard.js # 路由守卫
94
+ │ │ └── index.js # 路由入口(自动合并 modules)
95
+ │ │
96
+ │ ├── services/ # API 服务目录
97
+ │ │ └── login.js # 登录服务
98
+ │ │
99
+ │ ├── stores/ # Pinia 状态管理目录
100
+ │ │ ├── index/ # Store 模块
101
+ │ │ │ ├── global.js # 全局状态
102
+ │ │ │ └── template.js # 模板状态
103
+ │ │ └── index.js # Store 入口
104
+ │ │
105
+ │ ├── styles/ # 样式目录
106
+ │ │ ├── theme/ # 主题配置
107
+ │ │ │ ├── variables.scss # 主题变量
108
+ │ │ │ └── README.md # 主题文档
109
+ │ │ └── index.scss # 全局样式入口
110
+ │ │
111
+ │ ├── utils/ # 工具函数目录
112
+ │ │ ├── auth.js # 认证工具
113
+ │ │ ├── errorCode.js # 错误码定义
114
+ │ │ ├── index.js # 工具函数入口
115
+ │ │ ├── requestAxios.js # Axios 封装
116
+ │ │ ├── RequestCache.js # 请求缓存
117
+ │ │ └── theme.js # 主题切换工具
118
+ │ │
119
+ │ ├── views/ # 页面视图目录
120
+ │ │ ├── login/ # 登录页
121
+ │ │ │ └── index.vue
122
+ │ │ ├── about.vue # 关于页面
123
+ │ │ └── home.vue # 首页
124
+ │ │
125
+ │ ├── types/ # TypeScript 类型定义(可选)
126
+ │ │
127
+ │ ├── app.vue # 根组件
128
+ │ ├── main.js # 应用入口
129
+ │ ├── components.d.ts # 组件自动导入类型(自动生成)
130
+ │ └── imports.d.ts # 自动导入类型(自动生成)
131
+
132
+ ├── vite/ # Vite 插件配置目录
133
+ │ └── plugins/ # 插件配置
134
+ │ ├── autoComponents.js # 组件自动导入
135
+ │ ├── autoImport.js # API 自动导入
136
+ │ ├── compression.js # 压缩配置
137
+ │ ├── externals.js # 外部化配置
138
+ │ ├── index.js # 插件入口
139
+ │ └── visualizer.js # 打包分析
140
+
141
+ ├── .env # 环境变量文件(本地开发,不提交)
142
+ ├── .env.production # 生产环境变量
143
+ ├── .env.development # 开发环境变量
144
+ ├── .gitignore # Git 忽略文件
145
+ ├── eslint.config.js # ESLint 配置
146
+ ├── index.html # HTML 模板
147
+ ├── jsconfig.json # JavaScript 项目配置(VSCode 智能提示)
148
+ ├── package.json # 项目配置
149
+ ├── README.md # 项目说明
150
+ └── vite.config.js # Vite 配置文件
151
+ ```
152
+
153
+ ### 目录说明
154
+
155
+ #### `public/` - 静态资源
156
+
157
+ - **不会被 Vite 处理**,原样复制到输出目录
158
+ - **必需配置**:`public/config/envCfg.js` - 环境配置
159
+ - 存放不会被频繁修改的静态资源
160
+
161
+ #### `src/assets/` - 资源文件
162
+
163
+ - **会被 Vite 处理**,支持导入和路径别名
164
+ - 存放会被代码引用的资源(图片、字体等)
165
+ - 支持动态导入和路径别名 `@/assets/...`
166
+
167
+ #### `src/routers/modules/` - 路由模块
168
+
169
+ - **自动导入**:Vite 会自动扫描并合并所有 `.js` 文件
170
+ - 每个模块导出一个路由对象或数组
171
+ - 文件名建议使用 `模块名.js` 格式
172
+
173
+ #### `src/stores/` - 状态管理
174
+
175
+ - 使用 Pinia,按模块组织
176
+ - 每个模块一个文件,文件名即 store id
177
+
178
+ #### `src/services/` - API 服务
179
+
180
+ - 按功能模块组织 API 请求
181
+ - 每个文件对应一个业务模块
182
+ - 统一使用 `@/utils/requestAxios.js` 封装的 axios 实例
183
+
184
+ ---
185
+
186
+ ## 📝 代码规范
187
+
188
+ ### Vue 组件规范
189
+
190
+ #### 1. 使用 `<script setup>` 语法
191
+
192
+ ```vue
193
+ <script setup>
194
+ // ✅ 推荐:使用 Composition API + <script setup>
195
+ import { ref, computed, onMounted } from 'vue'
196
+
197
+ const count = ref(0)
198
+ const doubled = computed(() => count.value * 2)
199
+
200
+ onMounted(() => {
201
+ console.log('mounted')
202
+ })
203
+ </script>
204
+ ```
205
+
206
+ #### 1.1 组件文件命名
207
+
208
+ - **组件文件名**:使用 **camelCase(小驼峰)**,如 `userProfile.vue`、`home.vue`
209
+ - **组件注册名**:在模板中使用时,保持 camelCase 或转换为 PascalCase(Vue 会自动处理)
210
+
211
+ #### 2. 编译器宏无需导入
212
+
213
+ ```vue
214
+ <script setup>
215
+ // ✅ 正确:defineProps、defineEmits 是编译器宏,无需导入
216
+ const props = defineProps({
217
+ title: String,
218
+ })
219
+
220
+ const emit = defineEmits(['update'])
221
+
222
+ // ❌ 错误:不要导入编译器宏
223
+ // import { defineProps, defineEmits } from 'vue'
224
+ </script>
225
+ ```
226
+
227
+ #### 3. 组件命名
228
+
229
+ - **组件文件名**:使用 **camelCase(小驼峰)**,如 `userProfile.vue`、`home.vue`
230
+ - **组件注册名**:在模板中使用时,Vue 会自动处理大小写转换(camelCase ↔ PascalCase)
231
+ - **Props 定义**:使用对象形式,提供类型和默认值
232
+
233
+ ```vue
234
+ <script setup>
235
+ // ✅ 推荐:完整的 props 定义
236
+ const props = defineProps({
237
+ title: {
238
+ type: String,
239
+ required: true,
240
+ },
241
+ count: {
242
+ type: Number,
243
+ default: 0,
244
+ },
245
+ })
246
+ </script>
247
+ ```
248
+
249
+ #### 4. 样式规范
250
+
251
+ - **使用 Scoped 样式**:避免样式污染
252
+ - **使用 CSS 变量**:利用主题系统
253
+ - **SCSS 语法**:使用 `@use` 替代 `@import`(避免弃用警告)
254
+
255
+ ```vue
256
+ <style lang="scss" scoped>
257
+ // ✅ 推荐:使用 scoped 和 SCSS
258
+ .container {
259
+ padding: var(--spacing-md);
260
+ color: var(--main-font-color);
261
+ }
262
+ </style>
263
+ ```
264
+
265
+ ### 路由规范
266
+
267
+ #### 1. 路由模块化
268
+
269
+ 在 `src/routers/modules/` 下创建路由模块:
270
+
271
+ ```javascript
272
+ // src/routers/modules/user.js
273
+ export default {
274
+ path: '/user',
275
+ name: 'User',
276
+ component: () => import('@/views/user/index.vue'),
277
+ meta: {
278
+ title: '用户管理',
279
+ requiresAuth: true, // 需要登录
280
+ },
281
+ children: [
282
+ {
283
+ path: 'list',
284
+ name: 'UserList',
285
+ component: () => import('@/views/user/list.vue'),
286
+ },
287
+ ],
288
+ }
289
+ ```
290
+
291
+ #### 2. 路由命名
292
+
293
+ - **路由 name**:使用 PascalCase,与组件名对应
294
+ - **路由 path**:使用 kebab-case,与菜单路径对应
295
+
296
+ #### 3. 路由元信息
297
+
298
+ 使用 `meta` 字段存储路由元信息:
299
+
300
+ ```javascript
301
+ {
302
+ meta: {
303
+ title: '页面标题', // 页面标题
304
+ requiresAuth: true, // 是否需要登录
305
+ roles: ['admin'], // 权限角色
306
+ keepAlive: true, // 是否缓存
307
+ hidden: false, // 是否在菜单中隐藏
308
+ },
309
+ }
310
+ ```
311
+
312
+ ### 状态管理规范
313
+
314
+ #### 1. Store 定义
315
+
316
+ 使用 `defineStore` 定义 store:
317
+
318
+ ```javascript
319
+ // src/stores/user.js
320
+ import { defineStore } from 'pinia'
321
+ import { ref, computed } from 'vue'
322
+
323
+ export const useUserStore = defineStore('user', () => {
324
+ // State
325
+ const userInfo = ref(null)
326
+ const token = ref('')
327
+
328
+ // Getters
329
+ const isLoggedIn = computed(() => !!token.value)
330
+
331
+ // Actions
332
+ function setUserInfo(info) {
333
+ userInfo.value = info
334
+ }
335
+
336
+ function logout() {
337
+ userInfo.value = null
338
+ token.value = ''
339
+ }
340
+
341
+ return {
342
+ userInfo,
343
+ token,
344
+ isLoggedIn,
345
+ setUserInfo,
346
+ logout,
347
+ }
348
+ })
349
+ ```
350
+
351
+ #### 2. Store 使用
352
+
353
+ 在组件中使用:
354
+
355
+ ```vue
356
+ <script setup>
357
+ import { useUserStore } from '@/stores/user'
358
+
359
+ const userStore = useUserStore()
360
+
361
+ // 访问 state
362
+ console.log(userStore.userInfo)
363
+
364
+ // 调用 action
365
+ userStore.setUserInfo({ name: 'John' })
366
+
367
+ // 使用 getter
368
+ if (userStore.isLoggedIn) {
369
+ // ...
370
+ }
371
+ </script>
372
+ ```
373
+
374
+ ### API 请求规范
375
+
376
+ #### 1. 统一使用封装的 axios 实例
377
+
378
+ ```javascript
379
+ // src/services/user.js
380
+ import request from '@/utils/requestAxios'
381
+
382
+ // ✅ 推荐:统一使用封装的 request
383
+ export function getUserList(params) {
384
+ return request({
385
+ url: '/api/user/list',
386
+ method: 'get',
387
+ params,
388
+ })
389
+ }
390
+
391
+ export function createUser(data) {
392
+ return request({
393
+ url: '/api/user',
394
+ method: 'post',
395
+ data,
396
+ })
397
+ }
398
+ ```
399
+
400
+ #### 2. 在组件中使用
401
+
402
+ ```vue
403
+ <script setup>
404
+ import { ref, onMounted } from 'vue'
405
+ import { getUserList } from '@/services/user'
406
+
407
+ const list = ref([])
408
+
409
+ onMounted(async () => {
410
+ try {
411
+ const res = await getUserList({ page: 1 })
412
+ list.value = res.data
413
+ } catch (error) {
414
+ console.error('获取用户列表失败', error)
415
+ }
416
+ })
417
+ </script>
418
+ ```
419
+
420
+ ---
421
+
422
+ ## 🏷 命名规范
423
+
424
+ ### 文件命名
425
+
426
+ | 类型 | 命名规范 | 示例 |
427
+ | -------------- | ---------------- | ----------------------------- |
428
+ | **Vue 组件** | camelCase | `userProfile.vue`、`home.vue` |
429
+ | **路由模块** | camelCase | `userManagement.js` |
430
+ | **Store 模块** | camelCase | `userStore.js` |
431
+ | **工具函数** | camelCase | `formatDate.js` |
432
+ | **常量文件** | UPPER_SNAKE_CASE | `ERROR_CODE.js` |
433
+
434
+ ### 变量命名
435
+
436
+ - **变量/函数**:camelCase - `userName`, `getUserInfo()`
437
+ - **常量**:UPPER_SNAKE_CASE - `API_BASE_URL`, `MAX_COUNT`
438
+ - **组件名**:PascalCase - `UserProfile`, `DataTable`
439
+ - **CSS 类名**:kebab-case - `.user-profile`, `.data-table`
440
+
441
+ ### 路径别名
442
+
443
+ 使用 `jsconfig.json` 中定义的路径别名:
444
+
445
+ | 别名 | 对应路径 | 用途 |
446
+ | -------------- | ----------------- | ------------ |
447
+ | `@/` | `src/` | 源代码根目录 |
448
+ | `@public/` | `public/` | 静态资源目录 |
449
+ | `@components/` | `src/components/` | 全局组件 |
450
+ | `@views/` | `src/views/` | 页面视图 |
451
+ | `@routers/` | `src/routers/` | 路由配置 |
452
+ | `@stores/` | `src/stores/` | 状态管理 |
453
+ | `@styles/` | `src/styles/` | 样式文件 |
454
+ | `@utils/` | `src/utils/` | 工具函数 |
455
+ | `@assets/` | `src/assets/` | 资源文件 |
456
+ | `@services/` | `src/services/` | API 服务 |
457
+
458
+ ```javascript
459
+ // ✅ 推荐:使用路径别名(组件文件名使用 camelCase)
460
+ import { parseTime } from '@/utils'
461
+ import UserList from '@/views/user/list.vue'
462
+ import { useUserStore } from '@/stores/user'
463
+
464
+ // ❌ 不推荐:使用相对路径
465
+ import { parseTime } from '../../utils'
466
+ ```
467
+
468
+ ---
469
+
470
+ ## ⚙️ 配置规范
471
+
472
+ ### 环境配置 (`public/config/envCfg.js`)
473
+
474
+ **⚠️ 重要:创建项目后必须修改此配置文件**
475
+
476
+ ```javascript
477
+ // public/config/envCfg.js
478
+ const config = {
479
+ // 登录配置
480
+ LoginUnifyBase: origin + '/sso',
481
+ LoginUnifyAuthClientid: 'your-client-id',
482
+ LoginUnifyAuthTenant: 'your-tenant-name',
483
+
484
+ // API 配置
485
+ apiUrlNew: origin + '/api/',
486
+
487
+ // 文件服务配置
488
+ uploadUrl: origin + '/upload',
489
+ downloadUrl: origin + '/download',
490
+
491
+ // ... 其他配置
492
+ }
493
+ ```
494
+
495
+ ### 环境变量 (`.env`)
496
+
497
+ 在项目根目录创建环境变量文件:
498
+
499
+ ```bash
500
+ # .env.development
501
+ VITE_PORT=3001
502
+ VITE_PATH=/
503
+ VITE_MOCK=true
504
+
505
+ # .env.production
506
+ VITE_PATH=/production-path/
507
+ VITE_MOCK=false
508
+ ```
509
+
510
+ 在代码中使用:
511
+
512
+ ```javascript
513
+ // ✅ 正确:使用 import.meta.env
514
+ const apiUrl = import.meta.env.VITE_API_URL
515
+
516
+ // ❌ 错误:不要使用 process.env(Vite 不支持)
517
+ // const apiUrl = process.env.VITE_API_URL
518
+ ```
519
+
520
+ ### Vite 配置
521
+
522
+ 主要配置在 `vite.config.js`,已预配置:
523
+
524
+ - **路径别名**:`@/`、`@public/` 等
525
+ - **自动导入**:Vue API、组件、Element Plus 组件
526
+ - **SCSS 全局变量**:自动注入 `cmpt-huitu-ui` 样式变量
527
+ - **代理配置**:开发环境 API 代理
528
+ - **构建优化**:代码分割、压缩等
529
+
530
+ ---
531
+
532
+ ## 💻 开发规范
533
+
534
+ ### 1. 开发流程
535
+
536
+ ```bash
537
+ # 1. 安装依赖
538
+ pnpm install
539
+
540
+ # 2. 启动开发服务器
541
+ pnpm dev
542
+
543
+ # 3. 代码检查
544
+ pnpm lint
545
+
546
+ # 4. 构建生产版本
547
+ pnpm build
548
+
549
+ # 5. 预览构建结果
550
+ pnpm preview
551
+ ```
552
+
553
+ ### 2. Git 提交规范
554
+
555
+ 遵循 [Conventional Commits](https://www.conventionalcommits.org/) 规范:
556
+
557
+ ```bash
558
+ # 功能新增
559
+ git commit -m "feat: 添加用户管理页面"
560
+
561
+ # 问题修复
562
+ git commit -m "fix: 修复登录后跳转错误"
563
+
564
+ # 文档更新
565
+ git commit -m "docs: 更新 README"
566
+
567
+ # 代码重构
568
+ git commit -m "refactor: 重构用户服务代码"
569
+
570
+ # 样式调整
571
+ git commit -m "style: 调整页面布局"
572
+ ```
573
+
574
+ ### 3. 代码审查要点
575
+
576
+ - ✅ 是否遵循命名规范
577
+ - ✅ 是否使用路径别名而非相对路径
578
+ - ✅ 是否正确处理异步操作(try-catch)
579
+ - ✅ 是否使用共享包而非重复实现
580
+ - ✅ 样式是否使用 scoped 或 CSS 变量
581
+ - ✅ 是否移除未使用的导入和代码
582
+
583
+ ---
584
+
585
+ ## ✨ 最佳实践
586
+
587
+ ### 1. 使用共享包
588
+
589
+ 优先使用 `cmpt-huitu-ui` 和 `cmpt-huitu-utils`:
590
+
591
+ ```javascript
592
+ // ✅ 推荐:使用共享工具函数
593
+ import { parseTime, cache, modal } from 'cmpt-huitu-utils'
594
+
595
+ // ✅ 推荐:使用共享 UI 组件
596
+ import { HTable, VexTable, HtDialog } from 'cmpt-huitu-ui'
597
+
598
+ // ❌ 不推荐:重复实现已有功能
599
+ // function formatTime(time) { ... } // 已有 parseTime
600
+ ```
601
+
602
+ ### 2. 组件复用
603
+
604
+ - 通用组件放在 `src/components/`
605
+ - 页面级组件放在对应的 `views/` 子目录
606
+ - 复杂逻辑抽离为 Composable 函数
607
+
608
+ ### 3. 性能优化
609
+
610
+ - 使用路由懒加载
611
+ - 大组件使用异步组件
612
+ - 合理使用 `v-memo` 和 `v-once`
613
+ - 图片使用懒加载
614
+
615
+ ```javascript
616
+ // ✅ 路由懒加载(文件名使用 camelCase)
617
+ component: () => import('@/views/user/index.vue')
618
+
619
+ // ✅ 异步组件(文件名使用 camelCase)
620
+ const AsyncComponent = defineAsyncComponent(() => import('@/components/heavyComponent.vue'))
621
+ ```
622
+
623
+ ### 4. 错误处理
624
+
625
+ 统一错误处理:
626
+
627
+ ```javascript
628
+ // ✅ 推荐:统一错误处理
629
+ try {
630
+ const res = await getUserList()
631
+ // 处理成功
632
+ } catch (error) {
633
+ console.error('获取用户列表失败', error)
634
+ ElMessage.error('获取用户列表失败,请稍后重试')
635
+ }
636
+ ```
637
+
638
+ ### 5. 类型安全
639
+
640
+ 利用自动生成的类型文件:
641
+
642
+ ```typescript
643
+ // components.d.ts 和 imports.d.ts 由插件自动生成
644
+ // 提供完整的类型提示
645
+ ```
646
+
647
+ ---
648
+
649
+ ## ⚠️ 注意事项
650
+
651
+ ### 1. 必须修改的配置
652
+
653
+ - ✅ **`public/config/envCfg.js`** - 环境配置(API 地址、登录配置等)
654
+ - ✅ **`index.html`** - 页面标题、项目名称
655
+ - ✅ **`package.json`** - 项目名称、描述(CLI 会自动修改)
656
+ - ✅ **`vite.config.js`** - 如需自定义构建配置
657
+
658
+ ### 2. 共享包依赖
659
+
660
+ - ✅ 使用 `workspace:*` 在 Monorepo 中开发
661
+ - ✅ CLI 创建项目时自动转换为版本号(如 `^1.0.0`)
662
+ - ✅ 不要手动修改 `package.json` 中的共享包版本
663
+
664
+ ### 3. 样式变量
665
+
666
+ - ✅ 使用 `cmpt-huitu-ui` 提供的全局 SCSS 变量
667
+ - ✅ 自定义主题变量放在 `src/styles/theme/variables.scss`
668
+ - ✅ 使用 `@use` 替代 `@import`(避免弃用警告)
669
+
670
+ ### 4. 路由模块
671
+
672
+ - ✅ 路由模块自动导入,无需手动注册
673
+ - ✅ 404 路由会自动添加到最后
674
+ - ✅ 路由守卫在 `src/routers/guard.js` 中统一处理
675
+
676
+ ### 5. 环境变量
677
+
678
+ - ✅ 只在 `.env` 文件中使用,不要提交到 Git
679
+ - ✅ 使用 `VITE_` 前缀
680
+ - ✅ 在代码中使用 `import.meta.env.VITE_XXX`
681
+
682
+ ### 6. 构建优化
683
+
684
+ - ✅ 生产构建会自动压缩和优化
685
+ - ✅ 使用 `pnpm preview` 预览生产构建结果
686
+ - ✅ 构建产物在 `dist/` 目录
687
+
688
+ ---
689
+
690
+ ## 📚 相关文档
691
+
692
+ - [Vue 3 官方文档](https://cn.vuejs.org/)
693
+ - [Vite 官方文档](https://cn.vite.dev/)
694
+ - [Element Plus 文档](https://element-plus.org/zh-CN/)
695
+ - [Pinia 文档](https://pinia.vuejs.org/zh/)
696
+ - [Vue Router 文档](https://router.vuejs.org/zh/)
697
+
698
+ ---
699
+
700
+ ## 🔄 更新日志
701
+
702
+ - **v1.0.0** (2026-01-04)
703
+ - 初始版本
704
+ - 集成 Vue 3 + Vite + Element Plus
705
+ - 集成 cmpt-huitu-ui 和 cmpt-huitu-utils
706
+ - 完整的开发规范和最佳实践
707
+
708
+ ---
709
+
710
+ **维护者**: 慧图前端团队
711
+ **最后更新**: 2026-01-04