rspack-plugin-mock 2.0.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.zh-CN.md CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  - ⚡️ 轻量,灵活,快速
28
28
  - 🧲 非注入式,对客户端代码无侵入
29
- - 💡 ESModule
29
+ - 💡 ESModule
30
30
  - 🦾 Typescript
31
31
  - 🔥 热更新
32
32
  - 🏷 支持 `.[cm]?js`/ `.ts` / `json` / `json5` 编写 mock 数据
@@ -41,6 +41,7 @@
41
41
  - 📤 支持 multipart 类型,模拟文件上传
42
42
  - 📥 支持模拟文件下载
43
43
  - ⚜️ 支持模拟 `WebSocket` 和 `Server-Sent Events`
44
+ - 📝 支持 **请求录制** 和 **请求回放**
44
45
  - 🗂 支持构建可独立部署的小型mock服务
45
46
 
46
47
  ## 安装
@@ -211,7 +212,13 @@ export default defineMock({
211
212
 
212
213
  ## 插件配置
213
214
 
214
- ### options.prefix
215
+ - **类型:** `boolean`
216
+ - **默认值:** `true`
217
+ - **详情:**
218
+
219
+ 是否开启 mock 服务。如果设置为 `false`,插件将不会生效。
220
+
221
+ ### prefix
215
222
 
216
223
  - **类型:** `string | string[]`
217
224
  - **详情:**
@@ -219,7 +226,7 @@ export default defineMock({
219
226
  为 http mock 服务配置 路径匹配规则,任何请求路径以 prefix 开头的都将被拦截代理。
220
227
  如果 prefix 以 `^` 开头,将被识别为 `RegExp`。
221
228
 
222
- ### options.wsPrefix
229
+ ### wsPrefix
223
230
 
224
231
  - **类型:** `string | string[]`
225
232
  - **详情:**
@@ -229,7 +236,7 @@ export default defineMock({
229
236
 
230
237
  请避免在 `devServer.proxy` / `server.proxy` 中出现 `wsPrefix` 配置中相同的规则,因为这可能会导致规则冲突。
231
238
 
232
- ### options.cwd
239
+ ### cwd
233
240
 
234
241
  - **类型:** `string`
235
242
  - **默认值:** `process.cwd()`
@@ -237,31 +244,31 @@ export default defineMock({
237
244
 
238
245
  配置 `include` 和 `exclude` 的匹配上下文。
239
246
 
240
- ### options.dir
247
+ ### dir
241
248
 
242
249
  - **类型:** `string`
243
- - **默认值:** `mock` (相对于 [`options.cwd`](#optionscwd))
250
+ - **默认值:** `mock` (相对于 [`cwd`](#cwd))
244
251
  - **详情:**
245
252
 
246
- 配置 mock 包的输出目录,相对于 [`options.cwd`](#optionscwd)
253
+ 配置 mock 包的输出目录,相对于 [`cwd`](#cwd)
247
254
 
248
- ### options.include
255
+ ### include
249
256
 
250
257
  - **类型:** `string | string[]`
251
- - **默认值:** `[**/*.mock.{js,ts,cjs,mjs,json,json5}']` (相对于 [`options.dir`](#optionsdir))
258
+ - **默认值:** `[**/*.mock.{js,ts,cjs,mjs,json,json5}']` (相对于 [`dir`](#dir))
252
259
  - **详情:**
253
260
 
254
261
  glob 字符串匹配 mock 包含的文件。 查看 [picomatch](https://github.com/micromatch/picomatch#globbing-features)
255
262
 
256
- ### options.exclude
263
+ ### exclude
257
264
 
258
265
  - **类型:** `string | string[]`
259
- - **默认值:** `[]` (相对于 [`options.dir`](#optionsdir))
266
+ - **默认值:** `[]` (相对于 [`dir`](#dir))
260
267
  - **详情:**
261
268
 
262
269
  glob 字符串匹配 mock 排除的文件。 查看 [picomatch](https://github.com/micromatch/picomatch#globbing-features)
263
270
 
264
- ### options.log
271
+ ### log
265
272
 
266
273
  - **类型:** `boolean | 'info' | 'warn' | 'error' | 'silent' | 'debug'`
267
274
  - **默认值:** `info`
@@ -269,7 +276,7 @@ export default defineMock({
269
276
 
270
277
  开启日志,或配置 日志级别
271
278
 
272
- ### options.reload
279
+ ### reload
273
280
 
274
281
  - **类型:** `boolean`
275
282
  - **默认值:** `false`
@@ -278,7 +285,17 @@ export default defineMock({
278
285
  mock资源热更新时,仅更新了数据内容,但是默认不重新刷新页面。
279
286
  当你希望每次修改mock文件都刷新页面时,可以打开此选项。
280
287
 
281
- ### options.cors
288
+ ### activeScene
289
+
290
+ - **类型:** `string | string[]`
291
+ - **默认值:** `''`
292
+ - **详情:**
293
+
294
+ 当前激活的场景,用于过滤 mock。
295
+
296
+ 只有 [`scene`](#optionsscene) 与此有交集的 mock(或未配置 `scene` 的 mock)才会被考虑匹配。可通过 `X-Mock-Scene` 请求头按请求覆盖。
297
+
298
+ ### cors
282
299
 
283
300
  - **类型:** `boolean | CorsOptions`
284
301
  - **默认值:** `true`
@@ -286,7 +303,7 @@ export default defineMock({
286
303
 
287
304
  配置 [cors](https://github.com/expressjs/cors#configuration-options)
288
305
 
289
- ### options.formidableOptions
306
+ ### formidableOptions
290
307
 
291
308
  - **类型:** `FormidableOptions`
292
309
  - **默认值:** `{ multiples: true }`
@@ -294,21 +311,21 @@ export default defineMock({
294
311
 
295
312
  配置 [formidable](https://github.com/node-formidable/formidable#options)
296
313
 
297
- ### options.cookiesOptions
314
+ ### cookiesOptions
298
315
 
299
316
  - **类型:** `CookiesOptions`
300
317
  - **详情:**
301
318
 
302
319
  配置 [cookies](https://github.com/pillarjs/cookies#new-cookiesrequest-response--options)
303
320
 
304
- ### options.bodyParserOptions
321
+ ### bodyParserOptions
305
322
 
306
323
  - **类型:** `BodyParserOptions`
307
324
  - **详情:**
308
325
 
309
326
  配置 [co-body](https://github.com/cojs/co-body#options)
310
327
 
311
- ## options.build
328
+ ## build
312
329
 
313
330
  - **类型:** `boolean | ServerBuildOption`
314
331
 
@@ -338,8 +355,147 @@ export default defineMock({
338
355
 
339
356
  当需要构建一个小型mock服务时,可配置此项。插件会在构建生产包时,额外生成一个可部署的node mock 服务包。
340
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
+
341
471
  ## Mock 配置
342
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
+
343
499
  ### options.url
344
500
 
345
501
  - **类型:** `string`
@@ -356,6 +512,17 @@ export default defineMock({
356
512
  是否启动对该接口的mock,在多数场景下,我们仅需要对部分接口进行 mock,
357
513
  而不是对所有配置了mock的请求进行全量mock,所以是否能够配置是否启用很重要
358
514
 
515
+ ### options.scene
516
+
517
+ - **类型:** `string | string[]`
518
+ - **默认值:** `''`
519
+ - **详情:**
520
+
521
+ 该 mock 的场景标识。
522
+
523
+ 未配置时,该 mock 为全场景通用,不受 [activeScene](#activescene) 限制。
524
+ 配置后,只有 `scene` 中任意一项与 [activeScene](#activescene) 中任意一项匹配时,该 mock 才会激活。
525
+
359
526
  ### options.method
360
527
 
361
528
  - **类型:** `Method | Method[]`
@@ -513,59 +680,183 @@ interface WebSocketSetupContext {
513
680
  }
514
681
  ```
515
682
 
516
- ### Types
683
+ ### options.error
517
684
 
518
- ```ts
519
- export type MockRequest = http.IncomingMessage & ExtraRequest
685
+ - **类型:** `MockErrorConfig | undefined`
686
+ - **详情:**
520
687
 
521
- export type MockResponse = http.ServerResponse<http.IncomingMessage> & {
522
- /**
523
- * 设置响应体 cookies
524
- * @see [cookies](https://github.com/pillarjs/cookies#cookiessetname--values--options)
525
- */
526
- setCookie: (
527
- name: string,
528
- value?: string | null,
529
- option?: Cookies.SetOption,
530
- ) => void
531
- }
688
+ 配置错误模拟,包括错误概率、错误状态码、错误状态文本、以及自定义错误响应体。
532
689
 
533
- interface ExtraRequest {
534
- /**
535
- * 请求地址中位于 `?` 后面的 queryString,已解析为 json
536
- */
537
- query: Record<string, any>
538
- /**
539
- * 请求 referer 中位于 `?` 后面的 queryString,已解析为 json
540
- */
541
- refererQuery: Record<string, any>
690
+ ```ts
691
+ interface MockErrorConfig {
542
692
  /**
543
- * 请求体中 body 数据
693
+ * 错误概率(0-1),默认 0.5
694
+ * @default 0.5
544
695
  */
545
- body: Record<string, any>
696
+ probability?: number
546
697
  /**
547
- * 请求地址中,`/api/id/:id` 解析后的 params 参数
698
+ * 错误状态码,默认 500
699
+ * @default 500
548
700
  */
549
- params: Record<string, any>
701
+ status?: number
550
702
  /**
551
- * 请求体中 headers
703
+ * 错误状态文本
552
704
  */
553
- headers: Headers
705
+ statusText?: string
554
706
  /**
555
- * 获取 请求中携带的 cookie
556
- * @see [cookies](https://github.com/pillarjs/cookies#cookiesgetname--options)
707
+ * 自定义错误响应体,适用于 status 为 200,但响应体需要模拟错误场景
708
+ * @example
709
+ * { code: 500, msg: 'Internal Server Error', result: null }
557
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
558
729
  getCookie: (name: string, option?: Cookies.GetOption) => string | undefined
559
730
  }
560
731
  ```
561
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
+
562
852
  ## Example
563
853
 
564
854
  `mock/**/*.mock.{ts,js,mjs,cjs,json,json5}`
565
855
 
566
856
  查看更多示例: [example](/example/)
567
857
 
568
- **exp:** 命中 `/api/test` 请求,并返回一个 数据为空的响应体内容
858
+ <details>
859
+ <summary>命中 <code>/api/test</code> 请求,并返回一个 数据为空的响应体内容</summary>
569
860
 
570
861
  ```ts
571
862
  export default defineMock({
@@ -573,7 +864,9 @@ export default defineMock({
573
864
  })
574
865
  ```
575
866
 
576
- **exp:** 命中 `/api/test` 请求,并返回一个固定内容数据
867
+ </details>
868
+ <details>
869
+ <summary>命中 <code>/api/test</code> 请求,并返回一个固定内容数据</summary>
577
870
 
578
871
  ```ts
579
872
  export default defineMock({
@@ -589,7 +882,10 @@ export default defineMock({
589
882
  })
590
883
  ```
591
884
 
592
- **exp:** 限定只允许 `GET` 请求
885
+ </details>
886
+
887
+ <details>
888
+ <summary>限定只允许 <code>GET</code> 请求</summary>
593
889
 
594
890
  ```ts
595
891
  export default defineMock({
@@ -598,7 +894,10 @@ export default defineMock({
598
894
  })
599
895
  ```
600
896
 
601
- **exp:** 在返回的响应头中,添加自定义 header 和 cookie
897
+ </details>
898
+
899
+ <details>
900
+ <summary>在返回的响应头中,添加自定义 header 和 cookie</summary>
602
901
 
603
902
  ```ts
604
903
  export default defineMock({
@@ -620,7 +919,10 @@ export default defineMock({
620
919
  })
621
920
  ```
622
921
 
623
- **exp:** 定义多个相同url请求mock,并使用验证器匹配生效规则
922
+ </details>
923
+
924
+ <details>
925
+ <summary>定义多个相同url请求mock,并使用验证器匹配生效规则</summary>
624
926
 
625
927
  ```ts
626
928
  export default defineMock([
@@ -654,7 +956,10 @@ export default defineMock([
654
956
  ])
655
957
  ```
656
958
 
657
- **exp:** 延迟接口响应:
959
+ </details>
960
+
961
+ <details>
962
+ <summary>延迟接口响应</summary>
658
963
 
659
964
  ```ts
660
965
  export default defineMock({
@@ -663,7 +968,10 @@ export default defineMock({
663
968
  })
664
969
  ```
665
970
 
666
- **exp:** 使接口请求失败
971
+ </details>
972
+
973
+ <details>
974
+ <summary>使接口请求失败</summary>
667
975
 
668
976
  ```ts
669
977
  export default defineMock({
@@ -673,7 +981,10 @@ export default defineMock({
673
981
  })
674
982
  ```
675
983
 
676
- **exp:** 动态路由匹配
984
+ </details>
985
+
986
+ <details>
987
+ <summary>动态路由匹配</summary>
677
988
 
678
989
  ```ts
679
990
  export default defineMock({
@@ -686,7 +997,10 @@ export default defineMock({
686
997
 
687
998
  路由中的 `userId`将会解析到 `request.params` 对象中.
688
999
 
689
- **exp:** 使用 buffer 响应数据
1000
+ </details>
1001
+
1002
+ <details>
1003
+ <summary>使用 buffer 响应数据</summary>
690
1004
 
691
1005
  ```ts
692
1006
  import { Buffer } from 'node:buffer'
@@ -710,7 +1024,10 @@ export default defineMock({
710
1024
  })
711
1025
  ```
712
1026
 
713
- **exp:** 响应文件类型
1027
+ </details>
1028
+
1029
+ <details>
1030
+ <summary>响应文件类型</summary>
714
1031
 
715
1032
  模拟文件下载,传入文件读取流
716
1033
 
@@ -729,7 +1046,10 @@ export default defineMock({
729
1046
  <a href="/api/download" download="my-app.dmg">下载文件</a>
730
1047
  ```
731
1048
 
732
- **exp:** 使用 `mockjs` 生成响应数据:
1049
+ </details>
1050
+
1051
+ <details>
1052
+ <summary>使用 <code>mockjs</code> 生成响应数据</summary>
733
1053
 
734
1054
  ```ts
735
1055
  import Mock from 'mockjs'
@@ -746,7 +1066,10 @@ export default defineMock({
746
1066
 
747
1067
  请先安装 `mockjs`
748
1068
 
749
- **exp:** 使用 `response` 自定义响应
1069
+ </details>
1070
+
1071
+ <details>
1072
+ <summary>使用 <code>response</code> 自定义响应</summary>
750
1073
 
751
1074
  ```ts
752
1075
  export default defineMock({
@@ -766,7 +1089,10 @@ export default defineMock({
766
1089
  })
767
1090
  ```
768
1091
 
769
- **exp:** 使用 json / json5
1092
+ </details>
1093
+
1094
+ <details>
1095
+ <summary>使用 json / json5</summary>
770
1096
 
771
1097
  ```json
772
1098
  {
@@ -777,7 +1103,10 @@ export default defineMock({
777
1103
  }
778
1104
  ```
779
1105
 
780
- **exp:** multipart, 文件上传.
1106
+ </details>
1107
+
1108
+ <details>
1109
+ <summary>multipart, 文件上传</summary>
781
1110
 
782
1111
  通过 [`formidable`](https://www.npmjs.com/package/formidable#readme) 支持。
783
1112
 
@@ -813,7 +1142,10 @@ export default defineMock({
813
1142
  })
814
1143
  ```
815
1144
 
816
- **exp:** Graphql
1145
+ </details>
1146
+
1147
+ <details>
1148
+ <summary>Graphql</summary>
817
1149
 
818
1150
  ```ts
819
1151
  import { buildSchema, graphql } from 'graphql'
@@ -843,7 +1175,10 @@ fetch('/api/graphql', {
843
1175
  })
844
1176
  ```
845
1177
 
846
- **exp:** WebSocket Mock
1178
+ </details>
1179
+
1180
+ <details>
1181
+ <summary>WebSocket Mock</summary>
847
1182
 
848
1183
  ```ts
849
1184
  // ws.mock.ts
@@ -888,7 +1223,10 @@ ws.addEventListener('message', (raw) => {
888
1223
  })
889
1224
  ```
890
1225
 
891
- **示例:** EventSource Mock
1226
+ </details>
1227
+
1228
+ <details>
1229
+ <summary>EventSource Mock</summary>
892
1230
 
893
1231
  ```ts
894
1232
  // sse.mock.ts
@@ -922,6 +1260,8 @@ es.addEventListener('count', (e) => {
922
1260
  })
923
1261
  ```
924
1262
 
1263
+ </details>
1264
+
925
1265
  ## 独立部署的小型mock服务
926
1266
 
927
1267
  在一些场景中,可能会需要使用mock服务提供的数据支持,用于展示,但可能项目已完成打包构建部署,已脱离 `rspack/rsbuild` 和本插件提供的 mock服务支持。由于本插件在设计之初,支持在mock文件中引入各种 `node` 模块,所以不能将 mock文件打包内联到客户端构建代码中。