由于 vue-element-admin 是一个纯前端个人项目,所有的数据都是用 mockjs 模拟生成。它的原理是: 拦截了所有的请求并代理到本地,然后进行数据模拟,所以你会发现 network
中没有发出任何的请求。
但它的最大的问题是就是它的实现机制。它会重写浏览器的XMLHttpRequest
对象,从而才能拦截所有请求,代理到本地。大部分情况下用起来还是蛮方便的,但就因为它重写了XMLHttpRequest
对象,所以比如progress
方法,或者一些底层依赖XMLHttpRequest
的库都会和它发生不兼容,可以看一下我项目的issues,就知道多少人被坑了。
它还有一个问题是,因为是它本地模拟的数据,实际上不会走任何网络请求。所以本地调试起来很蛋疼,只能通过console.log
来调试。就拿vue-element-admin
来说,想搞清楚 getInfo()
接口返回了什么数据,只能通过看源码或者手动 Debug
才能知道。
#新方案 v4.0.0+
在v4.0
版本之后,在本地会启动一个mock-server
来模拟数据,线上环境还是继续使用mockjs
来进行模拟(因为本项目是一个纯前端项目,你也可以自己搭建一个线上 server 来提供数据)。不管是本地还是线上所以的数据模拟都是基于mockjs
生成的,所以只要写一套 mock 数据,就可以在多环境中使用。
该方案的好处是,在保留 mockjs
的优势的同时,解决之前的痛点。由于我们的 mock 是完全基于webpack-dev-serve
来实现的,所以在你启动前端服务的同时,mock-server
就会自动启动,而且这里还通过 chokidar 来观察 mock
文件夹内容的变化。在发生变化时会清除之前注册的mock-api
接口,重新动态挂载新的接口,从而支持热更新。有兴趣的可以自己看一下代码mock-server.js。由于是一个真正的server
,所以你可以通过控制台中的network
,清楚的知道接口返回的数据结构。并且同时解决了之前mockjs
会重写 XMLHttpRequest
对象,导致很多第三方库失效的问题。
本项目的所有请求都是通过封装的request.js进行发送的,通过阅读源码可以发现所有的请求都设置了一个baseURL
,而这个baseURL
又是通过读取process.env.VUE_APP_BASE_API
这个环境变量来动态设置的,这样方便我们做到不同环境使用不同的 api
地址。
http://www.jellytoyboy.cn
http://www.royalemmy.cn
http://www.eminis.cn
http://www.liancans.cn
http://www.chunyus.cn
http://www.joefurai.cn
http://www.ferzige.cn
http://www.miccbeirn.cn
http://www.tangmufangs.cn
http://www.nalthai.cn
http://www.weishas.cn
http://www.lackwars.cn