rspack-plugin-mock 1.3.0 → 2.1.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 +413 -67
- package/README.zh-CN.md +412 -67
- package/dist/{helper.d.mts → helper.d.ts} +46 -8
- package/dist/helper.js +267 -0
- package/dist/{types-Bt_OTa7I.d.mts → index-BMMGM-eD.d.ts} +537 -172
- package/dist/index.d.ts +16 -0
- package/dist/index.js +87 -0
- package/dist/json5-loader.mjs +8 -0
- package/dist/logger-CzeuHKAL.js +1563 -0
- package/dist/options-CI0LRpJZ.js +487 -0
- package/dist/rsbuild.d.ts +8 -0
- package/dist/rsbuild.js +80 -0
- package/dist/server-pC78IYdH.d.ts +113 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +2 -0
- package/package.json +38 -34
- package/dist/helper.mjs +0 -4
- package/dist/index.d.mts +0 -13
- package/dist/index.mjs +0 -1
- package/dist/json5-loader.cjs +0 -1
- package/dist/options-BUfaThYe.mjs +0 -43
- package/dist/rsbuild.d.mts +0 -7
- package/dist/rsbuild.mjs +0 -1
- package/dist/server-4ETytB7L.d.mts +0 -89
- package/dist/server.d.mts +0 -3
- package/dist/server.mjs +0 -1
- package/dist/ws-BM06pHhL.mjs +0 -1
package/README.zh-CN.md
CHANGED
|
@@ -10,18 +10,23 @@
|
|
|
10
10
|
<img alt="npm peer dependency version" src="https://img.shields.io/npm/dependency-version/rspack-plugin-mock/peer/@rspack/core?style=flat-square&colorA=564341&colorB=EDED91&label=rspack">
|
|
11
11
|
<img alt="npm peer dependency version" src="https://img.shields.io/npm/dependency-version/rspack-plugin-mock/peer/@rsbuild/core?style=flat-square&colorA=564341&colorB=EDED91&label=rsbuild">
|
|
12
12
|
<img alt="npm" src="https://img.shields.io/npm/dm/rspack-plugin-mock?style=flat-square&colorA=564341&colorB=EDED91">
|
|
13
|
-
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/pengzhanbo/rspack-plugin-mock/
|
|
13
|
+
<img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/pengzhanbo/rspack-plugin-mock/release.yaml?style=flat-square&colorA=564341&colorB=EDED91">
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
17
17
|
<a href="./README.md">English</a> | <span>简体中文</span>
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
|
+
> [!IMPORTANT]
|
|
21
|
+
> 从插件 2.0 版本开始,仅支持 `rspack@2.x` 版本 和 `rsbuild@2.x` 版本.
|
|
22
|
+
>
|
|
23
|
+
> 如果您使用的是 `rspack@1.x` 或 `rsbuild@1.x` 版本,请使用 `rspack-plugin-mock@1.x` 版本.
|
|
24
|
+
|
|
20
25
|
## 特性
|
|
21
26
|
|
|
22
27
|
- ⚡️ 轻量,灵活,快速
|
|
23
28
|
- 🧲 非注入式,对客户端代码无侵入
|
|
24
|
-
- 💡 ESModule
|
|
29
|
+
- 💡 ESModule
|
|
25
30
|
- 🦾 Typescript
|
|
26
31
|
- 🔥 热更新
|
|
27
32
|
- 🏷 支持 `.[cm]?js`/ `.ts` / `json` / `json5` 编写 mock 数据
|
|
@@ -36,6 +41,7 @@
|
|
|
36
41
|
- 📤 支持 multipart 类型,模拟文件上传
|
|
37
42
|
- 📥 支持模拟文件下载
|
|
38
43
|
- ⚜️ 支持模拟 `WebSocket` 和 `Server-Sent Events`
|
|
44
|
+
- 📝 支持 **请求录制** 和 **请求回放**
|
|
39
45
|
- 🗂 支持构建可独立部署的小型mock服务
|
|
40
46
|
|
|
41
47
|
## 安装
|
|
@@ -206,7 +212,13 @@ export default defineMock({
|
|
|
206
212
|
|
|
207
213
|
## 插件配置
|
|
208
214
|
|
|
209
|
-
|
|
215
|
+
- **类型:** `boolean`
|
|
216
|
+
- **默认值:** `true`
|
|
217
|
+
- **详情:**
|
|
218
|
+
|
|
219
|
+
是否开启 mock 服务。如果设置为 `false`,插件将不会生效。
|
|
220
|
+
|
|
221
|
+
### prefix
|
|
210
222
|
|
|
211
223
|
- **类型:** `string | string[]`
|
|
212
224
|
- **详情:**
|
|
@@ -214,7 +226,7 @@ export default defineMock({
|
|
|
214
226
|
为 http mock 服务配置 路径匹配规则,任何请求路径以 prefix 开头的都将被拦截代理。
|
|
215
227
|
如果 prefix 以 `^` 开头,将被识别为 `RegExp`。
|
|
216
228
|
|
|
217
|
-
###
|
|
229
|
+
### wsPrefix
|
|
218
230
|
|
|
219
231
|
- **类型:** `string | string[]`
|
|
220
232
|
- **详情:**
|
|
@@ -224,7 +236,7 @@ export default defineMock({
|
|
|
224
236
|
|
|
225
237
|
请避免在 `devServer.proxy` / `server.proxy` 中出现 `wsPrefix` 配置中相同的规则,因为这可能会导致规则冲突。
|
|
226
238
|
|
|
227
|
-
###
|
|
239
|
+
### cwd
|
|
228
240
|
|
|
229
241
|
- **类型:** `string`
|
|
230
242
|
- **默认值:** `process.cwd()`
|
|
@@ -232,31 +244,31 @@ export default defineMock({
|
|
|
232
244
|
|
|
233
245
|
配置 `include` 和 `exclude` 的匹配上下文。
|
|
234
246
|
|
|
235
|
-
###
|
|
247
|
+
### dir
|
|
236
248
|
|
|
237
249
|
- **类型:** `string`
|
|
238
|
-
- **默认值:** `mock` (相对于 [`
|
|
250
|
+
- **默认值:** `mock` (相对于 [`cwd`](#cwd))
|
|
239
251
|
- **详情:**
|
|
240
252
|
|
|
241
|
-
配置 mock 包的输出目录,相对于 [`
|
|
253
|
+
配置 mock 包的输出目录,相对于 [`cwd`](#cwd)
|
|
242
254
|
|
|
243
|
-
###
|
|
255
|
+
### include
|
|
244
256
|
|
|
245
257
|
- **类型:** `string | string[]`
|
|
246
|
-
- **默认值:** `[**/*.mock.{js,ts,cjs,mjs,json,json5}']` (相对于 [`
|
|
258
|
+
- **默认值:** `[**/*.mock.{js,ts,cjs,mjs,json,json5}']` (相对于 [`dir`](#dir))
|
|
247
259
|
- **详情:**
|
|
248
260
|
|
|
249
261
|
glob 字符串匹配 mock 包含的文件。 查看 [picomatch](https://github.com/micromatch/picomatch#globbing-features)
|
|
250
262
|
|
|
251
|
-
###
|
|
263
|
+
### exclude
|
|
252
264
|
|
|
253
265
|
- **类型:** `string | string[]`
|
|
254
|
-
- **默认值:** `[]` (相对于 [`
|
|
266
|
+
- **默认值:** `[]` (相对于 [`dir`](#dir))
|
|
255
267
|
- **详情:**
|
|
256
268
|
|
|
257
269
|
glob 字符串匹配 mock 排除的文件。 查看 [picomatch](https://github.com/micromatch/picomatch#globbing-features)
|
|
258
270
|
|
|
259
|
-
###
|
|
271
|
+
### log
|
|
260
272
|
|
|
261
273
|
- **类型:** `boolean | 'info' | 'warn' | 'error' | 'silent' | 'debug'`
|
|
262
274
|
- **默认值:** `info`
|
|
@@ -264,7 +276,7 @@ export default defineMock({
|
|
|
264
276
|
|
|
265
277
|
开启日志,或配置 日志级别
|
|
266
278
|
|
|
267
|
-
###
|
|
279
|
+
### reload
|
|
268
280
|
|
|
269
281
|
- **类型:** `boolean`
|
|
270
282
|
- **默认值:** `false`
|
|
@@ -273,7 +285,17 @@ export default defineMock({
|
|
|
273
285
|
mock资源热更新时,仅更新了数据内容,但是默认不重新刷新页面。
|
|
274
286
|
当你希望每次修改mock文件都刷新页面时,可以打开此选项。
|
|
275
287
|
|
|
276
|
-
###
|
|
288
|
+
### activeScene
|
|
289
|
+
|
|
290
|
+
- **类型:** `string | string[]`
|
|
291
|
+
- **默认值:** `''`
|
|
292
|
+
- **详情:**
|
|
293
|
+
|
|
294
|
+
当前激活的场景,用于过滤 mock。
|
|
295
|
+
|
|
296
|
+
只有 [`scene`](#optionsscene) 与此有交集的 mock(或未配置 `scene` 的 mock)才会被考虑匹配。可通过 `X-Mock-Scene` 请求头按请求覆盖。
|
|
297
|
+
|
|
298
|
+
### cors
|
|
277
299
|
|
|
278
300
|
- **类型:** `boolean | CorsOptions`
|
|
279
301
|
- **默认值:** `true`
|
|
@@ -281,7 +303,7 @@ export default defineMock({
|
|
|
281
303
|
|
|
282
304
|
配置 [cors](https://github.com/expressjs/cors#configuration-options)
|
|
283
305
|
|
|
284
|
-
###
|
|
306
|
+
### formidableOptions
|
|
285
307
|
|
|
286
308
|
- **类型:** `FormidableOptions`
|
|
287
309
|
- **默认值:** `{ multiples: true }`
|
|
@@ -289,21 +311,21 @@ export default defineMock({
|
|
|
289
311
|
|
|
290
312
|
配置 [formidable](https://github.com/node-formidable/formidable#options)
|
|
291
313
|
|
|
292
|
-
###
|
|
314
|
+
### cookiesOptions
|
|
293
315
|
|
|
294
316
|
- **类型:** `CookiesOptions`
|
|
295
317
|
- **详情:**
|
|
296
318
|
|
|
297
319
|
配置 [cookies](https://github.com/pillarjs/cookies#new-cookiesrequest-response--options)
|
|
298
320
|
|
|
299
|
-
###
|
|
321
|
+
### bodyParserOptions
|
|
300
322
|
|
|
301
323
|
- **类型:** `BodyParserOptions`
|
|
302
324
|
- **详情:**
|
|
303
325
|
|
|
304
326
|
配置 [co-body](https://github.com/cojs/co-body#options)
|
|
305
327
|
|
|
306
|
-
##
|
|
328
|
+
## build
|
|
307
329
|
|
|
308
330
|
- **类型:** `boolean | ServerBuildOption`
|
|
309
331
|
|
|
@@ -333,8 +355,147 @@ export default defineMock({
|
|
|
333
355
|
|
|
334
356
|
当需要构建一个小型mock服务时,可配置此项。插件会在构建生产包时,额外生成一个可部署的node mock 服务包。
|
|
335
357
|
|
|
358
|
+
### record
|
|
359
|
+
|
|
360
|
+
- **类型:** `false | RecordOptions`
|
|
361
|
+
- **默认值:** `false`
|
|
362
|
+
- **详情:**
|
|
363
|
+
|
|
364
|
+
是否开启请求录制功能。开启后,插件会记录所有请求数据,用于后续的请求回放。
|
|
365
|
+
|
|
366
|
+
插件在 `proxy` 的基础上,记录被 `http-proxy` 代理的请求数据。
|
|
367
|
+
在获得响应后,插件会将请求数据和响应数据记录到指定的目录中。
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
interface RecordOptions {
|
|
371
|
+
/**
|
|
372
|
+
* 是否启用录制功能
|
|
373
|
+
* - true: 启用,自动录制 proxy 响应
|
|
374
|
+
* - false: 禁用(默认)
|
|
375
|
+
* @default false
|
|
376
|
+
*/
|
|
377
|
+
enabled?: boolean
|
|
378
|
+
/**
|
|
379
|
+
* 过滤要录制的请求
|
|
380
|
+
* - 函数:自定义过滤函数,返回 true 表示录制
|
|
381
|
+
* - 对象:包含/排除模式,支持 glob 或 path-to-regexp 模式
|
|
382
|
+
* @example
|
|
383
|
+
* ```ts
|
|
384
|
+
* // Record all requests
|
|
385
|
+
* filter: (req) => true
|
|
386
|
+
* // Record requests using glob pattern
|
|
387
|
+
* filter: { mode: 'glob', include: '/api/**' }
|
|
388
|
+
* // Record requests using path-to-regexp pattern
|
|
389
|
+
* filter: { mode: 'path-to-regexp', include: '/api/:id' }
|
|
390
|
+
* ```
|
|
391
|
+
*/
|
|
392
|
+
filter?: ((req: RecordedReq) => boolean) | {
|
|
393
|
+
/**
|
|
394
|
+
* 包含需要录制的请求链接
|
|
395
|
+
*
|
|
396
|
+
* glob 模式或 path-to-regexp 模式
|
|
397
|
+
* (使用 mode 选项设置模式,默认为 glob)
|
|
398
|
+
*/
|
|
399
|
+
include?: string | string[]
|
|
400
|
+
/**
|
|
401
|
+
* 排除不需要录制的请求链接
|
|
402
|
+
*
|
|
403
|
+
* glob 模式或 path-to-regexp 模式
|
|
404
|
+
* (使用 mode 选项设置模式,默认为 glob)
|
|
405
|
+
*/
|
|
406
|
+
exclude?: string | string[]
|
|
407
|
+
/**
|
|
408
|
+
* 包含/排除模式的匹配模式
|
|
409
|
+
* - 'glob': glob 模式匹配(默认)
|
|
410
|
+
* - 'path-to-regexp': path-to-regexp 模式匹配
|
|
411
|
+
*/
|
|
412
|
+
mode: 'glob' | 'path-to-regexp'
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* 录制数据存储目录
|
|
416
|
+
* 相对于项目根目录
|
|
417
|
+
* @default 'mock/.recordings'
|
|
418
|
+
*/
|
|
419
|
+
dir?: string
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* 是否覆盖已有录制数据
|
|
423
|
+
* - true: 相同请求覆盖旧数据(默认)
|
|
424
|
+
* - false: 保留旧数据,不录制新数据
|
|
425
|
+
* @default true
|
|
426
|
+
*/
|
|
427
|
+
overwrite?: boolean
|
|
428
|
+
/**
|
|
429
|
+
* 录制数据过期时间(秒)
|
|
430
|
+
* - 0: 永不过期(默认)
|
|
431
|
+
* - 正数:指定秒数后过期
|
|
432
|
+
* @default 0
|
|
433
|
+
*/
|
|
434
|
+
expires?: number
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* 要录制的状态码
|
|
438
|
+
* - 为空数组时记录所有状态码(默认)
|
|
439
|
+
* - 指定一个或多个状态码进行过滤
|
|
440
|
+
* @default []
|
|
441
|
+
*/
|
|
442
|
+
status?: number | number[]
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* 是否在录制目录中添加 .gitignore
|
|
446
|
+
* - true: 添加(默认)
|
|
447
|
+
* - false: 不添加
|
|
448
|
+
* @default true
|
|
449
|
+
*/
|
|
450
|
+
gitignore?: boolean
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### replay
|
|
455
|
+
|
|
456
|
+
- **类型:** `boolean`
|
|
457
|
+
- **默认值:** `false`
|
|
458
|
+
- **详情:**
|
|
459
|
+
|
|
460
|
+
是否开启请求回放功能。开启后,插件会根据记录的请求数据,模拟响应。
|
|
461
|
+
|
|
462
|
+
### priority
|
|
463
|
+
|
|
464
|
+
- **类型:** `MockMatchPriority`
|
|
465
|
+
- **详情:**
|
|
466
|
+
|
|
467
|
+
自定义 路径匹配规则优先级。[查看更多](#自定义匹配优先级)
|
|
468
|
+
|
|
469
|
+
**默认值:** `undefined`
|
|
470
|
+
|
|
336
471
|
## Mock 配置
|
|
337
472
|
|
|
473
|
+
**http mock**
|
|
474
|
+
|
|
475
|
+
```ts
|
|
476
|
+
import { defineMock } from 'rspack-plugin-mock/helper'
|
|
477
|
+
export default defineMock({
|
|
478
|
+
url: '/api/test',
|
|
479
|
+
body: { message: 'hello world' }
|
|
480
|
+
})
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
**websocket mock**
|
|
484
|
+
|
|
485
|
+
```ts
|
|
486
|
+
import { defineMock } from 'rspack-plugin-mock/helper'
|
|
487
|
+
|
|
488
|
+
export default defineMock({
|
|
489
|
+
url: '/socket.io',
|
|
490
|
+
ws: true,
|
|
491
|
+
setup(wss) {
|
|
492
|
+
wss.on('connection', (ws, req) => {
|
|
493
|
+
console.log('connected')
|
|
494
|
+
})
|
|
495
|
+
}
|
|
496
|
+
})
|
|
497
|
+
```
|
|
498
|
+
|
|
338
499
|
### options.url
|
|
339
500
|
|
|
340
501
|
- **类型:** `string`
|
|
@@ -351,6 +512,17 @@ export default defineMock({
|
|
|
351
512
|
是否启动对该接口的mock,在多数场景下,我们仅需要对部分接口进行 mock,
|
|
352
513
|
而不是对所有配置了mock的请求进行全量mock,所以是否能够配置是否启用很重要
|
|
353
514
|
|
|
515
|
+
### options.scene
|
|
516
|
+
|
|
517
|
+
- **类型:** `string | string[]`
|
|
518
|
+
- **默认值:** `''`
|
|
519
|
+
- **详情:**
|
|
520
|
+
|
|
521
|
+
该 mock 的场景标识。
|
|
522
|
+
|
|
523
|
+
未配置时,该 mock 为全场景通用,不受 [activeScene](#activescene) 限制。
|
|
524
|
+
配置后,只有 `scene` 中任意一项与 [activeScene](#activescene) 中任意一项匹配时,该 mock 才会激活。
|
|
525
|
+
|
|
354
526
|
### options.method
|
|
355
527
|
|
|
356
528
|
- **类型:** `Method | Method[]`
|
|
@@ -508,59 +680,183 @@ interface WebSocketSetupContext {
|
|
|
508
680
|
}
|
|
509
681
|
```
|
|
510
682
|
|
|
511
|
-
###
|
|
683
|
+
### options.error
|
|
512
684
|
|
|
513
|
-
|
|
514
|
-
|
|
685
|
+
- **类型:** `MockErrorConfig | undefined`
|
|
686
|
+
- **详情:**
|
|
515
687
|
|
|
516
|
-
|
|
517
|
-
/**
|
|
518
|
-
* 设置响应体 cookies
|
|
519
|
-
* @see [cookies](https://github.com/pillarjs/cookies#cookiessetname--values--options)
|
|
520
|
-
*/
|
|
521
|
-
setCookie: (
|
|
522
|
-
name: string,
|
|
523
|
-
value?: string | null,
|
|
524
|
-
option?: Cookies.SetOption,
|
|
525
|
-
) => void
|
|
526
|
-
}
|
|
688
|
+
配置错误模拟,包括错误概率、错误状态码、错误状态文本、以及自定义错误响应体。
|
|
527
689
|
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
* 请求地址中位于 `?` 后面的 queryString,已解析为 json
|
|
531
|
-
*/
|
|
532
|
-
query: Record<string, any>
|
|
533
|
-
/**
|
|
534
|
-
* 请求 referer 中位于 `?` 后面的 queryString,已解析为 json
|
|
535
|
-
*/
|
|
536
|
-
refererQuery: Record<string, any>
|
|
690
|
+
```ts
|
|
691
|
+
interface MockErrorConfig {
|
|
537
692
|
/**
|
|
538
|
-
*
|
|
693
|
+
* 错误概率(0-1),默认 0.5
|
|
694
|
+
* @default 0.5
|
|
539
695
|
*/
|
|
540
|
-
|
|
696
|
+
probability?: number
|
|
541
697
|
/**
|
|
542
|
-
*
|
|
698
|
+
* 错误状态码,默认 500
|
|
699
|
+
* @default 500
|
|
543
700
|
*/
|
|
544
|
-
|
|
701
|
+
status?: number
|
|
545
702
|
/**
|
|
546
|
-
*
|
|
703
|
+
* 错误状态文本
|
|
547
704
|
*/
|
|
548
|
-
|
|
705
|
+
statusText?: string
|
|
549
706
|
/**
|
|
550
|
-
*
|
|
551
|
-
* @
|
|
707
|
+
* 自定义错误响应体,适用于 status 为 200,但响应体需要模拟错误场景
|
|
708
|
+
* @example
|
|
709
|
+
* { code: 500, msg: 'Internal Server Error', result: null }
|
|
552
710
|
*/
|
|
711
|
+
body?: ResponseBody | ResponseBodyFn
|
|
712
|
+
}
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
### Request/Response 增强
|
|
716
|
+
|
|
717
|
+
当你配置 `headers`, `body`, and `response` 的函数形式时, 插件在参数 `request` 和 `response` 添加了新的内容用于帮助获取必要的数据.
|
|
718
|
+
|
|
719
|
+
**Request:**
|
|
720
|
+
|
|
721
|
+
`request`的原始数据类型是[`Connect.IncomingMessage`](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/connect/index.d.ts). 插件在此基础上,增加了 `query`, `params`, `body`, `refererQuery`,以及 `getCookie(name)` 方法用于获取cookie信息。
|
|
722
|
+
|
|
723
|
+
```ts
|
|
724
|
+
type Request = Connect.IncomingMessage & {
|
|
725
|
+
query: object
|
|
726
|
+
params: object
|
|
727
|
+
body: any
|
|
728
|
+
refererQuery: object
|
|
553
729
|
getCookie: (name: string, option?: Cookies.GetOption) => string | undefined
|
|
554
730
|
}
|
|
555
731
|
```
|
|
556
732
|
|
|
733
|
+
**Response:**
|
|
734
|
+
|
|
735
|
+
`response` 的原始数据类型是`http.ServerResponse<http.IncomingMessage>`. 插件在此基础上增加了 `setCookie(name, value)` 方法用于设置cookie
|
|
736
|
+
|
|
737
|
+
```ts
|
|
738
|
+
type Response = http.ServerResponse<http.IncomingMessage> & {
|
|
739
|
+
setCookie: (
|
|
740
|
+
name: string,
|
|
741
|
+
value?: string | null,
|
|
742
|
+
option?: Cookies.SetOption,
|
|
743
|
+
) => void
|
|
744
|
+
}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
> **注意:**
|
|
748
|
+
>
|
|
749
|
+
> 如果使用 json/json5 编写 mock文件,则不支持使用 `response` 方法,以及不支持使用其他字段的函数形式。
|
|
750
|
+
|
|
751
|
+
## 共享 Mock 数据
|
|
752
|
+
|
|
753
|
+
由于每个mock文件都是作为独立的入口进行编译,其依赖的本地文件也编译在内,
|
|
754
|
+
且每个mock文件拥有独立的作用域,这使得即使多个 mock文件共同依赖某一个`data.ts`文件,也无法共享数据。
|
|
755
|
+
某个 `mock` 文件对 `data.ts` 中的数据进行修改,其它`mock`文件不会获取到修改后的数据。
|
|
756
|
+
|
|
757
|
+
为此,插件提供了一个 `defineMockData` 函数,用于在 `mock` 文件中使用 `data.ts` 作为共享数据源。
|
|
758
|
+
|
|
759
|
+
```ts
|
|
760
|
+
type defineMockData<T> = (
|
|
761
|
+
key: string, // 数据唯一标识符
|
|
762
|
+
initialData: T, // 初始化数据
|
|
763
|
+
options?: {
|
|
764
|
+
persistOnHMR?: boolean // 是否在热更新时保持数据状态
|
|
765
|
+
} // 可选配置
|
|
766
|
+
) => [getter, setter] & { value: T }
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
### 用法
|
|
770
|
+
|
|
771
|
+
`data.ts`
|
|
772
|
+
|
|
773
|
+
```ts
|
|
774
|
+
import { defineMockData } from 'rspack-plugin-mock/helper'
|
|
775
|
+
|
|
776
|
+
export default defineMockData('posts', [
|
|
777
|
+
{ id: '1', title: 'title1', content: 'content1' },
|
|
778
|
+
{ id: '2', title: 'title2', content: 'content2' },
|
|
779
|
+
])
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
`*.mock.ts`
|
|
783
|
+
|
|
784
|
+
```ts
|
|
785
|
+
import { defineMock } from 'rspack-plugin-mock/helper'
|
|
786
|
+
import posts from './data'
|
|
787
|
+
|
|
788
|
+
export default defineMock([
|
|
789
|
+
{
|
|
790
|
+
url: '/api/posts',
|
|
791
|
+
body: () => posts.value
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
url: '/api/posts/delete/:id',
|
|
795
|
+
body: (params) => {
|
|
796
|
+
const id = params.id
|
|
797
|
+
posts.value = posts.value.filter(post => post.id !== id)
|
|
798
|
+
return { success: true }
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
])
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
> **注意:**
|
|
805
|
+
>
|
|
806
|
+
> `defineMockData` 仅是基于 `memory` 提供的共享数据支持,
|
|
807
|
+
> 如果需要做 mock 数据持久化,建议使用 `nosql`, 如 `lowdb` 或 `level` 等。
|
|
808
|
+
|
|
809
|
+
## 自定义匹配优先级
|
|
810
|
+
|
|
811
|
+
> 自定义规则仅影响包含动态参数的链接,如: `/api/user/:id`
|
|
812
|
+
|
|
813
|
+
插件内置的路径匹配规则优先级,已经能够满足大部分需求,但如果你需要更加灵活的自定义匹配规则优先级,
|
|
814
|
+
可以使用 `priority` 参数。
|
|
815
|
+
|
|
816
|
+
示例:
|
|
817
|
+
|
|
818
|
+
```ts
|
|
819
|
+
import { MockServerPlugin } from 'rspack-plugin-mock'
|
|
820
|
+
|
|
821
|
+
export default {
|
|
822
|
+
plugins: [
|
|
823
|
+
new MockServerPlugin({
|
|
824
|
+
priority: {
|
|
825
|
+
// 匹配规则优先级, 全局生效。声明在该选项中的规则将优先于默认规则生效。
|
|
826
|
+
// 规则在数组越靠前的位置,优先级越高。
|
|
827
|
+
global: ['/api/:a/b/c', '/api/a/:b/c', '/api/a/b/:c'],
|
|
828
|
+
// 对于一些特殊情况,需要调整部分规则的优先级,可以使用此选项。
|
|
829
|
+
// 比如一个请求同时命中了规则 A 和 B,且 A 比 B 优先级高, 但期望规则 B 生效时。
|
|
830
|
+
special: {
|
|
831
|
+
// 当请求同时命中 [key] 和 rules 中的任意一个时,优先匹配 [key] 。
|
|
832
|
+
// when 用于进一步约束具体是哪些请求需要调整优先级。
|
|
833
|
+
'/api/:a/:b/c': {
|
|
834
|
+
rules: ['/api/a/:b/:c', '/api/a/b/:c'],
|
|
835
|
+
when: ['/api/a/b/c']
|
|
836
|
+
},
|
|
837
|
+
// 如果不需要 when, 则表示命中规则的请求都需要调整优先级。
|
|
838
|
+
// 可以简写为 [key]: [...rules]
|
|
839
|
+
'/api/:a/b': ['/api/a/:b'],
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
})
|
|
843
|
+
]
|
|
844
|
+
}
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
> **注意:**
|
|
848
|
+
>
|
|
849
|
+
> `priority` 虽然可以调整优先级,但大多数时候,你都没有必要这么做。
|
|
850
|
+
> 对于一些特殊情况的请求,可以使用 静态规则来替代 `priority`,静态规则总是拥有最高优先级。
|
|
851
|
+
|
|
557
852
|
## Example
|
|
558
853
|
|
|
559
854
|
`mock/**/*.mock.{ts,js,mjs,cjs,json,json5}`
|
|
560
855
|
|
|
561
856
|
查看更多示例: [example](/example/)
|
|
562
857
|
|
|
563
|
-
|
|
858
|
+
<details>
|
|
859
|
+
<summary>命中 <code>/api/test</code> 请求,并返回一个 数据为空的响应体内容</summary>
|
|
564
860
|
|
|
565
861
|
```ts
|
|
566
862
|
export default defineMock({
|
|
@@ -568,7 +864,9 @@ export default defineMock({
|
|
|
568
864
|
})
|
|
569
865
|
```
|
|
570
866
|
|
|
571
|
-
|
|
867
|
+
</details>
|
|
868
|
+
<details>
|
|
869
|
+
<summary>命中 <code>/api/test</code> 请求,并返回一个固定内容数据</summary>
|
|
572
870
|
|
|
573
871
|
```ts
|
|
574
872
|
export default defineMock({
|
|
@@ -584,7 +882,10 @@ export default defineMock({
|
|
|
584
882
|
})
|
|
585
883
|
```
|
|
586
884
|
|
|
587
|
-
|
|
885
|
+
</details>
|
|
886
|
+
|
|
887
|
+
<details>
|
|
888
|
+
<summary>限定只允许 <code>GET</code> 请求</summary>
|
|
588
889
|
|
|
589
890
|
```ts
|
|
590
891
|
export default defineMock({
|
|
@@ -593,7 +894,10 @@ export default defineMock({
|
|
|
593
894
|
})
|
|
594
895
|
```
|
|
595
896
|
|
|
596
|
-
|
|
897
|
+
</details>
|
|
898
|
+
|
|
899
|
+
<details>
|
|
900
|
+
<summary>在返回的响应头中,添加自定义 header 和 cookie</summary>
|
|
597
901
|
|
|
598
902
|
```ts
|
|
599
903
|
export default defineMock({
|
|
@@ -615,7 +919,10 @@ export default defineMock({
|
|
|
615
919
|
})
|
|
616
920
|
```
|
|
617
921
|
|
|
618
|
-
|
|
922
|
+
</details>
|
|
923
|
+
|
|
924
|
+
<details>
|
|
925
|
+
<summary>定义多个相同url请求mock,并使用验证器匹配生效规则</summary>
|
|
619
926
|
|
|
620
927
|
```ts
|
|
621
928
|
export default defineMock([
|
|
@@ -649,7 +956,10 @@ export default defineMock([
|
|
|
649
956
|
])
|
|
650
957
|
```
|
|
651
958
|
|
|
652
|
-
|
|
959
|
+
</details>
|
|
960
|
+
|
|
961
|
+
<details>
|
|
962
|
+
<summary>延迟接口响应</summary>
|
|
653
963
|
|
|
654
964
|
```ts
|
|
655
965
|
export default defineMock({
|
|
@@ -658,7 +968,10 @@ export default defineMock({
|
|
|
658
968
|
})
|
|
659
969
|
```
|
|
660
970
|
|
|
661
|
-
|
|
971
|
+
</details>
|
|
972
|
+
|
|
973
|
+
<details>
|
|
974
|
+
<summary>使接口请求失败</summary>
|
|
662
975
|
|
|
663
976
|
```ts
|
|
664
977
|
export default defineMock({
|
|
@@ -668,7 +981,10 @@ export default defineMock({
|
|
|
668
981
|
})
|
|
669
982
|
```
|
|
670
983
|
|
|
671
|
-
|
|
984
|
+
</details>
|
|
985
|
+
|
|
986
|
+
<details>
|
|
987
|
+
<summary>动态路由匹配</summary>
|
|
672
988
|
|
|
673
989
|
```ts
|
|
674
990
|
export default defineMock({
|
|
@@ -681,7 +997,10 @@ export default defineMock({
|
|
|
681
997
|
|
|
682
998
|
路由中的 `userId`将会解析到 `request.params` 对象中.
|
|
683
999
|
|
|
684
|
-
|
|
1000
|
+
</details>
|
|
1001
|
+
|
|
1002
|
+
<details>
|
|
1003
|
+
<summary>使用 buffer 响应数据</summary>
|
|
685
1004
|
|
|
686
1005
|
```ts
|
|
687
1006
|
import { Buffer } from 'node:buffer'
|
|
@@ -705,7 +1024,10 @@ export default defineMock({
|
|
|
705
1024
|
})
|
|
706
1025
|
```
|
|
707
1026
|
|
|
708
|
-
|
|
1027
|
+
</details>
|
|
1028
|
+
|
|
1029
|
+
<details>
|
|
1030
|
+
<summary>响应文件类型</summary>
|
|
709
1031
|
|
|
710
1032
|
模拟文件下载,传入文件读取流
|
|
711
1033
|
|
|
@@ -724,7 +1046,10 @@ export default defineMock({
|
|
|
724
1046
|
<a href="/api/download" download="my-app.dmg">下载文件</a>
|
|
725
1047
|
```
|
|
726
1048
|
|
|
727
|
-
|
|
1049
|
+
</details>
|
|
1050
|
+
|
|
1051
|
+
<details>
|
|
1052
|
+
<summary>使用 <code>mockjs</code> 生成响应数据</summary>
|
|
728
1053
|
|
|
729
1054
|
```ts
|
|
730
1055
|
import Mock from 'mockjs'
|
|
@@ -741,7 +1066,10 @@ export default defineMock({
|
|
|
741
1066
|
|
|
742
1067
|
请先安装 `mockjs`
|
|
743
1068
|
|
|
744
|
-
|
|
1069
|
+
</details>
|
|
1070
|
+
|
|
1071
|
+
<details>
|
|
1072
|
+
<summary>使用 <code>response</code> 自定义响应</summary>
|
|
745
1073
|
|
|
746
1074
|
```ts
|
|
747
1075
|
export default defineMock({
|
|
@@ -761,7 +1089,10 @@ export default defineMock({
|
|
|
761
1089
|
})
|
|
762
1090
|
```
|
|
763
1091
|
|
|
764
|
-
|
|
1092
|
+
</details>
|
|
1093
|
+
|
|
1094
|
+
<details>
|
|
1095
|
+
<summary>使用 json / json5</summary>
|
|
765
1096
|
|
|
766
1097
|
```json
|
|
767
1098
|
{
|
|
@@ -772,7 +1103,10 @@ export default defineMock({
|
|
|
772
1103
|
}
|
|
773
1104
|
```
|
|
774
1105
|
|
|
775
|
-
|
|
1106
|
+
</details>
|
|
1107
|
+
|
|
1108
|
+
<details>
|
|
1109
|
+
<summary>multipart, 文件上传</summary>
|
|
776
1110
|
|
|
777
1111
|
通过 [`formidable`](https://www.npmjs.com/package/formidable#readme) 支持。
|
|
778
1112
|
|
|
@@ -808,7 +1142,10 @@ export default defineMock({
|
|
|
808
1142
|
})
|
|
809
1143
|
```
|
|
810
1144
|
|
|
811
|
-
|
|
1145
|
+
</details>
|
|
1146
|
+
|
|
1147
|
+
<details>
|
|
1148
|
+
<summary>Graphql</summary>
|
|
812
1149
|
|
|
813
1150
|
```ts
|
|
814
1151
|
import { buildSchema, graphql } from 'graphql'
|
|
@@ -838,7 +1175,10 @@ fetch('/api/graphql', {
|
|
|
838
1175
|
})
|
|
839
1176
|
```
|
|
840
1177
|
|
|
841
|
-
|
|
1178
|
+
</details>
|
|
1179
|
+
|
|
1180
|
+
<details>
|
|
1181
|
+
<summary>WebSocket Mock</summary>
|
|
842
1182
|
|
|
843
1183
|
```ts
|
|
844
1184
|
// ws.mock.ts
|
|
@@ -883,7 +1223,10 @@ ws.addEventListener('message', (raw) => {
|
|
|
883
1223
|
})
|
|
884
1224
|
```
|
|
885
1225
|
|
|
886
|
-
|
|
1226
|
+
</details>
|
|
1227
|
+
|
|
1228
|
+
<details>
|
|
1229
|
+
<summary>EventSource Mock</summary>
|
|
887
1230
|
|
|
888
1231
|
```ts
|
|
889
1232
|
// sse.mock.ts
|
|
@@ -917,6 +1260,8 @@ es.addEventListener('count', (e) => {
|
|
|
917
1260
|
})
|
|
918
1261
|
```
|
|
919
1262
|
|
|
1263
|
+
</details>
|
|
1264
|
+
|
|
920
1265
|
## 独立部署的小型mock服务
|
|
921
1266
|
|
|
922
1267
|
在一些场景中,可能会需要使用mock服务提供的数据支持,用于展示,但可能项目已完成打包构建部署,已脱离 `rspack/rsbuild` 和本插件提供的 mock服务支持。由于本插件在设计之初,支持在mock文件中引入各种 `node` 模块,所以不能将 mock文件打包内联到客户端构建代码中。
|