mock-switch-webpack-plugin 1.1.1 → 1.2.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 +359 -188
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,44 +1,68 @@
|
|
|
1
|
-
# Mock Switch Webpack Plugin
|
|
1
|
+
# Mock Switch Webpack Plugin README
|
|
2
2
|
|
|
3
|
-
<div align="center">
|
|
4
3
|
|
|
5
|
-

|
|
6
|
-

|
|
7
|
-

|
|
8
4
|
|
|
9
|
-
|
|
5
|
+
**前端开发环境 API Mock 与代理管理插件**
|
|
10
6
|
|
|
11
|
-
|
|
7
|
+
一键切换 Mock / 开发 / 生产环境,Mock 数据热更新,无需重启服务
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
\[特性\]\(\#\-核心特性\) • \[安装\]\(\#\-安装\) • \[快速开始\]\(\#\-快速开始\) • \[配置说明\]\(\#\-配置说明\) • \[Mock 规范\]\(\#\-mock\-文件规范\)
|
|
14
10
|
|
|
15
|
-
### 🎯 核心功能
|
|
16
|
-
- **🔄 浏览器端一键切换** - 页面内悬浮面板,Mock / 测试 / 生产环境无缝切换
|
|
17
|
-
- **🔥 Mock 数据热更新** - 修改 Mock 文件立即生效,无需重启服务
|
|
18
|
-
- **📝 自动记录真实接口** - 代理请求时自动记录返回,一键保存为 Mock 文件
|
|
19
|
-
- **📂 自动路径匹配** - 根据接口路径自动查找对应 Mock 文件
|
|
20
|
-
- **⚡ 零侵入式设计** - 纯 webpack 插件,无需修改业务代码
|
|
21
11
|
|
|
22
|
-
### 🎨 界面预览
|
|
23
|
-
- 右下角悬浮切换按钮,状态指示灯(绿=Mock/黄=测试/红=生产)
|
|
24
|
-
- 优雅的下拉面板,环境列表 + 已记录接口;
|
|
25
|
-
- 点击即可保存真实接口返回为 Mock 文件
|
|
26
12
|
|
|
27
|
-
##
|
|
13
|
+
## 🎯 核心特性
|
|
28
14
|
|
|
29
|
-
|
|
30
|
-
|------|---------------------------|------------|-------------------|--------|
|
|
31
|
-
| 浏览器端一键切换 | ✅ | ❌ | ❌ | ❌ |
|
|
32
|
-
| Mock数据热更新 | ✅ | ✅ | ✅ | ❌ |
|
|
33
|
-
| 自动记录真实接口 | ✅ | ❌ | ❌ | ❌ |
|
|
34
|
-
| 一键保存为Mock | ✅ | ❌ | ❌ | ❌ |
|
|
35
|
-
| 自动路径匹配 | ✅ | ✅ | ✅ | ❌ |
|
|
36
|
-
| Webpack5支持 | ✅ | ✅ | ⚠️ | ❌ |
|
|
37
|
-
| 零侵入集成 | ✅ | ⚠️ | ⚠️ | ❌ |
|
|
38
|
-
| 动态Mock函数 | ✅ | ✅ | ✅ | ✅ |
|
|
39
|
-
| 网络延迟模拟 | ✅ | ✅ | ❌ | ✅ |
|
|
15
|
+
### ✨ 浏览器端一键环境切换
|
|
40
16
|
|
|
41
|
-
|
|
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
|
+
|打包兼容|✅|✅|✅|
|
|
42
66
|
|
|
43
67
|
## 📦 安装
|
|
44
68
|
|
|
@@ -52,254 +76,401 @@ pnpm add mock-switch-webpack-plugin -D
|
|
|
52
76
|
|
|
53
77
|
## 🚀 快速开始
|
|
54
78
|
|
|
55
|
-
###
|
|
79
|
+
### 方式一:原生 Webpack 项目(推荐)
|
|
80
|
+
|
|
81
|
+
**webpack\.config\.js**
|
|
56
82
|
|
|
57
83
|
```javascript
|
|
58
|
-
const
|
|
84
|
+
const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
|
|
59
85
|
|
|
60
86
|
module.exports = {
|
|
61
87
|
// ... 其他配置
|
|
62
88
|
plugins: [
|
|
63
|
-
new
|
|
64
|
-
// Mock文件目录(相对项目根目录)
|
|
89
|
+
new MockSwitchWebpackPlugin({
|
|
65
90
|
mockDir: './mock',
|
|
66
|
-
// 接口前缀,只拦截该前缀的请求
|
|
67
91
|
apiPrefix: '/api',
|
|
68
|
-
// 环境配置
|
|
69
92
|
environments: {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
dev: {
|
|
94
|
+
name: '开发环境',
|
|
95
|
+
target: 'http://localhost:8080'
|
|
96
|
+
},
|
|
97
|
+
prod: {
|
|
98
|
+
name: '生产环境',
|
|
99
|
+
target: 'https://api.example.com'
|
|
100
|
+
}
|
|
101
|
+
}
|
|
78
102
|
})
|
|
79
|
-
]
|
|
80
|
-
devServer: {
|
|
81
|
-
// 插件会自动注入中间件,无需额外配置
|
|
82
|
-
hot: true,
|
|
83
|
-
open: true
|
|
84
|
-
}
|
|
103
|
+
]
|
|
85
104
|
};
|
|
86
105
|
```
|
|
87
106
|
|
|
88
|
-
###
|
|
107
|
+
### 方式二:CRA \(Create React App\) 项目
|
|
108
|
+
|
|
109
|
+
CRA 项目需要同时配置 **webpack\.config\.js** 和 **setupProxy\.js** 两个文件。
|
|
110
|
+
|
|
111
|
+
#### 步骤 1:配置 webpack\.config\.js
|
|
112
|
+
|
|
113
|
+
使用 `craco` 或 `react-app-rewired` 覆盖 Webpack 配置:
|
|
89
114
|
|
|
90
|
-
|
|
115
|
+
**craco\.config\.js** 或 **config\-overrides\.js**
|
|
91
116
|
|
|
117
|
+
```javascript
|
|
118
|
+
const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
|
|
119
|
+
|
|
120
|
+
module.exports = {
|
|
121
|
+
webpack: {
|
|
122
|
+
plugins: [
|
|
123
|
+
new MockSwitchWebpackPlugin({
|
|
124
|
+
autoRegisterMiddleware: false, // CRA 必须设为 false
|
|
125
|
+
hotReload: true
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
};
|
|
92
130
|
```
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
131
|
+
|
|
132
|
+
> 💡 **作用**:向打包输出注入客户端 UI 代码,实现浏览器右下角的环境切换悬浮面板。
|
|
133
|
+
>
|
|
134
|
+
>
|
|
135
|
+
|
|
136
|
+
#### 步骤 2:配置 src/setupProxy\.js
|
|
137
|
+
|
|
138
|
+
**src/setupProxy\.js**(CRA 官方约定的代理配置文件)
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
const { createMockMiddleware } = require('mock-switch-webpack-plugin');
|
|
142
|
+
|
|
143
|
+
module.exports = function(app) {
|
|
144
|
+
createMockMiddleware(app, {
|
|
145
|
+
mockDir: './mock',
|
|
146
|
+
apiPrefix: '/api',
|
|
147
|
+
environments: {
|
|
148
|
+
dev: {
|
|
149
|
+
name: '开发环境',
|
|
150
|
+
target: 'http://localhost:8080'
|
|
151
|
+
},
|
|
152
|
+
prod: {
|
|
153
|
+
name: '生产环境',
|
|
154
|
+
target: 'https://api.example.com'
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
};
|
|
98
159
|
```
|
|
99
160
|
|
|
100
|
-
|
|
161
|
+
> 💡 **setupProxy\.js 作用说明**:
|
|
162
|
+
>
|
|
163
|
+
> - CRA 开发服务器启动时自动加载此文件
|
|
164
|
+
>
|
|
165
|
+
> - 用于注册 Express 中间件,接管 API 请求
|
|
166
|
+
>
|
|
167
|
+
> - 实现 Mock 数据返回与代理转发逻辑
|
|
168
|
+
>
|
|
169
|
+
> - 使用单例模式,解决 CRA 热重载导致的重复实例问题
|
|
170
|
+
>
|
|
171
|
+
>
|
|
101
172
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
173
|
+
### 方式三:Vue CLI 项目
|
|
174
|
+
|
|
175
|
+
**vue\.config\.js**
|
|
176
|
+
|
|
177
|
+
```javascript
|
|
178
|
+
const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
|
|
179
|
+
|
|
180
|
+
module.exports = {
|
|
181
|
+
configureWebpack: {
|
|
182
|
+
plugins: [
|
|
183
|
+
new MockSwitchWebpackPlugin({
|
|
184
|
+
// 配置项
|
|
185
|
+
})
|
|
111
186
|
]
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
}
|
|
187
|
+
}
|
|
188
|
+
};
|
|
115
189
|
```
|
|
116
190
|
|
|
117
|
-
|
|
191
|
+
## ⚙️ 配置说明
|
|
192
|
+
|
|
193
|
+
### 完整配置项
|
|
118
194
|
|
|
119
195
|
```javascript
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
196
|
+
new MockSwitchWebpackPlugin({
|
|
197
|
+
/**
|
|
198
|
+
* Mock 文件存放目录
|
|
199
|
+
* @default './mock'
|
|
200
|
+
*/
|
|
201
|
+
mockDir: './mock',
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* API 请求前缀
|
|
205
|
+
* @default '/api'
|
|
206
|
+
*/
|
|
207
|
+
apiPrefix: '/api',
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 是否启用 Mock 文件热更新
|
|
211
|
+
* @default true
|
|
212
|
+
*/
|
|
213
|
+
hotReload: true,
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* 是否自动注册 DevServer 中间件
|
|
217
|
+
* @default true
|
|
218
|
+
* CRA 项目请设为 false,使用 createMockMiddleware
|
|
219
|
+
*/
|
|
220
|
+
autoRegisterMiddleware: true,
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 环境配置
|
|
224
|
+
* 内置 mock/dev/prod 三个环境,可自定义名称和目标地址
|
|
225
|
+
*/
|
|
226
|
+
environments: {
|
|
227
|
+
mock: {
|
|
228
|
+
name: 'Mock环境',
|
|
229
|
+
target: null // null 表示使用本地Mock文件
|
|
230
|
+
},
|
|
231
|
+
dev: {
|
|
232
|
+
name: '开发环境',
|
|
233
|
+
target: 'http://localhost:8080'
|
|
234
|
+
},
|
|
235
|
+
prod: {
|
|
236
|
+
name: '生产环境',
|
|
237
|
+
target: 'https://api.example.com'
|
|
238
|
+
}
|
|
130
239
|
}
|
|
131
|
-
|
|
132
|
-
return {
|
|
133
|
-
code: 401,
|
|
134
|
-
message: '用户名或密码错误'
|
|
135
|
-
};
|
|
136
|
-
};
|
|
240
|
+
})
|
|
137
241
|
```
|
|
138
242
|
|
|
139
|
-
###
|
|
243
|
+
### environments 详解
|
|
140
244
|
|
|
141
|
-
|
|
142
|
-
|
|
245
|
+
每个环境配置包含:
|
|
246
|
+
|
|
247
|
+
|参数|类型|说明|
|
|
248
|
+
|---|---|---|
|
|
249
|
+
|`name`|string|环境显示名称,支持 emoji|
|
|
250
|
+
|`target`|string \| null|代理目标地址,null 表示使用 Mock|
|
|
251
|
+
|
|
252
|
+
**示例:自定义环境**
|
|
253
|
+
|
|
254
|
+
```javascript
|
|
255
|
+
environments: {
|
|
256
|
+
mock: { name: '🟢 Mock环境', target: null },
|
|
257
|
+
test: { name: '🔵 测试环境', target: 'http://test-api.example.com' },
|
|
258
|
+
pre: { name: '🟡 预发环境', target: 'http://pre-api.example.com' },
|
|
259
|
+
prod: { name: '🔴 生产环境', target: 'https://api.example.com' }
|
|
260
|
+
}
|
|
143
261
|
```
|
|
144
262
|
|
|
145
|
-
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
### setupProxy\.js 配置详解(CRA 专用)
|
|
266
|
+
|
|
267
|
+
#### 什么是 setupProxy\.js?
|
|
146
268
|
|
|
147
|
-
|
|
269
|
+
`setupProxy.js` 是 **Create React App** 官方约定的代理配置文件,位于 `src/` 目录下,CRA 开发服务器启动时会**自动加载**此文件。
|
|
148
270
|
|
|
149
|
-
|
|
150
|
-
|------|------|--------|------|
|
|
151
|
-
| `mockDir` | `string` | `./mock` | Mock 文件存放目录 |
|
|
152
|
-
| `apiPrefix` | `string` | `/api` | 需要拦截的接口前缀 |
|
|
153
|
-
| `environments` | `object` | 见下方 | 环境配置列表 |
|
|
154
|
-
| `autoRecord` | `boolean` | `true` | 是否自动记录真实接口 |
|
|
155
|
-
| `hotReload` | `boolean` | `true` | 是否开启 Mock 热更新 |
|
|
156
|
-
| `port` | `number` | `38080` | 控制面板端口 |
|
|
271
|
+
#### 为什么 CRA 需要 setupProxy\.js?
|
|
157
272
|
|
|
158
|
-
|
|
273
|
+
1. **CRA 隐藏了 webpack\.config\.js**,无法直接修改 DevServer 配置
|
|
274
|
+
|
|
275
|
+
2. **HTTP 代理中间件**必须在 Express 应用层注册
|
|
276
|
+
|
|
277
|
+
3. **Mock 逻辑**需要在请求到达 React 之前拦截处理
|
|
278
|
+
|
|
279
|
+
#### createMockMiddleware 函数参数
|
|
159
280
|
|
|
160
281
|
```javascript
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
282
|
+
createMockMiddleware(app, options)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
|参数|类型|说明|
|
|
286
|
+
|---|---|---|
|
|
287
|
+
|`app`|Express|Express 应用实例,由 CRA 传入|
|
|
288
|
+
|`options`|Object|配置选项,与插件构造函数参数一致|
|
|
289
|
+
|
|
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;
|
|
165
307
|
}
|
|
166
308
|
```
|
|
167
309
|
|
|
168
|
-
|
|
310
|
+
#### ✅ 关键配置要点
|
|
311
|
+
|
|
312
|
+
- **必须**设置 `autoRegisterMiddleware: false`
|
|
169
313
|
|
|
170
|
-
|
|
314
|
+
- **必须**使用 `createMockMiddleware` 而非直接 `new MockSwitchWebpackPlugin()`
|
|
171
315
|
|
|
172
|
-
|
|
173
|
-
2. 点击对应环境即可切换
|
|
174
|
-
3. 状态指示灯会变色(绿/黄/红)
|
|
175
|
-
4. 后续请求自动走对应环境
|
|
316
|
+
- **支持**热重载:全局单例 \+ 状态持久化
|
|
176
317
|
|
|
177
|
-
|
|
318
|
+
- **自动**注册 express\.json \(\) 和 urlencoded 中间件
|
|
178
319
|
|
|
179
|
-
|
|
180
|
-
2. 正常调用接口(插件会自动记录返回)
|
|
181
|
-
3. 打开面板,在「已记录的接口」列表中
|
|
182
|
-
4. 点击「保存」按钮,自动生成 Mock 文件
|
|
320
|
+
## 📝 Mock 文件规范
|
|
183
321
|
|
|
184
|
-
###
|
|
322
|
+
### 目录结构
|
|
323
|
+
|
|
324
|
+
```Plain Text
|
|
325
|
+
your-project/
|
|
326
|
+
├── mock/
|
|
327
|
+
│ ├── GET_users.json # GET /api/users
|
|
328
|
+
│ ├── POST_users.js # POST /api/users
|
|
329
|
+
│ ├── GET_users_1.json # GET /api/users/1
|
|
330
|
+
│ └── GET_users_1_orders.js # GET /api/users/1/orders
|
|
331
|
+
└── src/
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 文件命名规则
|
|
185
335
|
|
|
186
336
|
插件会按以下优先级查找 Mock 文件:
|
|
187
337
|
|
|
188
|
-
1. `{METHOD}_{path}.json`
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
4. `{path}.js` - 如 `user_list.js`
|
|
192
|
-
5. 目录结构匹配 - 如 `/mock/user/list.json`
|
|
338
|
+
1. `{METHOD}_{path}.json` \- 带方法的 JSON 文件
|
|
339
|
+
|
|
340
|
+
2. `{path}.json` \- 不带方法的 JSON 文件
|
|
193
341
|
|
|
194
|
-
|
|
342
|
+
3. `{METHOD}_{path}.js` \- 带方法的 JS 文件
|
|
195
343
|
|
|
196
|
-
|
|
344
|
+
4. `{path}.js` \- 不带方法的 JS 文件
|
|
197
345
|
|
|
198
|
-
|
|
346
|
+
> `path` 中的 `/` 会被替换为 `_`
|
|
347
|
+
>
|
|
348
|
+
>
|
|
199
349
|
|
|
200
|
-
|
|
350
|
+
### 静态 Mock \(JSON 文件\)
|
|
351
|
+
|
|
352
|
+
**mock/GET\_users\.json**
|
|
201
353
|
|
|
202
354
|
```json
|
|
203
355
|
{
|
|
204
356
|
"code": 0,
|
|
205
|
-
"
|
|
206
|
-
"
|
|
357
|
+
"message": "success",
|
|
358
|
+
"data": [
|
|
359
|
+
{ "id": 1, "name": "张三" },
|
|
360
|
+
{ "id": 2, "name": "李四" }
|
|
361
|
+
],
|
|
362
|
+
"_delay": 500
|
|
207
363
|
}
|
|
208
364
|
```
|
|
209
365
|
|
|
210
|
-
|
|
366
|
+
### 动态 Mock \(JS 文件\)
|
|
211
367
|
|
|
212
|
-
|
|
368
|
+
**mock/POST\_users\.js**
|
|
213
369
|
|
|
214
370
|
```javascript
|
|
215
|
-
module.exports =
|
|
216
|
-
//
|
|
217
|
-
const {
|
|
218
|
-
|
|
219
|
-
// 获取请求体
|
|
220
|
-
const body = req.body;
|
|
221
|
-
|
|
222
|
-
// 自定义响应头
|
|
223
|
-
res.setHeader('X-Custom-Header', 'mock');
|
|
371
|
+
module.exports = function(req, res) {
|
|
372
|
+
// 可以访问请求参数
|
|
373
|
+
const { name, age } = req.body;
|
|
224
374
|
|
|
375
|
+
// 返回动态数据
|
|
225
376
|
return {
|
|
226
377
|
code: 0,
|
|
227
|
-
|
|
378
|
+
message: 'success',
|
|
379
|
+
data: {
|
|
380
|
+
id: Date.now(),
|
|
381
|
+
name,
|
|
382
|
+
age,
|
|
383
|
+
createdAt: new Date().toISOString()
|
|
384
|
+
},
|
|
385
|
+
_delay: 300 // 模拟网络延迟(毫秒)
|
|
228
386
|
};
|
|
229
387
|
};
|
|
230
388
|
```
|
|
231
389
|
|
|
232
|
-
|
|
390
|
+
### 特殊字段 `_delay`
|
|
233
391
|
|
|
234
|
-
|
|
392
|
+
在返回数据中添加 `_delay` 字段可以模拟网络延迟:
|
|
235
393
|
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
|
|
394
|
+
```json
|
|
395
|
+
{
|
|
396
|
+
"code": 0,
|
|
397
|
+
"data": {},
|
|
398
|
+
"_delay": 1000 // 延迟 1 秒返回
|
|
399
|
+
}
|
|
400
|
+
```
|
|
239
401
|
|
|
240
|
-
|
|
241
|
-
# - name: 包名(需唯一)
|
|
242
|
-
# - version: 语义化版本号
|
|
243
|
-
# - main: 入口文件
|
|
402
|
+
## 🎨 控制面板预览
|
|
244
403
|
|
|
245
|
-
|
|
246
|
-
npm publish
|
|
404
|
+
启动项目后,浏览器右下角会出现悬浮按钮:
|
|
247
405
|
|
|
248
|
-
|
|
249
|
-
npm publish --access public
|
|
250
|
-
```
|
|
406
|
+
- 🟢 **绿色** \- Mock 环境
|
|
251
407
|
|
|
252
|
-
|
|
408
|
+
- 🟡 **黄色** \- 开发环境
|
|
253
409
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
410
|
+
- 🔴 **红色** \- 生产环境
|
|
411
|
+
|
|
412
|
+
点击按钮展开面板,点击对应环境即可实时切换。
|
|
413
|
+
|
|
414
|
+
## 🔧 API 接口
|
|
415
|
+
|
|
416
|
+
插件自动注册以下控制接口,可用于编程式切换:
|
|
257
417
|
|
|
258
|
-
|
|
259
|
-
npm version minor
|
|
418
|
+
### 获取当前环境
|
|
260
419
|
|
|
261
|
-
|
|
262
|
-
|
|
420
|
+
```Plain Text
|
|
421
|
+
GET /__mock_switch__/env
|
|
263
422
|
```
|
|
264
423
|
|
|
265
|
-
|
|
424
|
+
**响应:**
|
|
266
425
|
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
|
|
426
|
+
```json
|
|
427
|
+
{
|
|
428
|
+
"currentEnv": "mock",
|
|
429
|
+
"environments": [
|
|
430
|
+
{ "key": "mock", "name": "Mock环境", "target": null },
|
|
431
|
+
{ "key": "dev", "name": "开发环境", "target": "http://localhost:8080" },
|
|
432
|
+
{ "key": "prod", "name": "生产环境", "target": "https://api.example.com" }
|
|
433
|
+
]
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### 切换环境
|
|
438
|
+
|
|
439
|
+
```Plain Text
|
|
440
|
+
POST /__mock_switch__/env
|
|
441
|
+
Content-Type: application/json
|
|
270
442
|
|
|
271
|
-
|
|
272
|
-
|
|
443
|
+
{
|
|
444
|
+
"env": "dev"
|
|
445
|
+
}
|
|
273
446
|
```
|
|
274
447
|
|
|
275
448
|
## ❓ 常见问题
|
|
276
449
|
|
|
277
|
-
### Q:
|
|
278
|
-
A: 已发出的请求不会改变,新请求会走新环境。建议切换后刷新页面确保一致性。
|
|
450
|
+
### Q: CRA 热重载后环境状态丢失?
|
|
279
451
|
|
|
280
|
-
|
|
281
|
-
A: 检查 `hotReload: true`,确保 Mock 文件在配置的 `mockDir` 目录下。
|
|
452
|
+
A: 插件已内置全局状态持久化机制,使用 `createMockMiddleware` 即可自动处理。
|
|
282
453
|
|
|
283
|
-
### Q:
|
|
284
|
-
A: 需在 devServer 中配置 `devMiddleware: { writeToDisk: true }` 或添加 body-parser 中间件。
|
|
454
|
+
### Q: Mock 文件修改后不生效?
|
|
285
455
|
|
|
286
|
-
|
|
287
|
-
A: 目前支持精确匹配,动态路由建议使用 JS Mock 函数处理。
|
|
456
|
+
A: 确保 `hotReload: true`(默认开启),插件会自动清除 require 缓存。
|
|
288
457
|
|
|
289
|
-
|
|
458
|
+
### Q: POST 请求 body 为空?
|
|
290
459
|
|
|
291
|
-
|
|
292
|
-
- ✅ 首次发布
|
|
293
|
-
- ✅ 浏览器端环境切换面板
|
|
294
|
-
- ✅ Mock 数据热更新
|
|
295
|
-
- ✅ 真实接口自动记录
|
|
296
|
-
- ✅ 一键保存为 Mock 文件
|
|
297
|
-
- ✅ 自动路径匹配
|
|
460
|
+
A: 插件已内置 express\.json \(\) 和 urlencoded 解析中间件,无需额外配置。
|
|
298
461
|
|
|
299
|
-
|
|
462
|
+
### Q: 代理请求 404?
|
|
300
463
|
|
|
301
|
-
|
|
464
|
+
A: 插件会自动移除 `apiPrefix` 前缀,如 `/api/users` → `/users`,确保后端接口路径正确。
|
|
302
465
|
|
|
303
466
|
## 📄 License
|
|
304
467
|
|
|
305
|
-
MIT ©
|
|
468
|
+
MIT © [lebron\_shi](https://github.com/shilimingY)
|
|
469
|
+
|
|
470
|
+
---
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
**如果这个插件对你有帮助,欢迎给个 ⭐ Star**
|
|
475
|
+
|
|
476
|
+
[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.2.0",
|
|
4
4
|
"description": "前端Mock神器!浏览器一键切换Mock/开发/生产环境的Webpack插件,支持接口代理、Mock数据热更新、POST请求自动转发等特性,零配置接入React/Vue等所有Webpack项目,彻底告别需手动修改代码来切换环境的低效开发方式。",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|