@chenhui996/gg-cli 1.0.4 → 1.0.6

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 (47) hide show
  1. package/dist/template/zhiguan/.editorconfig +16 -0
  2. package/dist/template/zhiguan/.env +1 -0
  3. package/dist/template/zhiguan/.env.development +4 -0
  4. package/dist/template/zhiguan/.env.production +4 -0
  5. package/dist/template/zhiguan/.env.test +4 -0
  6. package/dist/template/zhiguan/.prettierignore +34 -0
  7. package/dist/template/zhiguan/.prettierrc +14 -0
  8. package/dist/template/zhiguan/README.md +183 -0
  9. package/dist/template/zhiguan/docs/Git/345/274/200/345/217/221/350/247/204/350/214/203.md +105 -0
  10. package/dist/template/zhiguan/docs/React/345/274/200/345/217/221/350/247/204/350/214/203.md +81 -0
  11. package/dist/template/zhiguan/docs/TypeScript/345/274/200/345/217/221/350/247/204/350/214/203.md +119 -0
  12. package/dist/template/zhiguan/docs//345/211/215/347/253/257/346/227/245/345/277/227/344/270/216/347/233/221/346/216/247/345/237/213/347/202/271/350/247/204/350/214/203.md +136 -0
  13. package/dist/template/zhiguan/docs//345/215/225/345/205/203/346/265/213/350/257/225/350/247/204/350/214/203.md +131 -0
  14. package/dist/template/zhiguan/docs//351/241/271/347/233/256/347/233/256/345/275/225/347/273/223/346/236/204/350/247/204/350/214/203.md +93 -0
  15. package/dist/template/zhiguan/eslint.config.js +27 -0
  16. package/dist/template/zhiguan/index.html +13 -0
  17. package/dist/template/zhiguan/package.json +60 -0
  18. package/dist/template/zhiguan/public/favicon.svg +1 -0
  19. package/dist/template/zhiguan/public/icons.svg +24 -0
  20. package/dist/template/zhiguan/src/api/user.ts +21 -0
  21. package/dist/template/zhiguan/src/assets/Frame 20.png +0 -0
  22. package/dist/template/zhiguan/src/assets/react.svg +1 -0
  23. package/dist/template/zhiguan/src/components/Chart/index.tsx +22 -0
  24. package/dist/template/zhiguan/src/components/ErrorBoundary/index.tsx +82 -0
  25. package/dist/template/zhiguan/src/layouts/BasicLayout.tsx +174 -0
  26. package/dist/template/zhiguan/src/main.tsx +38 -0
  27. package/dist/template/zhiguan/src/pages/404.test.tsx +20 -0
  28. package/dist/template/zhiguan/src/pages/404.tsx +32 -0
  29. package/dist/template/zhiguan/src/pages/about/index.tsx +8 -0
  30. package/dist/template/zhiguan/src/pages/calendar/index.tsx +8 -0
  31. package/dist/template/zhiguan/src/pages/dashboard/index.tsx +72 -0
  32. package/dist/template/zhiguan/src/pages/home/index.less +59 -0
  33. package/dist/template/zhiguan/src/pages/home/index.tsx +217 -0
  34. package/dist/template/zhiguan/src/pages/settings/index.tsx +8 -0
  35. package/dist/template/zhiguan/src/pages/workspace/index.tsx +8 -0
  36. package/dist/template/zhiguan/src/router/index.tsx +81 -0
  37. package/dist/template/zhiguan/src/setupTests.ts +1 -0
  38. package/dist/template/zhiguan/src/store/useCounterStore.ts +24 -0
  39. package/dist/template/zhiguan/src/style.less +3 -0
  40. package/dist/template/zhiguan/src/utils/request/index.ts +108 -0
  41. package/dist/template/zhiguan/src/vite-env.d.ts +12 -0
  42. package/dist/template/zhiguan/tsconfig.app.json +34 -0
  43. package/dist/template/zhiguan/tsconfig.json +7 -0
  44. package/dist/template/zhiguan/tsconfig.node.json +26 -0
  45. package/dist/template/zhiguan/vite.config.ts +77 -0
  46. package/package.json +1 -1
  47. package/dist/template/operations-tem/package-lock.json +0 -6413
@@ -0,0 +1,16 @@
1
+ # EditorConfig is awesome: https://EditorConfig.org
2
+
3
+ # top-most EditorConfig file
4
+ root = true
5
+
6
+ # Unix-style newlines with a newline ending every file
7
+ [*]
8
+ end_of_line = lf
9
+ insert_final_newline = true
10
+ charset = utf-8
11
+ trim_trailing_whitespace = true
12
+ indent_style = space
13
+ indent_size = 2
14
+
15
+ [*.md]
16
+ trim_trailing_whitespace = false
@@ -0,0 +1 @@
1
+ VITE_API_BASE_URL=/api
@@ -0,0 +1,4 @@
1
+ # 开发环境配置
2
+ VITE_ENV=development
3
+ VITE_API_BASE_URL=/api
4
+ VITE_APP_TITLE=Operations Template (Dev)
@@ -0,0 +1,4 @@
1
+ # 生产环境配置
2
+ VITE_ENV=production
3
+ VITE_API_BASE_URL=https://api.example.com
4
+ VITE_APP_TITLE=Operations Template
@@ -0,0 +1,4 @@
1
+ # 测试环境配置
2
+ VITE_ENV=test
3
+ VITE_API_BASE_URL=https://test-api.example.com
4
+ VITE_APP_TITLE=Operations Template (Test)
@@ -0,0 +1,34 @@
1
+ # 忽略格式化的目录和文件
2
+ node_modules
3
+ dist
4
+ build
5
+ coverage
6
+
7
+ # 忽略特定类型的文件
8
+ *.png
9
+ *.jpg
10
+ *.jpeg
11
+ *.gif
12
+ *.svg
13
+ *.ico
14
+ *.eot
15
+ *.ttf
16
+ *.woff
17
+ *.woff2
18
+ *.mp4
19
+ *.webm
20
+ *.ogg
21
+ *.mp3
22
+ *.wav
23
+ *.flac
24
+ *.aac
25
+
26
+ # 忽略锁定文件
27
+ package-lock.json
28
+ yarn.lock
29
+ pnpm-lock.yaml
30
+
31
+ # 其他忽略
32
+ .DS_Store
33
+ .idea
34
+ .vscode
@@ -0,0 +1,14 @@
1
+ {
2
+ "printWidth": 100,
3
+ "tabWidth": 2,
4
+ "useTabs": false,
5
+ "semi": true,
6
+ "singleQuote": true,
7
+ "quoteProps": "as-needed",
8
+ "jsxSingleQuote": false,
9
+ "trailingComma": "all",
10
+ "bracketSpacing": true,
11
+ "bracketSameLine": false,
12
+ "arrowParens": "always",
13
+ "endOfLine": "lf"
14
+ }
@@ -0,0 +1,183 @@
1
+ # Operations Template (运营后台模版)
2
+
3
+ 基于 React 19 + TypeScript + Vite 8 + Ant Design 6 的现代化后台管理系统模版。
4
+ 本模版专为快速构建企业级中后台应用而设计,集成了最佳实践的工程化配置、清晰的架构分层和美观的 UI 设计。
5
+
6
+ ## ✨ 特性与架构
7
+
8
+ - **最新技术栈**: 采用 React 19、Vite 8、TypeScript 5 等前沿技术。
9
+ - **UI 设计**: 集成 Ant Design 6,配合 Less 预处理器,深度还原企业级设计规范。
10
+ - **状态管理**: 使用 Zustand 5 进行轻量级全局状态管理,告别繁琐的 Redux 样板代码。
11
+ - **路由管理**: 基于 React Router 7.x 的 Data API 路由模式,支持更细粒度的路由控制。
12
+ - **网络请求**: 封装 Axios 1.x,统一处理拦截器、错误码和 TypeScript 类型定义。
13
+ - **工程化与规范**: 配置 ESLint 9 (逻辑检查) 与 Prettier (代码格式化),并集成 EditorConfig 统一跨编辑器基础风格。
14
+ - **多环境支持**: 完善的 `.env` 环境隔离机制,清晰区分开发 (dev)、测试 (test) 和生产 (prod) 环境。
15
+ - **生产构建优化**: 内置产物分类、第三方依赖 (Vendor) 手动分包策略、自动剔除 Console 等生产级优化。
16
+
17
+ ## 📦 目录结构
18
+
19
+ ```bash
20
+ src/
21
+ ├── api/ # API 接口定义层
22
+ │ └── user.ts # 用户相关接口示例
23
+ ├── assets/ # 静态资源文件 (图片、图标等)
24
+ ├── components/ # 公共组件库
25
+ │ └── Chart/ # ECharts 图表组件封装
26
+ ├── layouts/ # 布局组件
27
+ │ └── BasicLayout.tsx # 基础布局 (侧边栏 + 顶栏 + 内容区)
28
+ ├── pages/ # 页面组件 (路由视图)
29
+ │ ├── home/ # 首页 (包含欢迎语、搜索、快捷功能、任务列表)
30
+ │ ├── dashboard/ # 数据看板 (ECharts 示例)
31
+ │ └── about/ # 关于页面
32
+ ├── router/ # 路由配置
33
+ │ └── index.tsx # 路由表定义
34
+ ├── store/ # 全局状态管理 (Zustand)
35
+ │ └── useCounterStore.ts
36
+ ├── utils/ # 工具函数
37
+ │ └── request/ # Axios 二次封装
38
+ ├── main.tsx # 应用入口
39
+ ├── App.tsx # 根组件
40
+ └── vite-env.d.ts # Vite 环境变量类型声明
41
+ ```
42
+
43
+ ## 🚀 快速上手
44
+
45
+ ### 1. 环境准备
46
+
47
+ 确保您的本地环境已安装 Node.js (推荐 v18+)。
48
+
49
+ ### 2. 安装依赖
50
+
51
+ ```bash
52
+ npm install
53
+ # 或者
54
+ yarn
55
+ # 或者
56
+ pnpm install
57
+ ```
58
+
59
+ ### 3. 启动开发服务器
60
+
61
+ ```bash
62
+ npm run dev
63
+ ```
64
+
65
+ 浏览器访问 `http://localhost:5173` 即可看到效果。
66
+
67
+ ### 3. 构建生产环境
68
+
69
+ ```bash
70
+ # 构建测试环境
71
+ npm run build:test
72
+
73
+ # 构建生产环境
74
+ npm run build:prod
75
+ # 或
76
+ npm run build
77
+ ```
78
+
79
+ ## 🛠 开发与构建指南
80
+
81
+ ### 1. 环境变量配置
82
+
83
+ 项目根目录包含三个环境配置文件,利用 Vite 的 `import.meta.env` 进行读取,且内置了完整的 TypeScript 类型提示:
84
+ - `.env.development`:本地开发环境 (运行 `npm run dev` 时加载)
85
+ - `.env.test`:测试环境 (运行 `npm run build:test` 时加载)
86
+ - `.env.production`:生产环境 (运行 `npm run build:prod` 时加载)
87
+
88
+ > 💡 **注意**:在代码中可以通过 `import.meta.env.VITE_XXX` 访问环境变量。为了安全,所有暴露给前端的自定义环境变量必须以 `VITE_` 开头。
89
+
90
+ ### 2. 代码检查与格式化
91
+
92
+ ```bash
93
+ # 运行 ESLint 逻辑检查
94
+ npm run lint
95
+
96
+ # 运行 Prettier 格式化代码 (将会自动格式化 src 目录下的文件)
97
+ npm run format
98
+ ```
99
+
100
+ ### 3. 生产环境构建与优化
101
+
102
+ 本项目针对生产环境 (`build:prod`) 做了深度优化,确保上线的资源体积最小、加载最快:
103
+ - **静态资源 Hash 分类**:JS、CSS、图片等资源分别打包到不同的文件夹,并打上 Hash 戳,完美配合服务器的强缓存策略。
104
+ - **手动分包 (Manual Chunks)**:将体积巨大且变动极少的第三方依赖(如 `react` 核心库、`antd` 组件库、`echarts` 图表库)单独拆分。这样即便你修改了业务代码,用户依然能命中第三方库的浏览器缓存。
105
+ - **代码净化**:自动剔除代码中的 `console` 和 `debugger` 语句,提升性能并保护代码安全。
106
+
107
+ ### 4. 构建产物分析 (打包体积分析)
108
+
109
+ 如果你想了解每个包(Chunk)的体积大小,排查是否引入了臃肿的依赖,可以运行分析脚本:
110
+
111
+ ```bash
112
+ npm run analyze
113
+ ```
114
+ 该命令会自动执行生产环境构建,并在打包结束后,于浏览器中弹出一个 **交互式的可视化树状图** (`dist/stats.html`),让你对所有产物的原始大小和 Gzip 压缩大小一目了然。
115
+
116
+ ---
117
+
118
+ ## 💻 业务开发指南
119
+
120
+ ### 1. 新增页面
121
+
122
+ 1. 在 `src/pages` 下新建文件夹,例如 `src/pages/product`。
123
+ 2. 创建 `index.tsx` 并导出默认组件。
124
+ 3. 在 `src/router/index.tsx` 中配置路由规则。
125
+
126
+ ### 2. 样式开发
127
+
128
+ 项目支持 **Less** 预处理器。
129
+ - **全局样式**: 修改 `src/index.css` 或配置 `src/main.tsx` 中的 Ant Design Token。
130
+ - **组件样式**: 推荐使用 `.less` 文件,并在组件中引入。
131
+ ```less
132
+ // src/pages/home/index.less
133
+ .home-page {
134
+ padding: 20px;
135
+ }
136
+ ```
137
+
138
+ ### 3. 网络请求
139
+
140
+ 使用 `src/utils/request` 中导出的 `request` 实例。
141
+
142
+ ```typescript
143
+ import { request } from '@/utils/request';
144
+
145
+ // 定义响应类型
146
+ interface UserInfo {
147
+ id: number;
148
+ name: string;
149
+ }
150
+
151
+ // 发起请求
152
+ const getUser = () => {
153
+ return request.get<UserInfo>('/api/user/1');
154
+ };
155
+ ```
156
+
157
+ ### 4. 状态管理 (Zustand)
158
+
159
+ ```typescript
160
+ import { create } from 'zustand';
161
+
162
+ interface UserState {
163
+ name: string;
164
+ setName: (name: string) => void;
165
+ }
166
+
167
+ export const useUserStore = create<UserState>((set) => ({
168
+ name: 'Guest',
169
+ setName: (name) => set({ name }),
170
+ }));
171
+
172
+ // 在组件中使用
173
+ const { name, setName } = useUserStore();
174
+ ```
175
+
176
+ ## 🎨 设计规范
177
+
178
+ - **主色调**: `#4F46E5` (Indigo)
179
+ - **圆角**: 全局组件圆角 `8px`,卡片圆角 `12px`
180
+ - **布局**: 左侧固定侧边栏 (`240px`) + 顶部通栏
181
+ - **图标**: 使用 `@ant-design/icons`
182
+
183
+ ---
@@ -0,0 +1,105 @@
1
+ # Git 开发规范
2
+
3
+ 为了保证团队协作的高效性、代码历史的可追溯性以及发布流程的稳定性,特制定本 Git 开发规范。团队成员需严格遵守本规范进行代码的分支管理和提交。
4
+
5
+ ## 1. 分支管理模型
6
+
7
+ 我们采用基于 Git Flow 思想的轻量级分支管理模型。
8
+
9
+ ### 1.1 长期分支
10
+ - **`main` (或 `master`)**: 主分支。
11
+ - 只能包含稳定、已发布或即将发布到生产环境的代码。
12
+ - **严禁直接在 `main` 分支上进行开发提交**。
13
+ - 所有合并到 `main` 的代码必须经过 Code Review 和充分测试。
14
+ - **`develop`**: 开发主分支。
15
+ - 包含下一个版本将要发布的所有最新代码。
16
+ - 从 `main` 分支拉取,功能分支合并回此分支。
17
+ - 部署到**开发/测试环境**的基础分支。
18
+
19
+ ### 1.2 临时分支
20
+ 临时分支用完即删,保持分支列表整洁。
21
+
22
+ - **`feature/*` (功能分支)**:
23
+ - 命名规范:`feature/功能名称` 或 `feature/需求ID-功能名称` (如:`feature/login-page`, `feature/JIRA-123-user-profile`)。
24
+ - 从 `develop` 分支拉取。
25
+ - 开发完成后合并回 `develop` 分支。
26
+ - **`bugfix/*` (缺陷修复分支)**:
27
+ - 命名规范:`bugfix/问题描述` 或 `bugfix/缺陷ID-问题描述` (如:`bugfix/login-crash`, `bugfix/JIRA-456-table-render-error`)。
28
+ - 用于修复日常测试中发现的非紧急 Bug。
29
+ - 从 `develop` 分支拉取,修复后合并回 `develop`。
30
+ - **`hotfix/*` (线上紧急修复分支)**:
31
+ - 命名规范:`hotfix/问题描述` 或 `hotfix/缺陷ID` (如:`hotfix/payment-failure`)。
32
+ - **仅用于修复生产环境的严重 Bug**。
33
+ - 必须从 `main` 分支拉取!
34
+ - 修复测试通过后,**必须同时合并回 `main` 和 `develop` 分支**,并在 `main` 上打上新版本 Tag。
35
+
36
+ ## 2. Commit 提交规范
37
+
38
+ 我们遵循 [Angular Commit 规范](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines),使用标准化的格式来记录每一次提交,以便自动生成 Changelog 并快速定位问题。
39
+
40
+ ### 2.1 Commit Message 格式
41
+ ```text
42
+ <type>(<scope>): <subject>
43
+ // 空一行
44
+ <body>
45
+ // 空一行
46
+ <footer>
47
+ ```
48
+
49
+ ### 2.2 Type (必填)
50
+ 说明本次提交的类型,只允许使用以下标识:
51
+ - `feat`: 新增功能 (Feature)
52
+ - `fix`: 修复 Bug
53
+ - `docs`: 仅修改文档 (Documentation)
54
+ - `style`: 仅仅修改了空格、格式缩进、逗号等等,不改变代码逻辑 (不涉及逻辑的格式修改)
55
+ - `refactor`: 代码重构,没有加新功能或者修复 bug
56
+ - `perf`: 优化相关,比如提升性能、体验
57
+ - `test`: 增加测试,包括单元测试、集成测试等
58
+ - `build`: 影响构建系统或外部依赖的更改(如:webpack, npm)
59
+ - `ci`: 对 CI 配置文件和脚本的更改
60
+ - `chore`: 构建过程或辅助工具的变动
61
+ - `revert`: 回滚到上一个版本
62
+
63
+ ### 2.3 Scope (选填)
64
+ 用于说明本次 Commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。例如在前端项目中,可以是具体的页面或组件名:`auth`, `table-component`, `router` 等。
65
+
66
+ ### 2.4 Subject (必填)
67
+ 本次提交的简短描述,不超过 50 个字符。
68
+ - 以动词开头,使用第一人称现在时,比如 `change`,而不是 `changed` 或 `changes`。
69
+ - 首字母小写。
70
+ - 结尾不加句号 (`.`)。
71
+
72
+ ### 2.5 Body (选填)
73
+ 对本次提交的详细描述,可以分成多行。说明代码变更的动机,以及与之前行为的对比。
74
+
75
+ ### 2.6 Footer (选填)
76
+ - **不兼容变动 (Breaking Changes)**:如果当前代码与上一个版本不兼容,则 Footer 部分以 `BREAKING CHANGE:` 开头,后面是对变动的描述、以及变动理由和迁移方法。
77
+ - **关闭 Issue/缺陷**:如果当前 commit 针对某个 issue/需求,那么可以在 Footer 部分关闭这个 issue。如:`Closes #123`, `Fixes JIRA-456`。
78
+
79
+ ### 2.7 Commit 示例
80
+ ```text
81
+ feat(user): 新增用户登录页面的记住密码功能
82
+
83
+ 增加了本地 storage 的存储逻辑,在用户勾选记住密码时,加密保存 token。
84
+
85
+ Closes #89
86
+ ```
87
+
88
+ ```text
89
+ fix(table): 修复数据为空时分页器仍然显示的问题
90
+ ```
91
+
92
+ ## 3. 工作流与 Code Review 规范
93
+
94
+ 1. **同步最新代码**:每天开发前,或在拉取新分支前,务必先 `git pull --rebase origin develop`,确保基于最新代码开发。
95
+ 2. **小步提交**:鼓励频繁提交本地代码(遵循 Commit 规范),避免将几天的巨大工作量堆积在一次 Commit 中。
96
+ 3. **合并前 Rebase**:在将功能分支合并回 `develop` 之前,如果 `develop` 已经有了新的提交,建议在自己的分支上先执行 `git rebase develop`,解决冲突后再发起 Merge Request / Pull Request。这有助于保持线性的提交历史。
97
+ 4. **Code Review (CR)**:
98
+ - 合并代码到 `develop` 或 `main` 必须通过发起 PR/MR 的方式,**禁止直接 Push**。
99
+ - 至少需要一位其他开发人员 Review 通过 (Approve) 后才能合并。
100
+ - CR 重点关注:代码是否符合规范、是否有潜在 Bug、性能是否达标、是否包含敏感信息(如明文密码、密钥)。
101
+
102
+ ## 4. 辅助工具推荐
103
+ 强烈建议在项目中集成以下工具以保证规范的落地:
104
+ - **`husky` + `lint-staged`**:在提交前自动进行 ESLint / Prettier 检查。
105
+ - **`commitlint` + `commitizen`**:在 `git commit` 时强制校验 Commit Message 是否符合规范。
@@ -0,0 +1,81 @@
1
+ # React 开发规范
2
+
3
+ 本文档规定了团队内 React 项目的开发规范和最佳实践,旨在提高代码的可读性、可维护性和团队协作效率。
4
+
5
+ ## 1. 组件开发规范
6
+
7
+ ### 1.1 组件定义
8
+ - **统一使用函数组件 (Function Component)**:放弃 Class 组件,全面拥抱 React Hooks。
9
+ - **使用 `React.FC` 定义类型**:结合 TypeScript,明确组件类型。
10
+ - **使用 `Props`**:不直接在函数参数处解构 props,而是通过解构赋值在函数内部获取 props。
11
+
12
+ ```tsx
13
+ // ✅ 推荐做法
14
+ import React from 'react';
15
+
16
+ interface UserCardProps {
17
+ name: string;
18
+ age?: number;
19
+ }
20
+
21
+ export const UserCard: React.FC<UserCardProps> = (props) => {
22
+ const { name, age = 18 } = props;
23
+
24
+ return (
25
+ <div>
26
+ <p>Name: {name}</p>
27
+ <p>Age: {age}</p>
28
+ </div>
29
+ );
30
+ };
31
+ ```
32
+
33
+ ### 1.2 命名规范
34
+ - **组件文件命名**:使用 **PascalCase (大驼峰)** 命名(如 `UserProfile.tsx`)。如果组件是一个目录,使用 **pascal-case(kebab-case)**,入口文件使用 `index.tsx`。
35
+ - **组件内部变量/函数命名**:使用 **camelCase (小驼峰)** 命名。
36
+ - **事件处理函数命名**:
37
+ - 传递给组件的 props 命名为 `onXxx`(如 `onClick`)。
38
+ - 组件内部的处理函数命名为 `handleXxx`(如 `handleClick`)。
39
+
40
+ ### 1.3 组件结构与拆分
41
+ - **单一职责原则**:一个组件只做一件事情。如果组件逻辑变得复杂,应拆分为更小的子组件。
42
+ - **UI 与逻辑分离**:尽量保持 UI 组件 (Presentational Component) 的纯粹性,将复杂的业务逻辑、数据获取抽离到自定义 Hook 或容器组件 (Container Component) 中。
43
+
44
+ ## 2. Hooks 使用规范
45
+
46
+ ### 2.1 基础 Hooks
47
+ - **`useState`**:用于管理组件内部的简单状态。对于复杂状态,考虑使用 `useReducer` 或全局状态管理库 (如 Zustand)。
48
+ - **`useEffect`**:
49
+ - 必须明确声明依赖数组 (Dependency Array)。
50
+ - 避免在 `useEffect` 中执行过多不相关的逻辑,按功能拆分为多个 `useEffect`。
51
+ - 注意清理副作用 (如定时器、事件监听器)。
52
+
53
+ ### 2.2 性能优化 Hooks
54
+ - **谨慎使用 `useMemo` 和 `useCallback`**:仅在遇到真正的性能瓶颈或需要传递稳定的引用给子组件时使用。过度使用会增加内存开销。
55
+ - 由于项目引入了 React Compiler (React 19),编译器会自动进行大部分的 Memoization 优化,手动使用这些 Hook 的场景将大幅减少。
56
+
57
+ ### 2.3 自定义 Hooks
58
+ - **命名规范**:必须以 `use` 开头(如 `useFetchUser`)。
59
+ - **返回值**:通常返回一个数组 `[value, setValue]` 或一个对象 `{ data, loading, error }`,根据实际场景决定。
60
+
61
+ ## 3. 状态管理规范
62
+
63
+ - **局部状态**:优先使用组件内部的 `useState` 或 `useReducer`。
64
+ - **全局状态**:使用 Zustand 5 进行轻量级的全局状态管理。
65
+ - 按业务模块划分 Store (如 `useUserStore`, `useAppStore`)。
66
+ - 避免将所有状态都放入全局 Store,只共享真正需要跨组件通信的状态。
67
+
68
+ ## 4. 样式开发规范
69
+
70
+ - **预处理器**:统一使用 Less。
71
+ - **样式隔离**:
72
+ - 优先使用 CSS Modules (命名为 `xxx.module.less`),避免全局样式污染。
73
+ - 配合 classnames 库进行类名的条件拼接。
74
+ - **命名约定**:Less 文件中的类名使用 **kebab-case (短横线命名法)**,如 `.user-profile-container`。
75
+
76
+ ## 5. 代码质量与格式化
77
+
78
+ - 必须遵守项目配置的 ESLint 和 Prettier 规则。
79
+ - 在提交代码前,确保没有 ESLint 警告或错误。
80
+ - 避免使用 `any`,尽可能提供准确的 TypeScript 类型定义。
81
+ - 不要保留未使用的变量或导入 (`no-unused-vars`)。
@@ -0,0 +1,119 @@
1
+ # TypeScript 开发规范
2
+
3
+ 本文档旨在统一团队内 TypeScript 的使用方式,提升代码的健壮性和可维护性,减少运行时错误。
4
+
5
+ ## 1. 基础规范
6
+
7
+ ### 1.1 命名规范
8
+ - **接口 (Interface) 和 类型别名 (Type Alias)**:
9
+ - 使用 **PascalCase (大驼峰)** 命名。
10
+ - 不要使用 `I` 或 `T` 作为前缀(如 `interface IUser` ❌,应为 `interface User` ✅)。
11
+ - **枚举 (Enum)**:
12
+ - 使用 **PascalCase** 命名枚举及其成员。
13
+ - 推荐使用字符串枚举以提高调试时的可读性。
14
+
15
+ ```typescript
16
+ // ✅ 推荐做法
17
+ enum UserRole {
18
+ Admin = 'ADMIN',
19
+ Editor = 'EDITOR',
20
+ Viewer = 'VIEWER',
21
+ }
22
+ ```
23
+
24
+ ### 1.2 `interface` vs `type`
25
+ - **优先使用 `interface`**:在定义对象或组件 Props 的形状时,默认使用 `interface`。
26
+ - **使用 `type` 的场景**:当需要使用联合类型 (Union Types)、交叉类型 (Intersection Types) 或映射类型 (Mapped Types) 等高级特性时,才使用 `type`。
27
+
28
+ ```typescript
29
+ // ✅ 推荐做法
30
+ interface User {
31
+ id: string;
32
+ name: string;
33
+ }
34
+
35
+ type ID = string | number; // 联合类型必须用 type
36
+ ```
37
+
38
+ ## 2. 组件与 Props 规范
39
+
40
+ ### 2.1 Props 定义
41
+ - **必须为每个组件定义 Props 接口**:命名约定为 `[ComponentName]Props`。
42
+ - **明确可选属性**:使用 `?` 标记可选属性,并为其提供合理的默认值。
43
+ - **避免内联类型定义**:不要在函数签名中直接写出庞大的类型对象。
44
+
45
+ ```tsx
46
+ // ✅ 推荐做法
47
+ interface ButtonProps {
48
+ label: string;
49
+ onClick: () => void;
50
+ disabled?: boolean; // 明确可选
51
+ }
52
+
53
+ export const Button: React.FC<ButtonProps> = (props) => {
54
+ const { label, onClick, disabled = false } = props;
55
+ // ...
56
+ };
57
+ ```
58
+
59
+ ### 2.2 事件处理类型
60
+ - 优先使用 React 内置的事件类型(如 `React.MouseEvent<HTMLButtonElement>`、`React.ChangeEvent<HTMLInputElement>`),避免使用 `any`。
61
+
62
+ ```tsx
63
+ // ✅ 推荐做法
64
+ const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
65
+ console.log(e.target.value);
66
+ };
67
+ ```
68
+
69
+ ## 3. 函数与变量规范
70
+
71
+ ### 3.1 函数返回类型
72
+ - **推荐显式声明函数的返回类型**:虽然 TS 具有强大的类型推导能力,但在定义公共函数、API 接口函数或复杂业务逻辑时,显式声明返回类型有助于提早发现错误并提高代码可读性。
73
+
74
+ ```typescript
75
+ // ✅ 推荐做法
76
+ function calculateTotal(price: number, quantity: number): number {
77
+ return price * quantity;
78
+ }
79
+ ```
80
+
81
+ ### 3.2 变量类型推导
82
+ - **让 TS 自动推导简单类型**:对于初始化时就明确赋值的简单变量,不要显式声明类型。
83
+
84
+ ```typescript
85
+ // ❌ 不推荐
86
+ const age: number = 25;
87
+ const name: string = 'Alice';
88
+
89
+ // ✅ 推荐做法 (自动推导)
90
+ const age = 25;
91
+ const name = 'Alice';
92
+ ```
93
+
94
+ ## 4. 高级类型与断言
95
+
96
+ ### 4.1 类型断言
97
+ - **尽量避免使用类型断言 (`as Type` 或 `<Type>`)**。
98
+ - 如果必须使用,说明 TS 编译器无法推断出正确的类型。请先考虑是否可以通过更好的类型定义或类型守卫来解决。
99
+
100
+ ### 4.2 工具类型 (Utility Types)
101
+ - 熟练掌握并使用 TS 内置的工具类型,如 `Partial<T>`, `Required<T>`, `Readonly<T>`, `Pick<T, K>`, `Omit<T, K>`。
102
+ - 这有助于减少重复代码,保持类型定义的 DRY 原则。
103
+
104
+ ```typescript
105
+ // ✅ 推荐做法
106
+ interface User {
107
+ id: string;
108
+ name: string;
109
+ email: string;
110
+ }
111
+
112
+ // 只更新部分用户信息
113
+ type UpdateUserDto = Partial<Omit<User, 'id'>>;
114
+ ```
115
+
116
+ ## 5. API 请求类型规范
117
+
118
+ - **统一的响应体接口**:在封装请求库时,定义统一的响应体泛型接口 (如 `ApiResponse<T>`)。
119
+ - **为所有 API 接口定义请求和返回类型**:在 `src/api/` 目录下,每个接口必须明确入参和出参的类型。