不能直接用原版mockjs,因其依赖Node.js的Buffer、require等全局对象,而小程序运行在WebView/JSCore中缺失这些;应使用better-mock或手动轻量mock。

uni-app 里用 Mock.js 模拟接口,核心就一条:别直接在小程序平台跑原版 mockjs,得换 better-mock 或手动适配——否则真机或微信开发者工具里会报 require is not defined 或 Buffer is not defined。
为什么不能直接 npm install mockjs?
原版 mockjs 依赖 Node.js 环境的 Buffer、require、正则扩展等,而 uni-app 小程序端运行在 WebView 或 JSCore 中,没有这些全局对象。H5 端虽然能跑,但跨平台项目一旦编译到小程序就会挂掉。
所以实际能用的只有两个选择:
-
better-mock:专为 uni-app / 小程序优化的分支,提供了dist/mock.mp.js这个小程序友好版本 - 自己写轻量 mock 逻辑(比如用
Math.random()+ 条件返回),不依赖任何包
推荐前者,省事且兼容性明确。
怎么装和引入 better-mock?
执行安装命令:npm install better-mock --save-dev(注意不是 mockjs)。
在项目根目录新建 mock/index.js,内容必须用小程序兼容写法:
const Mock = require('better-mock/dist/mock.mp.js')
// 注意:路径前缀不要带 http://,mock 会自动匹配 uni.request 的 url
Mock.mock('/api/user/list', 'GET', {
code: 200,
data: {
list: [
{ id: 1, name: '@cname', avatar: '@image(100x100)' }
]
}
})
Mock.mock('/api/login', 'POST', (options) => {
const body = JSON.parse(options.body)
return {
code: body.password === '123456' ? 200 : 400,
msg: body.password === '123456' ? 'ok' : '密码错误',
data: body.password === '123456' ? { token: '@guid' } : null
}
})
关键点:
- 路径用相对路径(如
/api/xxx),不要写完整 URL;uni.request发请求时也保持同样前缀 - POST 请求要用函数形式接收
options,手动解析options.body - 小程序平台必须用
require('better-mock/dist/mock.mp.js'),不能用 ES Module 导入
如何让 mock 在开发时生效、上线时自动关闭?
不能把 mock/index.js 直接塞进 main.js 全局引入——那样打包后也会运行 mock,影响真实接口。
正确做法是加一层环境判断:
// main.js
if (process.env.NODE_ENV === 'development') {
require('./mock/index.js')
}
或者更稳妥地,在条件编译里控制(uni-app 推荐):
// main.js
// #ifdef H5 || MP-WEIXIN
if (process.env.NODE_ENV === 'development') {
require('./mock/index.js')
}
// #endif
这样打包成生产环境(npm run build:mp-weixin)时,mock 代码根本不会进入包体。
uni.request 被 mock 拦截后,返回结构和真实接口不一致怎么办?
better-mock 拦截的是底层 uni.request 调用,但它只改响应体,不改响应结构。也就是说,mock 返回的是 { statusCode: 200, data: {...} },而你封装的 request 工具可能默认读 res.data.data,结果拿到 undefined。
这时候要检查你的封装逻辑是否假设了「后端一定返回 { code, data, msg }」。mock 数据必须严格匹配这个结构,否则业务层会崩。
示例对比:
- ❌ 错误 mock:
Mock.mock('/api/test', { list: [] })→ 返回res.data = { list: [] },但你的代码 expectres.data.data - ✅ 正确 mock:
Mock.mock('/api/test', { code: 200, data: { list: [] }, msg: 'success' })
最容易被忽略的一点:mock 规则注册顺序无关紧要,但路径匹配是**完全精确匹配 + 支持正则**。如果你写了 Mock.mock('/api/user', ...),但请求发的是 /api/user/123,那它不会命中——得写成 Mock.mock(/\/api\/user\/\d+/, ...) 或显式注册完整路径。


















