9f026d5dd95c3d5b59d9016e63ad73519598bfdf855f6b3f49fc0ce9f64d8913e5e7808e185a7b7c4eb28a34400e4c8567ffef708a73e0141daae2953735c5 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. # vite-plugin-mock
  2. **中文** | [English](./README.md)
  3. [![npm][npm-img]][npm-url] [![node][node-img]][node-url]
  4. 提供本地和生产模拟服务。
  5. vite 的数据模拟插件,是基于 vite.js 开发的。 并同时支持本地环境和生产环境。 Connect 服务中间件在本地使用,mockjs 在生产环境中使用。
  6. ## Production environment problem description
  7. The current production environment cannot support the acquisition of `headers` and the acquisition of `restful`Url format parameters. So there are those two formats that need to be used in the production environment.
  8. ### 安装 (yarn or npm)
  9. **node version:** >=12.0.0
  10. **vite version:** >=2.0.0
  11. ```bash
  12. yarn add mockjs
  13. # or
  14. npm i mockjs -S
  15. ```
  16. and
  17. ```bash
  18. yarn add vite-plugin-mock -D
  19. # or
  20. npm i vite-plugin-mock -D
  21. ```
  22. ## 使用
  23. **开发环境**
  24. 开发环境是使用 Connect 中间件实现的。
  25. 与生产环境不同,您可以在 Google Chrome 控制台中查看网络请求记录
  26. - vite.config.ts 配置
  27. ```ts
  28. import { UserConfigExport, ConfigEnv } from 'vite'
  29. import { viteMockServe } from 'vite-plugin-mock'
  30. import vue from '@vitejs/plugin-vue'
  31. export default ({ command }: ConfigEnv): UserConfigExport => {
  32. return {
  33. plugins: [
  34. vue(),
  35. viteMockServe({
  36. // default
  37. mockPath: 'mock',
  38. localEnabled: command === 'serve',
  39. }),
  40. ],
  41. }
  42. }
  43. ```
  44. - viteMockServe 配置
  45. ```ts
  46. {
  47. mockPath?: string;
  48. supportTs?: boolean;
  49. ignore?: RegExp | ((fileName: string) => boolean);
  50. watchFiles?: boolean;
  51. localEnabled?: boolean;
  52. ignoreFiles?: string[];
  53. configPath?: string;
  54. prodEnabled?: boolean;
  55. injectFile?: string;
  56. injectCode?: string;
  57. logger?:boolean;
  58. }
  59. ```
  60. ### mockPath
  61. **type:** string
  62. **default:** `mock`
  63. 设置模拟.ts 文件的存储文件夹
  64. 如果`watchFiles:true`,将监视文件夹中的文件更改。 并实时同步到请求结果
  65. 如果 `configPath` 具有值,则无效
  66. ### supportTs
  67. **type:** boolean
  68. **default:** `true`
  69. 打开后,可以读取 ts 文件模块。 请注意,打开后将无法监视.js 文件。
  70. ### ignore
  71. **type:** `RegExp | ((fileName: string) => boolean)`;
  72. **default:** `undefined`
  73. 自动读取模拟.ts 文件时,请忽略指定格式的文件
  74. ### watchFiles
  75. **type:** `boolean`
  76. **default:** `true`
  77. 设置是否监视`mockPath`对应的文件夹内文件中的更改
  78. ### localEnabled
  79. **type:** `boolean`
  80. **default:** `command === 'serve'`
  81. 设置是否启用本地` xxx.ts` 文件,不要在生产环境中打开它.设置为 `false` 将禁用 mock 功能
  82. ### prodEnabled
  83. **type:** `boolean`
  84. **default:** `command !== 'serve'`
  85. 设置打包是否启用 mock 功能
  86. ### injectCode
  87. **type:** `string`
  88. **default:** ''
  89. 如果生产环境开启了 mock 功能,即`prodEnabled=true`.则该代码会被注入到`injectFile`对应的文件的底部。默认为`main.{ts,js}`
  90. 这样做的好处是,可以动态控制生产环境是否开启 mock 且在没有开启的时候 mock.js 不会被打包。
  91. 如果代码直接写在`main.ts`内,则不管有没有开启,最终的打包都会包含`mock.js`
  92. ### injectFile
  93. **type:** `string`
  94. **default:** `path.resolve(process.cwd(), 'src/main.{ts,js}')`
  95. `injectCode`代码注入的文件,默认为项目根目录下`src/main.{ts,js}`
  96. ### configPath
  97. **type:** `string`
  98. **default:** `vite.mock.config.ts`
  99. 设置模拟读取的数据条目。 当文件存在并且位于项目根目录中时,将首先读取并使用该文件。 配置文件返回一个数组
  100. ### logger
  101. **type:** `boolean`
  102. **default:** `true`
  103. 是否在控制台显示请求日志
  104. ## Mock file example
  105. `/path/mock`
  106. ```ts
  107. // test.ts
  108. import { MockMethod } from 'vite-plugin-mock'
  109. export default [
  110. {
  111. url: '/api/get',
  112. method: 'get',
  113. response: ({ query }) => {
  114. return {
  115. code: 0,
  116. data: {
  117. name: 'vben',
  118. },
  119. }
  120. },
  121. },
  122. {
  123. url: '/api/post',
  124. method: 'post',
  125. timeout: 2000,
  126. response: {
  127. code: 0,
  128. data: {
  129. name: 'vben',
  130. },
  131. },
  132. },
  133. {
  134. url: '/api/text',
  135. method: 'post',
  136. rawResponse: async (req, res) => {
  137. let reqbody = ''
  138. await new Promise((resolve) => {
  139. req.on('data', (chunk) => {
  140. reqbody += chunk
  141. })
  142. req.on('end', () => resolve(undefined))
  143. })
  144. res.setHeader('Content-Type', 'text/plain')
  145. res.statusCode = 200
  146. res.end(`hello, ${reqbody}`)
  147. },
  148. },
  149. ] as MockMethod[]
  150. ```
  151. ### MockMethod
  152. ```ts
  153. {
  154. // 请求地址
  155. url: string;
  156. // 请求方式
  157. method?: MethodType;
  158. // 设置超时时间
  159. timeout?: number;
  160. // 状态吗
  161. statusCode?:number;
  162. // 响应数据(JSON)
  163. response?: ((opt: { [key: string]: string; body: Record<string,any>; query: Record<string,any>, headers: Record<string, any>; }) => any) | any;
  164. // 响应(非JSON)
  165. rawResponse?: (req: IncomingMessage, res: ServerResponse) => void;
  166. }
  167. ```
  168. ## 在生产环境中的使用
  169. 创建`mockProdServer.ts` 文件
  170. ```ts
  171. // mockProdServer.ts
  172. import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
  173. // 逐一导入您的mock.ts文件
  174. // 如果使用vite.mock.config.ts,只需直接导入文件
  175. // 可以使用 import.meta.glob功能来进行全部导入
  176. import testModule from '../mock/test'
  177. export function setupProdMockServer() {
  178. createProdMockServer([...testModule])
  179. }
  180. ```
  181. 配置 `vite-plugin-mock`
  182. ```ts
  183. import { viteMockServe } from 'vite-plugin-mock'
  184. import { UserConfigExport, ConfigEnv } from 'vite'
  185. export default ({ command }: ConfigEnv): UserConfigExport => {
  186. // 根据项目配置。可以配置在.env文件
  187. let prodMock = true
  188. return {
  189. plugins: [
  190. viteMockServe({
  191. mockPath: 'mock',
  192. localEnabled: command === 'serve',
  193. prodEnabled: command !== 'serve' && prodMock,
  194. // 这样可以控制关闭mock的时候不让mock打包到最终代码内
  195. injectCode: `
  196. import { setupProdMockServer } from './mockProdServer';
  197. setupProdMockServer();
  198. `,
  199. }),
  200. ],
  201. }
  202. }
  203. ```
  204. ### 示例
  205. **运行示例**
  206. ```bash
  207. # ts example
  208. cd ./examples/ts-examples
  209. yarn install
  210. yarn serve
  211. # js example
  212. cd ./examples/js-examples
  213. yarn install
  214. yarn serve
  215. ```
  216. ## 示例项目
  217. [Vben Admin](https://github.com/anncwb/vue-vben-admin)
  218. ## 注意事项
  219. - 无法在 mock.ts 文件中使用 node 模块,否则生产环境将失败
  220. - 模拟数据如果用于生产环境,仅适用于某些测试环境。 不要在正式环境中打开它,以避免不必要的错误。 同时,在生产环境中,它可能会影响正常的 Ajax 请求,例如文件上传/下载失败等。
  221. ## License
  222. MIT
  223. [npm-img]: https://img.shields.io/npm/v/vite-plugin-mock.svg
  224. [npm-url]: https://npmjs.com/package/vite-plugin-mock
  225. [node-img]: https://img.shields.io/node/v/vite-plugin-mock.svg
  226. [node-url]: https://nodejs.org/en/about/releases/