vue-admin-template 中 mock-server 的用法
简单记录一下 vue-admin-template 中 mock-server 的用法。
最近刚接触一个 vue 项目。发现该项目是基于 vue-admin-template 的,但并没有很好地利用 vue-admin-template 的 Mock Data 功能。这个功能正好能解决我目前的痛点:后台接口预计很久之后才能给到,而缺少接口的情况下前端页面中很多边边角角的工作并不好处理。
所以我了解了下如何使用在 vue-admin-template 中模拟数据。
vue-admin-template 提供两种模拟方式:
- 本地模拟 - 这是使用 mockjs 进行纯前端模拟。其原理是拦截了所有的请求并代理到本地,然后进行数据模拟。大部分情况下够用,但有几个问题:一是调试工具中看不到网络数据;二是s可能影响依赖
XMLHttpRequest
的库 - 线上模拟 - 本地启动一个 mock-server 来模拟数据,其模拟数据仍然来自 mockjs
我们重点看线上模拟这种方式。
配置和用法
先安装 mockjs
和 chokidar
:
1 | npm install mockjs |
官方 Wiki 提到的配置方式如下:
1 | proxy: { |
但这个文档较旧,跟当前最新源码 中的配置有较大差异。源码的配置如下:
1 | devServer: { |
注意之前的 after
变成了 before
,并且不再需要为 devServer 配置 proxy 了。
之后就可以在 mock
目录下写模拟数据了。
mock
目录下各个文件的作用如下:
mock-server.js
- mock-server 的源码index.js
- 引入用到的模拟数据文件- 其他 js 文件 - 模拟数据文件
mock
目录下各个文件的依赖关系如下:
1 | mock-server.js |
来看一个实例。
第一步,在 register.js
文件中定义一条模拟数据:
1 | export default [ |
第二步,在 index.js
文件引入 register.js
:
1 | import register from './register' |
第三步,在 vue 文件中请求上面定义的模拟数据:
1 | post({ |
注意这里的 post()
方法用到一个 axios
实例,该 axios
实例的 baseUrl 为 https://localhost/dev-api
。所以模拟请求的目标地址为 https://localhost/dev-api/cm/reg/sendcode
。如下图,
遇到的问题
mock-server 有一个很赞的功能,每次修改 mock
目录下文件后,mock-server 会执行 hot reload,重新加载最新的数据。如下图,注意可以看到 “Mock Server hot reload success!”
但我遇到一个小坑,无论如何修改 mock
目录下的文件都不会出现 hot reload。
反复检查后发现,我目前开发的这个 vue 项目虽然是基于 vue-admin-template 的,但是将原始工程中的部分源文件路径调整了。其中一个调整是将 mock
调整成 src/mock
。
1 | const mockDir = path.join(process.cwd(), 'mock') |
但 mock-server 监听的是 cwd 中的 mock
目录,所以修改 mock
目录中的模拟数据文件后,无法 hot reload。解决办法很简单,调整一下路径,改成监听 cwd 中的 src/mock
目录即可。
1 | const mockDir = path.join(process.cwd(), 'src/mock') |
其他可能遇到的问题见 issues