# vite-plugin-mock-dev-server
**Repository Path**: pengzb/vite-plugin-mock-dev-server
## Basic Information
- **Project Name**: vite-plugin-mock-dev-server
- **Description**: Mock-dev-server is injected into the vite development environment to simulate API request and response data
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: https://vite-plugin-mock-dev-server.netlify.app/
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2023-02-17
- **Last Updated**: 2025-04-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vite-plugin-mock-dev-server
vite mock开发服务(mock-dev-server)插件。
在 vite 开发环境中,注入一个 mock-dev-server。
English | 简体中文
## 特性
- ⚡️ 轻量,灵活,快速
- 🧲 非注入式,对客户端代码无侵入
- 💡 ESModule/commonjs
- 🦾 Typescript
- 🔥 热更新
- 🏷 支持 `.[cm]?js` / `.ts` / `.json` / `.json5` 编写 mock 数据
- 📦 自动加载 mock 文件
- 🎨 可选择你喜欢的任意用于生成mock数据库,如 `mockjs`,或者不使用其他库
- 📥 路径规则匹配,请求参数匹配
- ⚙️ 随意开启或关闭对某个接口的 mock配置
- 📀 支持多种响应体数据类型,包括 `text/json/buffer/stream`.
- ⚖️ 使用 `server.proxy` 配置
- 🍕 支持在 mock文件中使用 `viteConfig.define`配置字段 和 `env` 环境变量
- ⚓️ 支持在 mock文件中使用 `viteConfig.resolve.alias` 路径别名
- 🌈 支持 `vite preview` 模式
- 📤 支持 multipart 类型,模拟文件上传
- 📥 支持模拟文件下载
- ⚜️ 支持模拟 `WebSocket` 和 `Server-Sent Events`
- 🗂 支持构建可独立部署的小型mock服务
## 文档
查看 [Documentation](https://vite-plugin-mock-dev-server.netlify.app/) 了解更多。
[](https://app.netlify.com/sites/vite-plugin-mock-dev-server/deploys)
## 安装
```sh
# npm
npm i -D vite-plugin-mock-dev-server
# yarn
yarn add vite-plugin-mock-dev-server
# pnpm
pnpm add -D vite-plugin-mock-dev-server
```
## 使用
`vite.config.ts`
```ts
import { defineConfig } from 'vite'
import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
export default defineConfig({
plugins: [
mockDevServerPlugin(),
],
// 这里定义的字段,在mock中也能使用
define: {},
server: {
// 插件将会读取 `server.proxy`
proxy: {
'^/api': { target: 'http://example.com' }
}
}
})
```
插件会读取 `server.proxy` 或 `options.prefix` 的配置,对匹配的 url 启用mock 匹配。
插件也会读取 `define` 配置, 支持在 mock 文件中直接使用。
## 编写mock文件
默认配置,在你的项目根目录的 `mock` 目录中编写mock数据:
`mock/**/*.mock.ts` :
```ts
import { defineMock } from 'vite-plugin-mock-dev-server'
export default defineMock({
url: '/api/test',
body: { a: 1, b: 2 }
})
```
## 方法
### mockDevServerPlugin(options)
vite 插件
`vite.config.ts`
```ts
import { defineConfig } from 'vite'
import mockDevServerPlugin from 'vite-plugin-mock-dev-server'
export default defineConfig({
plugins: [
mockDevServerPlugin({/* 插件配置 */}),
]
})
```
### defineMock(mockOptions)
Mock 配置类型帮助
``` ts
import { defineMock } from 'vite-plugin-mock-dev-server'
export default defineMock({
url: '/api/test',
body: {}
})
```
### createDefineMock(transformer)
返回一个自定义的 defineMock 函数,用于支持对 mock config 的预处理。
``` ts
import path from 'node:path'
import { createDefineMock } from 'vite-plugin-mock-dev-server'
// 预处理 mock url
const defineAPIMock = createDefineMock((mock) => {
mock.url = path.join('/api', mock.url)
})
export default defineApiMock({
url: '/test' // 补全为 '/api/test'
})
```
### createSSEStream(req, res)
创建一个 `Server-sent events` 写入流,用于支持模拟 `EventSource`。
``` ts
import { createSSEStream, defineMock } from 'vite-plugin-mock-dev-server'
export default defineMock({
url: '/api/sse',
response: (req, res) => {
const sse = createSSEStream(req, res)
sse.write({ event: 'message', data: { message: 'hello world' } })
sse.end()
}
})
```
## Plugin Options
### prefix
- **类型:** `string | string[]`
- **默认值:** `[]`
- **详情:**
为mock服务器配置自定义匹配规则。任何请求路径以 `prefix` 值开头的请求将被代理到对应的目标。如果 `prefix` 值以 `^` 开头,将被识别为 RegExp。
> 一般情况下, `server.proxy` 已经足够满足需求,添加此项是为了与某些场景兼容。
### wsPrefix
- **类型:** `string | string[]`
- **默认值:** `[]`
- **详情:**
配置 webSocket 服务 匹配规则。任何请求路径以 `wsPrefix` 值开头的 `ws/wss` 协议请求,将被代理到对应的目标。
如果`wsPrefix`值以 `^` 开头,将被识别为 RegExp。
> 与 http mock 默认使用 `viteConfig.server.proxy` 不同的是,`websocket mock` 不会使用 `viteConfig.server.proxy` 中的 ws 相关的配置,且配置在 `wsPrefix` 中的规则,不能同时配置在 `viteConfig.server.proxy`中,因为会导致在 vite 在启动服务时产生冲突,因为不能对同一个请求实现多个的 `WebSocketServer`实例。
> 该冲突既不是 `vite` 的问题,也不是插件的问题,这属于合理的错误类型。在进行 `WebSocket Mock`和 `WebSocket Proxy` 切换时,请注意配置不要出现重复导致冲突。
### cwd
- **类型:** `string`
- **默认值:** `process.cwd()`
- **详情:**
配置 `include` 和 `exclude` 的匹配上下文
### include
- **类型:** `string | string[]`
- **默认值:** `['mock/**/*.mock.{js,ts,cjs,mjs,json,json5}']` (相对于根目录)
- **详情:**
配置读取 mock文件,可以是一个 目录,glob,或者一个数组
### exclude
- **类型:** `string | string[]`
- **默认值:** `['**/node_modules/**', '**/.vscode/**', '**/.git/**']`
- **详情:**
配置读取 mock文件时,需要排除的文件, 可以是一个 目录、glob、或者一个数组
### reload
- **类型:** `boolean`
- **默认值:** `false`
- **详情:**
mock资源热更新时,仅更新了数据内容,但是默认不重新刷新页面。当你希望每次修改mock文件都刷新页面时,可以打开此选项。
### cors
- **类型:** `boolean | CorsOptions`
- **默认值:** `true`
- **详情:**
配置 `cors`, 查看 [cors](https://github.com/expressjs/cors#configuration-options)
### log
- **类型:** `boolean | 'info' | 'warn' | 'error' | 'silent' | 'debug'`
- **默认值:** `info`
- **详情:**
启动日志,以及配置日志打印级别
### formidableOptions
- **类型:** `formidable.Options`
- **详情:**
配置 `formidable`,查看 [formidable options](https://github.com/node-formidable/formidable#options)
**示例:** 配置文件上传的存放目录
```ts
MockDevServerPlugin({
formidableOptions: {
uploadDir: path.join(process.cwd(), 'uploads'),
}
})
```
### cookiesOptions
- **类型:** `cookies.Options`
- **详情:**
配置 `cookies`, 查看 [cookies](https://github.com/pillarjs/cookies#new-cookiesrequest-response--options)
### bodyParserOptions
- **类型:** `BodyParserOptions`
- **详情:**
配置 `co-body`, 查看 [co-body](https://github.com/cojs/co-body#options)
### build
- **类型:** `boolean | ServerBuildOptions`
- **默认值:**`false`
- **详情:**
需要构建可独立部署的小型mock服务时配置。
```ts
interface ServerBuildOptions {
/**
* 服务端口
* @default 8080
*/
serverPort?: number
/**
* 构建输出目录
* @default 'mockServer'
*/
dist?: string
/**
* 日志级别
* @default 'error'
*/
log?: LogLevel
}
```
### priority
- **类型:** `MockMatchPriority`
- **详情:**
自定义 路径匹配规则优先级。[查看更多](#自定义匹配优先级)
**默认值:** `undefined`
## Mock 配置
**http mock**
```ts
import { defineMock } from 'vite-plugin-mock-dev-server'
export default defineMock({
url: '/api/test',
body: { message: 'hello world' }
})
```
**websocket mock**
```ts
import { defineMock } from 'vite-plugin-mock-dev-server'
export default defineMock({
url: '/socket.io',
ws: true,
setup(wss) {
wss.on('connection', (ws, req) => {
console.log('connected')
})
}
})
```
### options.url
- **类型:** `string`
- **详情:**
需要进行 mock 的接口地址, 由 [path-to-regexp](https://github.com/pillarjs/path-to-regexp) 提供路径匹配支持。
### options.enabled
- **类型:** `boolean`
- **默认值:** `true`
- **详情:**
是否启动对该接口的mock,在多数场景下,我们仅需要对部分接口进行 mock,
而不是对所有配置了mock的请求进行全量mock,所以是否能够配置是否启用很重要
### options.method
- **类型:** `Method | Method[]`
```ts
type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'
```
- **默认值:** `['GET', 'POST']`
- **详情:**
该接口允许的 请求方法,默认同时支持 GET 和 POST
### options.type
- **类型:** `'text' | 'json' | 'buffer' | string`
- **详情:**
响应体数据类型。 还支持 [mime-db](https://github.com/jshttp/mime-db) 中的包含的类型。
当响应体返回的是一个文件,而你不确定应该使用哪个类型时,可以将文件名作为值传入,
插件内部会根据文件名后缀查找匹配的`content-type`。
### options.headers
- **类型:** `object | (request: MockRequest) => object | Promise