mock-switch-webpack-plugin 1.2.0 → 1.3.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/README.md +87 -174
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,82 +1,47 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/mock-switch-webpack-plugin)
|
|
4
|
+

|
|
3
5
|
|
|
6
|
+
**基于 webpack 的开发环境 API Mock 与代理管理插件**
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
</div>
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
在前端开发中,频繁切换接口环境(Mock/开发/生产)往往需要修改代码或重启服务。本插件通过 Webpack 与中间件技术,实现了一键可视化环境切换,让开发调试变得前所未有的流畅与高效。
|
|
8
11
|
|
|
9
|
-
|
|
12
|
+
## 核心特性
|
|
10
13
|
|
|
14
|
+
- **浏览器端一键切换**:页面右下角悬浮控制面板,支持 Mock / 开发 / 生产环境无缝切换,无需修改代码或重启服务;
|
|
15
|
+
- **Mock 数据热更新**:修改 Mock 文件立即生效,无需重启服务;
|
|
16
|
+
- **自动路径匹配**:根据接口路径自动查找对应的 Mock 文件;
|
|
17
|
+
- **智能请求处理**:支持 POST/PUT/PATCH 请求 body 自动解析与转发;
|
|
18
|
+
- **热重载友好**:全局单例模式,防止 CRA 热重载时重复创建实例,并且热重载不会丢失当前的环境状态,实现状态持久化;
|
|
19
|
+
- **全平台兼容**:
|
|
20
|
+
- 支持 **CRA (Create React App)**、**Vue CLI** 及所有基于 Webpack 的项目;
|
|
21
|
+
- 兼容 Webpack 3/4/5 的 DevServer API 差异;
|
|
22
|
+
- **开箱即用**:自动注入 UI 代码,自动配置路由,零配置即可体验;
|
|
11
23
|
|
|
24
|
+
## 与其他方案VS对比
|
|
12
25
|
|
|
13
|
-
|
|
26
|
+
| 功能 | mock-switch-webpack-plugin | mocker-api | 其他 |
|
|
27
|
+
|------|---------------------------|------------|-------------------|
|
|
28
|
+
| 浏览器可视化一键切换 | ✅ | ❌ | ❌ |
|
|
29
|
+
| Mock数据热更新 | ✅ | ✅ | ❌需重启 |
|
|
30
|
+
| 环境持久化 | ✅ | ❌ | ❌ |
|
|
31
|
+
| POST Body 自动解析转发 | ✅ | ❌需手动 | ❌ 需手动 |
|
|
32
|
+
| CRA 完美支持 | ✅ | ❌ | ❌ |
|
|
14
33
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- 右下角悬浮控制面板,可视化切换环境
|
|
18
|
-
|
|
19
|
-
- 实时状态显示,不同环境对应不同颜色标识
|
|
20
|
-
|
|
21
|
-
- 无需修改代码或重启服务
|
|
22
|
-
|
|
23
|
-
### 🔥 Mock 数据热更新
|
|
24
|
-
|
|
25
|
-
- 修改 Mock 文件立即生效,无需重启 Webpack DevServer
|
|
26
|
-
|
|
27
|
-
- 自动清除 require 缓存,实时加载最新数据
|
|
28
|
-
|
|
29
|
-
- 支持开发过程中快速调试接口
|
|
30
|
-
|
|
31
|
-
### 📦 开箱即用,零配置
|
|
32
|
-
|
|
33
|
-
- 支持 **CRA \(Create React App\)**、**Vue CLI**、**原生 Webpack** 等所有项目
|
|
34
|
-
|
|
35
|
-
- 兼容 Webpack 3/4/5 全版本
|
|
36
|
-
|
|
37
|
-
- 兼容 Webpack 打包发布模式
|
|
38
|
-
|
|
39
|
-
### 🔌 智能请求处理
|
|
40
|
-
|
|
41
|
-
- POST/PUT/PATCH 请求 body 自动解析与转发
|
|
42
|
-
|
|
43
|
-
- 支持 JSON 和表单格式请求
|
|
44
|
-
|
|
45
|
-
- 自动移除 API 前缀,无缝代理转发
|
|
46
|
-
|
|
47
|
-
### 🛡️ 热重载友好
|
|
48
|
-
|
|
49
|
-
- 全局单例模式,防止 CRA 热重载时重复创建实例
|
|
50
|
-
|
|
51
|
-
- 环境状态跨热重载持久化
|
|
52
|
-
|
|
53
|
-
- 解决全局状态隔离问题
|
|
54
|
-
|
|
55
|
-
## 🆚 方案对比
|
|
56
|
-
|
|
57
|
-
|特性|Mock Switch|mockjs|http\-proxy\-middleware|
|
|
58
|
-
|---|---|---|---|
|
|
59
|
-
|浏览器可视化切换|✅|❌|❌|
|
|
60
|
-
|Mock 数据热更新|✅|❌|\-|
|
|
61
|
-
|无需重启服务|✅|❌|❌|
|
|
62
|
-
|多环境一键切换|✅|❌|✅|
|
|
63
|
-
|POST Body 自动解析|✅|❌|⚠️ 需手动|
|
|
64
|
-
|CRA 友好支持|✅|⚠️|⚠️|
|
|
65
|
-
|打包兼容|✅|✅|✅|
|
|
66
|
-
|
|
67
|
-
## 📦 安装
|
|
34
|
+
## 安装
|
|
68
35
|
|
|
69
36
|
```bash
|
|
70
37
|
npm install mock-switch-webpack-plugin --save-dev
|
|
71
38
|
# or
|
|
72
39
|
yarn add mock-switch-webpack-plugin -D
|
|
73
|
-
# or
|
|
74
|
-
pnpm add mock-switch-webpack-plugin -D
|
|
75
40
|
```
|
|
76
41
|
|
|
77
|
-
##
|
|
42
|
+
## 使用
|
|
78
43
|
|
|
79
|
-
### 方式一:原生 Webpack
|
|
44
|
+
### 方式一:原生 Webpack 项目
|
|
80
45
|
|
|
81
46
|
**webpack\.config\.js**
|
|
82
47
|
|
|
@@ -110,9 +75,8 @@ CRA 项目需要同时配置 **webpack\.config\.js** 和 **setupProxy\.js** 两
|
|
|
110
75
|
|
|
111
76
|
#### 步骤 1:配置 webpack\.config\.js
|
|
112
77
|
|
|
113
|
-
使用 `craco` 或 `react-app-rewired` 覆盖 Webpack 配置:
|
|
114
78
|
|
|
115
|
-
**
|
|
79
|
+
**webpack\.config\.js**
|
|
116
80
|
|
|
117
81
|
```javascript
|
|
118
82
|
const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
|
|
@@ -121,8 +85,7 @@ module.exports = {
|
|
|
121
85
|
webpack: {
|
|
122
86
|
plugins: [
|
|
123
87
|
new MockSwitchWebpackPlugin({
|
|
124
|
-
autoRegisterMiddleware: false,
|
|
125
|
-
hotReload: true
|
|
88
|
+
autoRegisterMiddleware: false, // CRA 必须设为 false
|
|
126
89
|
})
|
|
127
90
|
]
|
|
128
91
|
}
|
|
@@ -135,7 +98,7 @@ module.exports = {
|
|
|
135
98
|
|
|
136
99
|
#### 步骤 2:配置 src/setupProxy\.js
|
|
137
100
|
|
|
138
|
-
**src/setupProxy\.js
|
|
101
|
+
**src/setupProxy\.js**
|
|
139
102
|
|
|
140
103
|
```javascript
|
|
141
104
|
const { createMockMiddleware } = require('mock-switch-webpack-plugin');
|
|
@@ -160,13 +123,13 @@ module.exports = function(app) {
|
|
|
160
123
|
|
|
161
124
|
> 💡 **setupProxy\.js 作用说明**:
|
|
162
125
|
>
|
|
163
|
-
> - CRA
|
|
126
|
+
> - CRA 开发服务器启动时自动加载此文件;
|
|
164
127
|
>
|
|
165
|
-
> - 用于注册 Express 中间件,接管 API
|
|
128
|
+
> - 用于注册 Express 中间件,接管 API 请求;
|
|
166
129
|
>
|
|
167
|
-
> - 实现 Mock
|
|
130
|
+
> - 实现 Mock 数据返回与代理转发逻辑;
|
|
168
131
|
>
|
|
169
|
-
> - 使用单例模式,解决 CRA
|
|
132
|
+
> - 使用单例模式,解决 CRA 热重载导致的重复实例问题;
|
|
170
133
|
>
|
|
171
134
|
>
|
|
172
135
|
|
|
@@ -188,8 +151,16 @@ module.exports = {
|
|
|
188
151
|
};
|
|
189
152
|
```
|
|
190
153
|
|
|
191
|
-
|
|
154
|
+
### 启动开发服务
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npm run start
|
|
158
|
+
```
|
|
192
159
|
|
|
160
|
+
- 打开浏览器,你会看到右下角的悬浮切换按钮
|
|
161
|
+
- 点击按钮展开控制面板,实现环境实时切换 🎉
|
|
162
|
+
|
|
163
|
+
## 配置说明
|
|
193
164
|
### 完整配置项
|
|
194
165
|
|
|
195
166
|
```javascript
|
|
@@ -240,42 +211,30 @@ new MockSwitchWebpackPlugin({
|
|
|
240
211
|
})
|
|
241
212
|
```
|
|
242
213
|
|
|
243
|
-
### environments
|
|
214
|
+
### environments 配置详解
|
|
244
215
|
|
|
245
216
|
每个环境配置包含:
|
|
246
217
|
|
|
247
218
|
|参数|类型|说明|
|
|
248
219
|
|---|---|---|
|
|
249
|
-
|`name`|string
|
|
220
|
+
|`name`|string|环境名称|
|
|
250
221
|
|`target`|string \| null|代理目标地址,null 表示使用 Mock|
|
|
251
222
|
|
|
252
223
|
**示例:自定义环境**
|
|
253
224
|
|
|
254
225
|
```javascript
|
|
255
226
|
environments: {
|
|
256
|
-
mock: { name: '
|
|
257
|
-
|
|
258
|
-
pre: { name: '🟡 预发环境', target: 'http://pre-api.example.com' },
|
|
227
|
+
mock: { name: 'Mock环境', target: null },
|
|
228
|
+
dev: { name: '开发环境', target: 'http://dev-api.example.com' },
|
|
259
229
|
prod: { name: '🔴 生产环境', target: 'https://api.example.com' }
|
|
260
230
|
}
|
|
261
231
|
```
|
|
262
|
-
|
|
263
|
-
---
|
|
264
|
-
|
|
265
232
|
### setupProxy\.js 配置详解(CRA 专用)
|
|
266
233
|
|
|
267
234
|
#### 什么是 setupProxy\.js?
|
|
268
235
|
|
|
269
236
|
`setupProxy.js` 是 **Create React App** 官方约定的代理配置文件,位于 `src/` 目录下,CRA 开发服务器启动时会**自动加载**此文件。
|
|
270
237
|
|
|
271
|
-
#### 为什么 CRA 需要 setupProxy\.js?
|
|
272
|
-
|
|
273
|
-
1. **CRA 隐藏了 webpack\.config\.js**,无法直接修改 DevServer 配置
|
|
274
|
-
|
|
275
|
-
2. **HTTP 代理中间件**必须在 Express 应用层注册
|
|
276
|
-
|
|
277
|
-
3. **Mock 逻辑**需要在请求到达 React 之前拦截处理
|
|
278
|
-
|
|
279
238
|
#### createMockMiddleware 函数参数
|
|
280
239
|
|
|
281
240
|
```javascript
|
|
@@ -287,37 +246,7 @@ createMockMiddleware(app, options)
|
|
|
287
246
|
|`app`|Express|Express 应用实例,由 CRA 传入|
|
|
288
247
|
|`options`|Object|配置选项,与插件构造函数参数一致|
|
|
289
248
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
```javascript
|
|
293
|
-
function createMockMiddleware(app, options) {
|
|
294
|
-
// 1. 单例模式:热重载复用已有实例
|
|
295
|
-
if (_pluginSingleton) return _pluginSingleton;
|
|
296
|
-
|
|
297
|
-
// 2. 创建插件实例(关闭自动注册中间件)
|
|
298
|
-
_pluginSingleton = new MockSwitchWebpackPlugin({
|
|
299
|
-
...options,
|
|
300
|
-
autoRegisterMiddleware: false
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
// 3. 手动注册路由和中间件
|
|
304
|
-
_pluginSingleton.registerRoutesWithBodyParser(app);
|
|
305
|
-
|
|
306
|
-
return _pluginSingleton;
|
|
307
|
-
}
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
#### ✅ 关键配置要点
|
|
311
|
-
|
|
312
|
-
- **必须**设置 `autoRegisterMiddleware: false`
|
|
313
|
-
|
|
314
|
-
- **必须**使用 `createMockMiddleware` 而非直接 `new MockSwitchWebpackPlugin()`
|
|
315
|
-
|
|
316
|
-
- **支持**热重载:全局单例 \+ 状态持久化
|
|
317
|
-
|
|
318
|
-
- **自动**注册 express\.json \(\) 和 urlencoded 中间件
|
|
319
|
-
|
|
320
|
-
## 📝 Mock 文件规范
|
|
249
|
+
## Mock 文件规范
|
|
321
250
|
|
|
322
251
|
### 目录结构
|
|
323
252
|
|
|
@@ -399,78 +328,62 @@ module.exports = function(req, res) {
|
|
|
399
328
|
}
|
|
400
329
|
```
|
|
401
330
|
|
|
402
|
-
## 🎨 控制面板预览
|
|
403
331
|
|
|
404
|
-
启动项目后,浏览器右下角会出现悬浮按钮:
|
|
405
332
|
|
|
406
|
-
- 🟢 **绿色** \- Mock 环境
|
|
407
333
|
|
|
408
|
-
- 🟡 **黄色** \- 开发环境
|
|
409
334
|
|
|
410
|
-
- 🔴 **红色** \- 生产环境
|
|
411
335
|
|
|
412
|
-
|
|
336
|
+
### 2. 创建 Mock 文件
|
|
413
337
|
|
|
414
|
-
|
|
338
|
+
在项目根目录创建 `mock` 文件夹,按以下命名规则创建文件:
|
|
415
339
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
340
|
+
```
|
|
341
|
+
mock/
|
|
342
|
+
├── GET_user_list.json # GET /api/user/list
|
|
343
|
+
├── POST_user_login.js # POST /api/user/login
|
|
344
|
+
├── GET_user_1_detail.json # GET /api/user/1/detail
|
|
345
|
+
└── config.js # 其他配置
|
|
422
346
|
```
|
|
423
347
|
|
|
424
|
-
|
|
348
|
+
#### 静态 Mock (JSON)
|
|
425
349
|
|
|
426
350
|
```json
|
|
351
|
+
// mock/GET_user_list.json
|
|
427
352
|
{
|
|
428
|
-
"
|
|
429
|
-
"
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
353
|
+
"code": 0,
|
|
354
|
+
"message": "success",
|
|
355
|
+
"data": {
|
|
356
|
+
"list": [
|
|
357
|
+
{ "id": 1, "name": "张三" },
|
|
358
|
+
{ "id": 2, "name": "李四" }
|
|
359
|
+
]
|
|
360
|
+
},
|
|
361
|
+
"_delay": 500
|
|
434
362
|
}
|
|
435
363
|
```
|
|
436
364
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
```Plain Text
|
|
440
|
-
POST /__mock_switch__/env
|
|
441
|
-
Content-Type: application/json
|
|
365
|
+
#### 动态 Mock (JS)
|
|
442
366
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
367
|
+
```javascript
|
|
368
|
+
// mock/POST_user_login.js
|
|
369
|
+
module.exports = function(req, res) {
|
|
370
|
+
const { username, password } = req.body;
|
|
371
|
+
|
|
372
|
+
if (username === 'admin' && password === '123456') {
|
|
373
|
+
return {
|
|
374
|
+
code: 0,
|
|
375
|
+
message: '登录成功',
|
|
376
|
+
data: { token: 'mock_' + Date.now() }
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
return {
|
|
381
|
+
code: 401,
|
|
382
|
+
message: '用户名或密码错误'
|
|
383
|
+
};
|
|
384
|
+
};
|
|
446
385
|
```
|
|
447
386
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
### Q: CRA 热重载后环境状态丢失?
|
|
451
|
-
|
|
452
|
-
A: 插件已内置全局状态持久化机制,使用 `createMockMiddleware` 即可自动处理。
|
|
453
|
-
|
|
454
|
-
### Q: Mock 文件修改后不生效?
|
|
455
|
-
|
|
456
|
-
A: 确保 `hotReload: true`(默认开启),插件会自动清除 require 缓存。
|
|
457
|
-
|
|
458
|
-
### Q: POST 请求 body 为空?
|
|
459
|
-
|
|
460
|
-
A: 插件已内置 express\.json \(\) 和 urlencoded 解析中间件,无需额外配置。
|
|
461
|
-
|
|
462
|
-
### Q: 代理请求 404?
|
|
463
|
-
|
|
464
|
-
A: 插件会自动移除 `apiPrefix` 前缀,如 `/api/users` → `/users`,确保后端接口路径正确。
|
|
465
|
-
|
|
466
|
-
## 📄 License
|
|
467
|
-
|
|
468
|
-
MIT © [lebron\_shi](https://github.com/shilimingY)
|
|
469
|
-
|
|
470
|
-
---
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
**如果这个插件对你有帮助,欢迎给个 ⭐ Star**
|
|
387
|
+
**如果这个插件对你有帮助,欢迎给个 ⭐ Star 哦!!!**
|
|
475
388
|
|
|
476
389
|
[GitHub](https://github.com/shilimingY/mock-switch-webpack-plugin) • [Issues](https://github.com/shilimingY/mock-switch-webpack-plugin/issues)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mock-switch-webpack-plugin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "前端Mock神器!浏览器一键切换Mock/开发/生产环境的Webpack插件,支持接口代理、Mock数据热更新、POST请求自动转发等特性,零配置接入React/Vue等所有Webpack项目,彻底告别需手动修改代码来切换环境的低效开发方式。",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|