dev-standard-cli 1.0.0
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/LICENSE +21 -0
- package/README.md +498 -0
- package/bin/cli.js +3 -0
- package/dist/http/HttpClient.d.ts +86 -0
- package/dist/http/HttpClient.d.ts.map +1 -0
- package/dist/http/HttpClient.js +247 -0
- package/dist/http/HttpClient.js.map +1 -0
- package/dist/http/index.d.ts +2 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +7 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/init/Initializer.d.ts +49 -0
- package/dist/init/Initializer.d.ts.map +1 -0
- package/dist/init/Initializer.js +288 -0
- package/dist/init/Initializer.js.map +1 -0
- package/dist/init/index.d.ts +2 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +7 -0
- package/dist/init/index.js.map +1 -0
- package/package.json +55 -0
- package/templates/.eslintrc.js +31 -0
- package/templates/.lintstagedrc.json +9 -0
- package/templates/.prettierrc.js +11 -0
- package/templates/commitlint.config.js +27 -0
- package/templates/husky/commit-msg +4 -0
- package/templates/husky/pre-commit +4 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fireworks
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
# @fireworks/dev-standard-cli
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@fireworks/dev-standard-cli)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
> 企业级前端研发标准化脚手架 - 10 秒完成项目环境准备,实现代码质量闭环
|
|
7
|
+
|
|
8
|
+
## ✨ 核心特性
|
|
9
|
+
|
|
10
|
+
### 🔧 研发标准化流水线
|
|
11
|
+
- **物理拦截机制**:集成 Husky + Commitlint + ESLint + Prettier,在 Git 提交阶段强制代码质量检查
|
|
12
|
+
- **零配置启动**:开箱即用的代码规范配置,无需手动调整
|
|
13
|
+
- **团队协作保障**:统一代码风格,消除 "在我电脑上能跑" 问题
|
|
14
|
+
|
|
15
|
+
### 🌐 高可用网络层
|
|
16
|
+
- **指数退避重试**:智能重试算法,弱网环境下接口成功率 > 95%
|
|
17
|
+
- **熔断保护**:自动识别故障服务,防止雪崩效应
|
|
18
|
+
- **全局拦截器**:统一处理认证、日志、错误等横切关注点
|
|
19
|
+
|
|
20
|
+
### ⚡ 自动化初始化
|
|
21
|
+
- **一键交付**:通过 execa 实现项目初始化自动化
|
|
22
|
+
- **10 秒启动**:自动完成 Git 初始化、依赖安装、Husky 钩子配置
|
|
23
|
+
- **智能检测**:自动识别 pnpm/yarn/npm 包管理器
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 📦 安装
|
|
28
|
+
|
|
29
|
+
### 全局安装(推荐)
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install -g @fireworks/dev-standard-cli
|
|
33
|
+
# 或
|
|
34
|
+
pnpm add -g @fireworks/dev-standard-cli
|
|
35
|
+
# 或
|
|
36
|
+
yarn global add @fireworks/dev-standard-cli
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 临时使用
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npx @fireworks/dev-standard-cli init my-project
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 🚀 快速开始
|
|
48
|
+
|
|
49
|
+
### 1. 初始化项目
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# 交互式创建
|
|
53
|
+
dev-standard init
|
|
54
|
+
|
|
55
|
+
# 直接指定项目名
|
|
56
|
+
dev-standard init my-awesome-project
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**执行流程(10 秒内完成):**
|
|
60
|
+
1. ✅ 创建项目目录
|
|
61
|
+
2. ✅ 初始化 Git 仓库
|
|
62
|
+
3. ✅ 复制配置文件(ESLint、Prettier、Commitlint)
|
|
63
|
+
4. ✅ 生成 package.json
|
|
64
|
+
5. ✅ 自动安装依赖
|
|
65
|
+
6. ✅ 配置 Husky Git 钩子
|
|
66
|
+
|
|
67
|
+
### 2. 开始开发
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cd my-awesome-project
|
|
71
|
+
|
|
72
|
+
# 运行代码检查
|
|
73
|
+
npm run lint
|
|
74
|
+
|
|
75
|
+
# 自动修复问题
|
|
76
|
+
npm run lint:fix
|
|
77
|
+
|
|
78
|
+
# 格式化代码
|
|
79
|
+
npm run format
|
|
80
|
+
|
|
81
|
+
# 提交代码(会自动触发检查)
|
|
82
|
+
git add .
|
|
83
|
+
git commit -m "feat: 添加用户登录功能"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 📖 命令行工具
|
|
89
|
+
|
|
90
|
+
### `dev-standard init [project-name]`
|
|
91
|
+
初始化一个标准化项目
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
dev-standard init my-project
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### `dev-standard test-http`
|
|
98
|
+
测试网络层功能(重试机制、熔断器)
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# 使用默认 URL 测试
|
|
102
|
+
dev-standard test-http
|
|
103
|
+
|
|
104
|
+
# 指定 URL 测试
|
|
105
|
+
dev-standard test-http -u https://api.example.com/data
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### `dev-standard info`
|
|
109
|
+
显示工具链配置信息
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
dev-standard info
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 🔨 集成的工具链
|
|
118
|
+
|
|
119
|
+
| 工具 | 版本 | 作用 |
|
|
120
|
+
|------|------|------|
|
|
121
|
+
| **Husky** | ^8.0.3 | Git 钩子管理,在提交时自动执行检查 |
|
|
122
|
+
| **Commitlint** | ^17.8.1 | 强制 Commit 信息规范 |
|
|
123
|
+
| **ESLint** | ^8.57.0 | JavaScript/TypeScript 代码质量检查 |
|
|
124
|
+
| **Prettier** | ^3.2.5 | 代码格式化工具 |
|
|
125
|
+
| **Lint-staged** | ^15.2.2 | 只检查暂存区文件,提升速度 |
|
|
126
|
+
| **TypeScript** | ^5.4.5 | 类型检查 |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 📝 Commit 规范
|
|
131
|
+
|
|
132
|
+
采用 [Conventional Commits](https://www.conventionalcommits.org/) 规范:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
<type>: <subject>
|
|
136
|
+
|
|
137
|
+
# 示例
|
|
138
|
+
feat: 添加用户登录功能
|
|
139
|
+
fix: 修复登录页面样式错误
|
|
140
|
+
docs: 更新 API 文档
|
|
141
|
+
style: 格式化代码
|
|
142
|
+
refactor: 重构用户模块
|
|
143
|
+
perf: 优化列表渲染性能
|
|
144
|
+
test: 添加单元测试
|
|
145
|
+
chore: 更新依赖包
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Type 类型说明
|
|
149
|
+
|
|
150
|
+
| Type | 说明 |
|
|
151
|
+
|------|------|
|
|
152
|
+
| `feat` | 新功能 |
|
|
153
|
+
| `fix` | 修复 bug |
|
|
154
|
+
| `docs` | 文档变更 |
|
|
155
|
+
| `style` | 代码格式(不影响代码运行) |
|
|
156
|
+
| `refactor` | 重构(既不是新增功能,也不是修改 bug) |
|
|
157
|
+
| `perf` | 性能优化 |
|
|
158
|
+
| `test` | 增加测试 |
|
|
159
|
+
| `chore` | 构建过程或辅助工具的变动 |
|
|
160
|
+
| `revert` | 回退 |
|
|
161
|
+
| `build` | 打包 |
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 🌐 网络层使用指南
|
|
166
|
+
|
|
167
|
+
### 基础使用
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
import { HttpClient } from '@fireworks/dev-standard-cli/dist/http';
|
|
171
|
+
|
|
172
|
+
// 创建实例
|
|
173
|
+
const http = new HttpClient({
|
|
174
|
+
baseURL: 'https://api.example.com',
|
|
175
|
+
timeout: 10000,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// 发送请求
|
|
179
|
+
const data = await http.get('/users');
|
|
180
|
+
const result = await http.post('/login', { username, password });
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 高级配置
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
const http = new HttpClient({
|
|
187
|
+
baseURL: 'https://api.example.com',
|
|
188
|
+
timeout: 10000,
|
|
189
|
+
|
|
190
|
+
// 重试配置
|
|
191
|
+
retry: true, // 启用重试
|
|
192
|
+
retryCount: 3, // 最大重试次数
|
|
193
|
+
retryDelay: 1000, // 重试基础延迟(毫秒)
|
|
194
|
+
|
|
195
|
+
// 熔断器配置
|
|
196
|
+
circuitBreaker: true, // 启用熔断
|
|
197
|
+
failureThreshold: 5, // 失败阈值
|
|
198
|
+
recoveryTimeout: 60000, // 恢复时间(毫秒)
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 单个请求配置
|
|
203
|
+
|
|
204
|
+
```typescript
|
|
205
|
+
// 禁用某个请求的重试
|
|
206
|
+
await http.get('/critical-data', {
|
|
207
|
+
retry: false,
|
|
208
|
+
timeout: 5000,
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// 禁用熔断器
|
|
212
|
+
await http.post('/user', data, {
|
|
213
|
+
circuitBreaker: false,
|
|
214
|
+
});
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### 核心机制详解
|
|
218
|
+
|
|
219
|
+
#### 1️⃣ 指数退避重试算法
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
第 1 次失败:等待 1000ms + 随机抖动(0-1000ms)
|
|
223
|
+
第 2 次失败:等待 2000ms + 随机抖动(0-1000ms)
|
|
224
|
+
第 3 次失败:等待 4000ms + 随机抖动(0-1000ms)
|
|
225
|
+
最大延迟:30000ms
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**重试条件**:
|
|
229
|
+
- 网络错误(无响应)
|
|
230
|
+
- 5xx 服务器错误
|
|
231
|
+
- 408 请求超时
|
|
232
|
+
- 429 请求过多
|
|
233
|
+
|
|
234
|
+
#### 2️⃣ 熔断器模式
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
状态流转:
|
|
238
|
+
CLOSED(正常) → OPEN(熔断) → HALF_OPEN(尝试恢复) → CLOSED
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
**触发条件**:
|
|
242
|
+
- 连续失败 5 次(可配置)→ 进入 OPEN 状态
|
|
243
|
+
- OPEN 状态持续 60 秒(可配置)→ 进入 HALF_OPEN 状态
|
|
244
|
+
- HALF_OPEN 状态下请求成功 → 恢复 CLOSED 状态
|
|
245
|
+
|
|
246
|
+
#### 3️⃣ 全局拦截器
|
|
247
|
+
|
|
248
|
+
**请求拦截器**:
|
|
249
|
+
- GET 请求自动添加时间戳防缓存
|
|
250
|
+
- 自动注入 Authorization Token
|
|
251
|
+
- 请求日志记录
|
|
252
|
+
|
|
253
|
+
**响应拦截器**:
|
|
254
|
+
- 统一错误处理
|
|
255
|
+
- 自动重试逻辑
|
|
256
|
+
- 响应日志记录
|
|
257
|
+
|
|
258
|
+
### 获取熔断器状态
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
const state = http.getCircuitBreakerState();
|
|
262
|
+
console.log(state); // 'CLOSED' | 'OPEN' | 'HALF_OPEN'
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 📁 项目结构
|
|
268
|
+
|
|
269
|
+
初始化后的项目结构:
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
my-project/
|
|
273
|
+
├── .husky/ # Husky Git 钩子
|
|
274
|
+
│ ├── commit-msg # Commit 信息检查
|
|
275
|
+
│ └── pre-commit # 提交前代码检查
|
|
276
|
+
├── node_modules/
|
|
277
|
+
├── .eslintrc.js # ESLint 配置
|
|
278
|
+
├── .prettierrc.js # Prettier 配置
|
|
279
|
+
├── .lintstagedrc.json # Lint-staged 配置
|
|
280
|
+
├── commitlint.config.js # Commitlint 配置
|
|
281
|
+
├── .gitignore
|
|
282
|
+
├── package.json
|
|
283
|
+
└── README.md
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 🔧 配置文件说明
|
|
289
|
+
|
|
290
|
+
### ESLint 配置 (`.eslintrc.js`)
|
|
291
|
+
|
|
292
|
+
```javascript
|
|
293
|
+
module.exports = {
|
|
294
|
+
env: {
|
|
295
|
+
browser: true,
|
|
296
|
+
es2021: true,
|
|
297
|
+
node: true,
|
|
298
|
+
},
|
|
299
|
+
extends: [
|
|
300
|
+
'eslint:recommended',
|
|
301
|
+
'plugin:@typescript-eslint/recommended',
|
|
302
|
+
'plugin:prettier/recommended',
|
|
303
|
+
],
|
|
304
|
+
parser: '@typescript-eslint/parser',
|
|
305
|
+
plugins: ['@typescript-eslint', 'prettier'],
|
|
306
|
+
rules: {
|
|
307
|
+
'prettier/prettier': 'error',
|
|
308
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
309
|
+
// ... 更多规则
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Prettier 配置 (`.prettierrc.js`)
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
module.exports = {
|
|
318
|
+
semi: true,
|
|
319
|
+
singleQuote: true,
|
|
320
|
+
tabWidth: 2,
|
|
321
|
+
trailingComma: 'es5',
|
|
322
|
+
printWidth: 100,
|
|
323
|
+
arrowParens: 'always',
|
|
324
|
+
endOfLine: 'lf',
|
|
325
|
+
};
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Commitlint 配置 (`commitlint.config.js`)
|
|
329
|
+
|
|
330
|
+
```javascript
|
|
331
|
+
module.exports = {
|
|
332
|
+
extends: ['@commitlint/config-conventional'],
|
|
333
|
+
rules: {
|
|
334
|
+
'type-enum': [2, 'always', [
|
|
335
|
+
'feat', 'fix', 'docs', 'style', 'refactor',
|
|
336
|
+
'perf', 'test', 'chore', 'revert', 'build'
|
|
337
|
+
]],
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 💡 最佳实践
|
|
345
|
+
|
|
346
|
+
### 1. 提交代码前
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
# 运行检查
|
|
350
|
+
npm run lint
|
|
351
|
+
|
|
352
|
+
# 自动修复
|
|
353
|
+
npm run lint:fix
|
|
354
|
+
|
|
355
|
+
# 格式化代码
|
|
356
|
+
npm run format
|
|
357
|
+
|
|
358
|
+
# 提交
|
|
359
|
+
git add .
|
|
360
|
+
git commit -m "feat: 添加新功能"
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### 2. 网络层使用
|
|
364
|
+
|
|
365
|
+
```typescript
|
|
366
|
+
// ✅ 推荐:使用默认实例
|
|
367
|
+
import { http } from '@fireworks/dev-standard-cli/dist/http';
|
|
368
|
+
await http.get('/api/users');
|
|
369
|
+
|
|
370
|
+
// ✅ 推荐:创建自定义实例
|
|
371
|
+
const customHttp = new HttpClient({
|
|
372
|
+
baseURL: process.env.API_BASE_URL,
|
|
373
|
+
timeout: 15000,
|
|
374
|
+
retry: true,
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
// ❌ 避免:频繁创建实例
|
|
378
|
+
for (let i = 0; i < 100; i++) {
|
|
379
|
+
const http = new HttpClient(); // 浪费资源
|
|
380
|
+
await http.get('/api/data');
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### 3. 团队协作
|
|
385
|
+
|
|
386
|
+
1. **统一包管理器**:建议团队统一使用 pnpm 或 yarn
|
|
387
|
+
2. **锁定依赖版本**:提交 `package-lock.json` 或 `pnpm-lock.yaml`
|
|
388
|
+
3. **配置编辑器**:安装 ESLint 和 Prettier 插件,启用保存时自动修复
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## 🎯 性能指标
|
|
393
|
+
|
|
394
|
+
| 指标 | 说明 | 数据 |
|
|
395
|
+
|------|------|------|
|
|
396
|
+
| **初始化速度** | 完整项目初始化耗时 | < 10 秒 |
|
|
397
|
+
| **网络成功率** | 弱网环境下接口成功率 | > 95% |
|
|
398
|
+
| **代码检查** | 单次 Lint 检查速度 | < 3 秒 |
|
|
399
|
+
| **包体积** | 安装后占用空间 | ~50MB |
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## 🤝 贡献指南
|
|
404
|
+
|
|
405
|
+
欢迎提交 Issue 和 Pull Request!
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
# 克隆项目
|
|
409
|
+
git clone https://github.com/fireworks/dev-standard-cli.git
|
|
410
|
+
|
|
411
|
+
# 安装依赖
|
|
412
|
+
pnpm install
|
|
413
|
+
|
|
414
|
+
# 构建项目
|
|
415
|
+
npm run build
|
|
416
|
+
|
|
417
|
+
# 本地测试
|
|
418
|
+
npm link
|
|
419
|
+
dev-standard init test-project
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## 📄 License
|
|
425
|
+
|
|
426
|
+
MIT © [fireworks]
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## 🔗 相关链接
|
|
431
|
+
|
|
432
|
+
- [Conventional Commits](https://www.conventionalcommits.org/)
|
|
433
|
+
- [ESLint](https://eslint.org/)
|
|
434
|
+
- [Prettier](https://prettier.io/)
|
|
435
|
+
- [Husky](https://typicode.github.io/husky/)
|
|
436
|
+
- [Commitlint](https://commitlint.js.org/)
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## ❓ 常见问题
|
|
441
|
+
|
|
442
|
+
### Q1: 为什么提交时会卡住?
|
|
443
|
+
**A:** 首次提交时会安装 Husky 钩子,需要等待几秒。后续提交不会出现此问题。
|
|
444
|
+
|
|
445
|
+
### Q2: 如何跳过 Commit 检查?
|
|
446
|
+
**A:** 不推荐跳过检查,但紧急情况下可以使用:
|
|
447
|
+
```bash
|
|
448
|
+
git commit -m "feat: xxx" --no-verify
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Q3: 网络层如何处理 Token 过期?
|
|
452
|
+
**A:** 需要在响应拦截器中自定义处理:
|
|
453
|
+
```typescript
|
|
454
|
+
const http = new HttpClient();
|
|
455
|
+
const instance = http.getAxiosInstance();
|
|
456
|
+
|
|
457
|
+
instance.interceptors.response.use(
|
|
458
|
+
(response) => response,
|
|
459
|
+
async (error) => {
|
|
460
|
+
if (error.response?.status === 401) {
|
|
461
|
+
// 刷新 Token 逻辑
|
|
462
|
+
const newToken = await refreshToken();
|
|
463
|
+
localStorage.setItem('auth_token', newToken);
|
|
464
|
+
// 重新请求
|
|
465
|
+
return instance.request(error.config);
|
|
466
|
+
}
|
|
467
|
+
return Promise.reject(error);
|
|
468
|
+
}
|
|
469
|
+
);
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### Q4: 如何自定义配置?
|
|
473
|
+
**A:** 初始化后,可以直接修改项目中的配置文件:
|
|
474
|
+
- `.eslintrc.js` - ESLint 规则
|
|
475
|
+
- `.prettierrc.js` - Prettier 格式
|
|
476
|
+
- `commitlint.config.js` - Commit 规范
|
|
477
|
+
|
|
478
|
+
### Q5: 支持哪些项目类型?
|
|
479
|
+
**A:** 支持所有前端项目,包括:
|
|
480
|
+
- React / Vue / Angular
|
|
481
|
+
- Node.js 后端
|
|
482
|
+
- TypeScript 项目
|
|
483
|
+
- 纯 JavaScript 项目
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## 🎉 致谢
|
|
488
|
+
|
|
489
|
+
感谢以下开源项目:
|
|
490
|
+
- [Husky](https://github.com/typicode/husky)
|
|
491
|
+
- [ESLint](https://github.com/eslint/eslint)
|
|
492
|
+
- [Prettier](https://github.com/prettier/prettier)
|
|
493
|
+
- [Axios](https://github.com/axios/axios)
|
|
494
|
+
- [Execa](https://github.com/sindresorhus/execa)
|
|
495
|
+
- [Commander.js](https://github.com/tj/commander.js)
|
|
496
|
+
- [Inquirer.js](https://github.com/SBoudrias/Inquirer.js)
|
|
497
|
+
- [Ora](https://github.com/sindresorhus/ora)
|
|
498
|
+
- [Chalk](https://github.com/chalk/chalk)
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { AxiosInstance, AxiosRequestConfig } from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* 网络请求配置接口
|
|
4
|
+
*/
|
|
5
|
+
export interface RequestConfig extends AxiosRequestConfig {
|
|
6
|
+
/** 是否启用重试机制 */
|
|
7
|
+
retry?: boolean;
|
|
8
|
+
/** 最大重试次数 */
|
|
9
|
+
retryCount?: number;
|
|
10
|
+
/** 重试延迟基数(毫秒) */
|
|
11
|
+
retryDelay?: number;
|
|
12
|
+
/** 是否启用熔断 */
|
|
13
|
+
circuitBreaker?: boolean;
|
|
14
|
+
/** 熔断失败阈值 */
|
|
15
|
+
failureThreshold?: number;
|
|
16
|
+
/** 熔断恢复时间(毫秒) */
|
|
17
|
+
recoveryTimeout?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 高级 Axios 网络层封装
|
|
21
|
+
*/
|
|
22
|
+
export declare class HttpClient {
|
|
23
|
+
private instance;
|
|
24
|
+
private circuitBreaker;
|
|
25
|
+
private defaultConfig;
|
|
26
|
+
constructor(config?: RequestConfig);
|
|
27
|
+
/**
|
|
28
|
+
* 配置拦截器
|
|
29
|
+
*/
|
|
30
|
+
private setupInterceptors;
|
|
31
|
+
/**
|
|
32
|
+
* 处理响应错误
|
|
33
|
+
*/
|
|
34
|
+
private handleResponseError;
|
|
35
|
+
/**
|
|
36
|
+
* 判断错误是否可重试
|
|
37
|
+
*/
|
|
38
|
+
private isRetryableError;
|
|
39
|
+
/**
|
|
40
|
+
* 计算指数退避延迟
|
|
41
|
+
*/
|
|
42
|
+
private calculateRetryDelay;
|
|
43
|
+
/**
|
|
44
|
+
* 延迟函数
|
|
45
|
+
*/
|
|
46
|
+
private sleep;
|
|
47
|
+
/**
|
|
48
|
+
* 标准化错误信息
|
|
49
|
+
*/
|
|
50
|
+
private normalizeError;
|
|
51
|
+
/**
|
|
52
|
+
* 获取认证 token(示例方法,需根据实际情况实现)
|
|
53
|
+
*/
|
|
54
|
+
private getToken;
|
|
55
|
+
/**
|
|
56
|
+
* GET 请求
|
|
57
|
+
*/
|
|
58
|
+
get<T = any>(url: string, config?: RequestConfig): Promise<T>;
|
|
59
|
+
/**
|
|
60
|
+
* POST 请求
|
|
61
|
+
*/
|
|
62
|
+
post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<T>;
|
|
63
|
+
/**
|
|
64
|
+
* PUT 请求
|
|
65
|
+
*/
|
|
66
|
+
put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<T>;
|
|
67
|
+
/**
|
|
68
|
+
* DELETE 请求
|
|
69
|
+
*/
|
|
70
|
+
delete<T = any>(url: string, config?: RequestConfig): Promise<T>;
|
|
71
|
+
/**
|
|
72
|
+
* 获取原始 Axios 实例
|
|
73
|
+
*/
|
|
74
|
+
getAxiosInstance(): AxiosInstance;
|
|
75
|
+
/**
|
|
76
|
+
* 获取熔断器状态
|
|
77
|
+
*/
|
|
78
|
+
getCircuitBreakerState(): string;
|
|
79
|
+
}
|
|
80
|
+
export declare const http: HttpClient;
|
|
81
|
+
declare module 'axios' {
|
|
82
|
+
interface AxiosRequestConfig {
|
|
83
|
+
__retryCount?: number;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=HttpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/http/HttpClient.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,kBAAkB,EAA6B,MAAM,OAAO,CAAC;AAE5F;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,eAAe;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA8DD;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAQnB;gBAEU,MAAM,GAAE,aAAkB;IAUtC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;YACW,mBAAmB;IAuCjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAShB;;OAEG;IACU,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAU1E;;OAEG;IACU,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAUvF;;OAEG;IACU,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAUtF;;OAEG;IACU,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAU7E;;OAEG;IACI,gBAAgB,IAAI,aAAa;IAIxC;;OAEG;IACI,sBAAsB,IAAI,MAAM;CAGxC;AAGD,eAAO,MAAM,IAAI,YAGf,CAAC;AAGH,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAiB,kBAAkB;QACjC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CACF"}
|