mock-switch-webpack-plugin 1.1.1 → 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.
Files changed (2) hide show
  1. package/README.md +284 -200
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,305 +1,389 @@
1
- # Mock Switch Webpack Plugin
2
-
3
1
  <div align="center">
4
2
 
5
- ![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)
6
- ![Webpack](https://img.shields.io/badge/webpack-%3E%3D5.0.0-green.svg)
3
+ [![npm version](https://img.shields.io/npm/v/mock-switch-webpack-plugin)](https://www.npmjs.com/package/mock-switch-webpack-plugin)
7
4
  ![License](https://img.shields.io/badge/license-MIT-yellow.svg)
8
5
 
9
- **基于 webpack5 的开发环境接口 Mock 一键切换插件**
6
+ **基于 webpack 的开发环境 API Mock 与代理管理插件**
10
7
 
11
8
  </div>
12
9
 
13
- ## 特性
14
-
15
- ### 🎯 核心功能
16
- - **🔄 浏览器端一键切换** - 页面内悬浮面板,Mock / 测试 / 生产环境无缝切换
17
- - **🔥 Mock 数据热更新** - 修改 Mock 文件立即生效,无需重启服务
18
- - **📝 自动记录真实接口** - 代理请求时自动记录返回,一键保存为 Mock 文件
19
- - **📂 自动路径匹配** - 根据接口路径自动查找对应 Mock 文件
20
- - **⚡ 零侵入式设计** - 纯 webpack 插件,无需修改业务代码
10
+ 在前端开发中,频繁切换接口环境(Mock/开发/生产)往往需要修改代码或重启服务。本插件通过 Webpack 与中间件技术,实现了一键可视化环境切换,让开发调试变得前所未有的流畅与高效。
21
11
 
22
- ### 🎨 界面预览
23
- - 右下角悬浮切换按钮,状态指示灯(绿=Mock/黄=测试/红=生产)
24
- - 优雅的下拉面板,环境列表 + 已记录接口;
25
- - 点击即可保存真实接口返回为 Mock 文件
12
+ ## 核心特性
26
13
 
27
- ## 🆚 与其他方案对比
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 代码,自动配置路由,零配置即可体验;
28
23
 
29
- | 功能 | mock-switch-webpack-plugin | mocker-api | webpack-api-mocker | mockjs |
30
- |------|---------------------------|------------|-------------------|--------|
31
- | 浏览器端一键切换 | ✅ | ❌ | ❌ | ❌ |
32
- | Mock数据热更新 | ✅ | ✅ | ✅ | ❌ |
33
- | 自动记录真实接口 | ✅ | ❌ | ❌ | ❌ |
34
- | 一键保存为Mock | ✅ | ❌ | ❌ | ❌ |
35
- | 自动路径匹配 | ✅ | ✅ | ✅ | ❌ |
36
- | Webpack5支持 | ✅ | ✅ | ⚠️ | ❌ |
37
- | 零侵入集成 | ✅ | ⚠️ | ⚠️ | ❌ |
38
- | 动态Mock函数 | ✅ | ✅ | ✅ | ✅ |
39
- | 网络延迟模拟 | ✅ | ✅ | ❌ | ✅ |
24
+ ## 与其他方案VS对比
40
25
 
41
- > **为什么选择我们?** 现有方案都只解决了部分问题,本插件一站式解决「环境切换麻烦、Mock数据难维护、需要手动写Mock」三大痛点。
26
+ | 功能 | mock-switch-webpack-plugin | mocker-api | 其他 |
27
+ |------|---------------------------|------------|-------------------|
28
+ | 浏览器可视化一键切换 | ✅ | ❌ | ❌ |
29
+ | Mock数据热更新 | ✅ | ✅ | ❌需重启 |
30
+ | 环境持久化 | ✅ | ❌ | ❌ |
31
+ | POST Body 自动解析转发 | ✅ | ❌需手动 | ❌ 需手动 |
32
+ | CRA 完美支持 | ✅ | ❌ | ❌ |
42
33
 
43
- ## 📦 安装
34
+ ## 安装
44
35
 
45
36
  ```bash
46
37
  npm install mock-switch-webpack-plugin --save-dev
47
38
  # or
48
39
  yarn add mock-switch-webpack-plugin -D
49
- # or
50
- pnpm add mock-switch-webpack-plugin -D
51
40
  ```
52
41
 
53
- ## 🚀 快速开始
42
+ ## 使用
54
43
 
55
- ### 1. 配置 webpack.config.js
44
+ ### 方式一:原生 Webpack 项目
45
+
46
+ **webpack\.config\.js**
56
47
 
57
48
  ```javascript
58
- const WebpackMockSwitchPlugin = require('mock-switch-webpack-plugin');
49
+ const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
59
50
 
60
51
  module.exports = {
61
52
  // ... 其他配置
62
53
  plugins: [
63
- new WebpackMockSwitchPlugin({
64
- // Mock文件目录(相对项目根目录)
54
+ new MockSwitchWebpackPlugin({
65
55
  mockDir: './mock',
66
- // 接口前缀,只拦截该前缀的请求
67
56
  apiPrefix: '/api',
68
- // 环境配置
69
57
  environments: {
70
- mock: { name: 'Mock环境', target: null },
71
- test: { name: '测试环境', target: 'http://localhost:3000' },
72
- prod: { name: '生产环境', target: 'https://api.yourdomain.com' }
73
- },
74
- // 自动记录真实接口返回
75
- autoRecord: true,
76
- // 开启热更新
77
- hotReload: true
58
+ dev: {
59
+ name: '开发环境',
60
+ target: 'http://localhost:8080'
61
+ },
62
+ prod: {
63
+ name: '生产环境',
64
+ target: 'https://api.example.com'
65
+ }
66
+ }
78
67
  })
79
- ],
80
- devServer: {
81
- // 插件会自动注入中间件,无需额外配置
82
- hot: true,
83
- open: true
84
- }
68
+ ]
85
69
  };
86
70
  ```
87
71
 
88
- ### 2. 创建 Mock 文件
72
+ ### 方式二:CRA \(Create React App\) 项目
89
73
 
90
- 在项目根目录创建 `mock` 文件夹,按以下命名规则创建文件:
74
+ CRA 项目需要同时配置 **webpack\.config\.js** 和 **setupProxy\.js** 两个文件。
91
75
 
92
- ```
93
- mock/
94
- ├── GET_user_list.json # GET /api/user/list
95
- ├── POST_user_login.js # POST /api/user/login
96
- ├── GET_user_1_detail.json # GET /api/user/1/detail
97
- └── config.js # 其他配置
98
- ```
76
+ #### 步骤 1:配置 webpack\.config\.js
99
77
 
100
- #### 静态 Mock (JSON)
101
78
 
102
- ```json
103
- // mock/GET_user_list.json
104
- {
105
- "code": 0,
106
- "message": "success",
107
- "data": {
108
- "list": [
109
- { "id": 1, "name": "张三" },
110
- { "id": 2, "name": "李四" }
79
+ **webpack\.config\.js**
80
+
81
+ ```javascript
82
+ const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
83
+
84
+ module.exports = {
85
+ webpack: {
86
+ plugins: [
87
+ new MockSwitchWebpackPlugin({
88
+ autoRegisterMiddleware: false, // CRA 必须设为 false
89
+ })
111
90
  ]
112
- },
113
- "_delay": 500
114
- }
91
+ }
92
+ };
115
93
  ```
116
94
 
117
- #### 动态 Mock (JS 函数)
95
+ > 💡 **作用**:向打包输出注入客户端 UI 代码,实现浏览器右下角的环境切换悬浮面板。
96
+ >
97
+ >
98
+
99
+ #### 步骤 2:配置 src/setupProxy\.js
100
+
101
+ **src/setupProxy\.js**
118
102
 
119
103
  ```javascript
120
- // mock/POST_user_login.js
121
- module.exports = function(req, res) {
122
- const { username, password } = req.body;
123
-
124
- if (username === 'admin' && password === '123456') {
125
- return {
126
- code: 0,
127
- message: '登录成功',
128
- data: { token: 'mock_' + Date.now() }
129
- };
104
+ const { createMockMiddleware } = require('mock-switch-webpack-plugin');
105
+
106
+ module.exports = function(app) {
107
+ createMockMiddleware(app, {
108
+ mockDir: './mock',
109
+ apiPrefix: '/api',
110
+ environments: {
111
+ dev: {
112
+ name: '开发环境',
113
+ target: 'http://localhost:8080'
114
+ },
115
+ prod: {
116
+ name: '生产环境',
117
+ target: 'https://api.example.com'
118
+ }
119
+ }
120
+ });
121
+ };
122
+ ```
123
+
124
+ > 💡 **setupProxy\.js 作用说明**:
125
+ >
126
+ > - CRA 开发服务器启动时自动加载此文件;
127
+ >
128
+ > - 用于注册 Express 中间件,接管 API 请求;
129
+ >
130
+ > - 实现 Mock 数据返回与代理转发逻辑;
131
+ >
132
+ > - 使用单例模式,解决 CRA 热重载导致的重复实例问题;
133
+ >
134
+ >
135
+
136
+ ### 方式三:Vue CLI 项目
137
+
138
+ **vue\.config\.js**
139
+
140
+ ```javascript
141
+ const MockSwitchWebpackPlugin = require('mock-switch-webpack-plugin');
142
+
143
+ module.exports = {
144
+ configureWebpack: {
145
+ plugins: [
146
+ new MockSwitchWebpackPlugin({
147
+ // 配置项
148
+ })
149
+ ]
130
150
  }
131
-
132
- return {
133
- code: 401,
134
- message: '用户名或密码错误'
135
- };
136
151
  };
137
152
  ```
138
153
 
139
- ### 3. 启动开发服务
154
+ ### 启动开发服务
140
155
 
141
156
  ```bash
142
157
  npm run start
143
158
  ```
144
159
 
145
- 打开浏览器,你会看到右下角的悬浮切换按钮 🎉
160
+ - 打开浏览器,你会看到右下角的悬浮切换按钮
161
+ - 点击按钮展开控制面板,实现环境实时切换 🎉
162
+
163
+ ## 配置说明
164
+ ### 完整配置项
165
+
166
+ ```javascript
167
+ new MockSwitchWebpackPlugin({
168
+ /**
169
+ * Mock 文件存放目录
170
+ * @default './mock'
171
+ */
172
+ mockDir: './mock',
173
+
174
+ /**
175
+ * API 请求前缀
176
+ * @default '/api'
177
+ */
178
+ apiPrefix: '/api',
179
+
180
+ /**
181
+ * 是否启用 Mock 文件热更新
182
+ * @default true
183
+ */
184
+ hotReload: true,
185
+
186
+ /**
187
+ * 是否自动注册 DevServer 中间件
188
+ * @default true
189
+ * CRA 项目请设为 false,使用 createMockMiddleware
190
+ */
191
+ autoRegisterMiddleware: true,
192
+
193
+ /**
194
+ * 环境配置
195
+ * 内置 mock/dev/prod 三个环境,可自定义名称和目标地址
196
+ */
197
+ environments: {
198
+ mock: {
199
+ name: 'Mock环境',
200
+ target: null // null 表示使用本地Mock文件
201
+ },
202
+ dev: {
203
+ name: '开发环境',
204
+ target: 'http://localhost:8080'
205
+ },
206
+ prod: {
207
+ name: '生产环境',
208
+ target: 'https://api.example.com'
209
+ }
210
+ }
211
+ })
212
+ ```
213
+
214
+ ### environments 配置详解
146
215
 
147
- ## ⚙️ 配置选项
216
+ 每个环境配置包含:
148
217
 
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` | 控制面板端口 |
218
+ |参数|类型|说明|
219
+ |---|---|---|
220
+ |`name`|string|环境名称|
221
+ |`target`|string \| null|代理目标地址,null 表示使用 Mock|
157
222
 
158
- ### environments 默认配置
223
+ **示例:自定义环境**
159
224
 
160
225
  ```javascript
161
- {
162
- mock: { name: 'Mock环境', target: null }, // 本地Mock
163
- test: { name: '测试环境', target: 'http://localhost:3000' },
164
- prod: { name: '生产环境', target: 'https://api.example.com' }
226
+ environments: {
227
+ mock: { name: 'Mock环境', target: null },
228
+ dev: { name: '开发环境', target: 'http://dev-api.example.com' },
229
+ prod: { name: '🔴 生产环境', target: 'https://api.example.com' }
165
230
  }
166
231
  ```
232
+ ### setupProxy\.js 配置详解(CRA 专用)
233
+
234
+ #### 什么是 setupProxy\.js?
167
235
 
168
- ## 📖 使用指南
236
+ `setupProxy.js` **Create React App** 官方约定的代理配置文件,位于 `src/` 目录下,CRA 开发服务器启动时会**自动加载**此文件。
169
237
 
170
- ### 1. 环境切换
238
+ #### createMockMiddleware 函数参数
171
239
 
172
- 1. 点击右下角悬浮按钮打开面板
173
- 2. 点击对应环境即可切换
174
- 3. 状态指示灯会变色(绿/黄/红)
175
- 4. 后续请求自动走对应环境
240
+ ```javascript
241
+ createMockMiddleware(app, options)
242
+ ```
176
243
 
177
- ### 2. 自动记录 & 保存 Mock
244
+ |参数|类型|说明|
245
+ |---|---|---|
246
+ |`app`|Express|Express 应用实例,由 CRA 传入|
247
+ |`options`|Object|配置选项,与插件构造函数参数一致|
178
248
 
179
- 1. 切换到测试/生产环境
180
- 2. 正常调用接口(插件会自动记录返回)
181
- 3. 打开面板,在「已记录的接口」列表中
182
- 4. 点击「保存」按钮,自动生成 Mock 文件
249
+ ## Mock 文件规范
183
250
 
184
- ### 3. Mock 文件匹配规则
251
+ ### 目录结构
252
+
253
+ ```Plain Text
254
+ your-project/
255
+ ├── mock/
256
+ │ ├── GET_users.json # GET /api/users
257
+ │ ├── POST_users.js # POST /api/users
258
+ │ ├── GET_users_1.json # GET /api/users/1
259
+ │ └── GET_users_1_orders.js # GET /api/users/1/orders
260
+ └── src/
261
+ ```
262
+
263
+ ### 文件命名规则
185
264
 
186
265
  插件会按以下优先级查找 Mock 文件:
187
266
 
188
- 1. `{METHOD}_{path}.json` - `GET_user_list.json`
189
- 2. `{path}.json` - 如 `user_list.json`
190
- 3. `{METHOD}_{path}.js` - `GET_user_list.js`
191
- 4. `{path}.js` - 如 `user_list.js`
192
- 5. 目录结构匹配 - `/mock/user/list.json`
267
+ 1. `{METHOD}_{path}.json` \- 带方法的 JSON 文件
268
+
269
+ 2. `{path}.json` \- 不带方法的 JSON 文件
270
+
271
+ 3. `{METHOD}_{path}.js` \- 带方法的 JS 文件
193
272
 
194
- > 💡 提示:路径中的 `/` 会自动转换为 `_`
273
+ 4. `{path}.js` \- 不带方法的 JS 文件
195
274
 
196
- ### 4. 高级功能
275
+ > `path` 中的 `/` 会被替换为 `_`
276
+ >
277
+ >
197
278
 
198
- #### 模拟网络延迟
279
+ ### 静态 Mock \(JSON 文件\)
199
280
 
200
- 在 JSON 中添加 `_delay` 字段:
281
+ **mock/GET\_users\.json**
201
282
 
202
283
  ```json
203
284
  {
204
285
  "code": 0,
205
- "data": {},
206
- "_delay": 1000 // 延迟1秒返回
286
+ "message": "success",
287
+ "data": [
288
+ { "id": 1, "name": "张三" },
289
+ { "id": 2, "name": "李四" }
290
+ ],
291
+ "_delay": 500
207
292
  }
208
293
  ```
209
294
 
210
- #### 动态 Mock 函数
295
+ ### 动态 Mock \(JS 文件\)
211
296
 
212
- JS 文件导出函数,可访问 req/res 对象:
297
+ **mock/POST\_users\.js**
213
298
 
214
299
  ```javascript
215
- module.exports = async (req, res) => {
216
- // 获取查询参数
217
- const { page, size } = req.query;
218
-
219
- // 获取请求体
220
- const body = req.body;
221
-
222
- // 自定义响应头
223
- res.setHeader('X-Custom-Header', 'mock');
300
+ module.exports = function(req, res) {
301
+ // 可以访问请求参数
302
+ const { name, age } = req.body;
224
303
 
304
+ // 返回动态数据
225
305
  return {
226
306
  code: 0,
227
- data: { page, size }
307
+ message: 'success',
308
+ data: {
309
+ id: Date.now(),
310
+ name,
311
+ age,
312
+ createdAt: new Date().toISOString()
313
+ },
314
+ _delay: 300 // 模拟网络延迟(毫秒)
228
315
  };
229
316
  };
230
317
  ```
231
318
 
232
- ## 🔧 打包发布流程
233
-
234
- ### 1. 发布到 npm
235
-
236
- ```bash
237
- # 1. 登录 npm
238
- npm login
239
-
240
- # 2. 检查 package.json 配置
241
- # - name: 包名(需唯一)
242
- # - version: 语义化版本号
243
- # - main: 入口文件
244
-
245
- # 3. 发布
246
- npm publish
247
-
248
- # 发布私有包
249
- npm publish --access public
250
- ```
251
-
252
- ### 2. 版本管理
319
+ ### 特殊字段 `_delay`
253
320
 
254
- ```bash
255
- # 补丁版本更新 (1.0.0 -> 1.0.1)
256
- npm version patch
321
+ 在返回数据中添加 `_delay` 字段可以模拟网络延迟:
257
322
 
258
- # 次版本更新 (1.0.0 -> 1.1.0)
259
- npm version minor
260
-
261
- # 主版本更新 (1.0.0 -> 2.0.0)
262
- npm version major
323
+ ```json
324
+ {
325
+ "code": 0,
326
+ "data": {},
327
+ "_delay": 1000 // 延迟 1 秒返回
328
+ }
263
329
  ```
264
330
 
265
- ### 3. 本地测试
266
331
 
267
- ```bash
268
- # 在插件目录
269
- npm link
270
332
 
271
- # 在测试项目
272
- npm link mock-switch-webpack-plugin
273
- ```
274
333
 
275
- ## ❓ 常见问题
276
334
 
277
- ### Q: 为什么切换环境后需要刷新页面?
278
- A: 已发出的请求不会改变,新请求会走新环境。建议切换后刷新页面确保一致性。
279
335
 
280
- ### Q: Mock 热更新不生效?
281
- A: 检查 `hotReload: true`,确保 Mock 文件在配置的 `mockDir` 目录下。
336
+ ### 2. 创建 Mock 文件
282
337
 
283
- ### Q: 如何处理 body 参数?
284
- A: 需在 devServer 中配置 `devMiddleware: { writeToDisk: true }` 或添加 body-parser 中间件。
338
+ 在项目根目录创建 `mock` 文件夹,按以下命名规则创建文件:
285
339
 
286
- ### Q: 支持 RESTful 动态路由吗?
287
- A: 目前支持精确匹配,动态路由建议使用 JS Mock 函数处理。
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 # 其他配置
346
+ ```
288
347
 
289
- ## 📝 更新日志
348
+ #### 静态 Mock (JSON)
290
349
 
291
- ### v1.0.0 (2024-06-15)
292
- - ✅ 首次发布
293
- - ✅ 浏览器端环境切换面板
294
- - ✅ Mock 数据热更新
295
- - ✅ 真实接口自动记录
296
- - ✅ 一键保存为 Mock 文件
297
- - ✅ 自动路径匹配
350
+ ```json
351
+ // mock/GET_user_list.json
352
+ {
353
+ "code": 0,
354
+ "message": "success",
355
+ "data": {
356
+ "list": [
357
+ { "id": 1, "name": "张三" },
358
+ { "id": 2, "name": "李四" }
359
+ ]
360
+ },
361
+ "_delay": 500
362
+ }
363
+ ```
298
364
 
299
- ## 🤝 贡献
365
+ #### 动态 Mock (JS)
300
366
 
301
- 欢迎提交 Issue 和 Pull Request!
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
+ };
385
+ ```
302
386
 
303
- ## 📄 License
387
+ **如果这个插件对你有帮助,欢迎给个 Star 哦!!!**
304
388
 
305
- MIT © Webpack Mock Switch Team
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.1.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": {