前端开发常常须要等待后端的接口,严重影响了开发效率,咱们通常采用mock方式来避免这个问题。本人参考了大量文章,结合本身的经验,给出本身在mock上的一些理解。前端
何为mock,我认为mock主要就是经过正常请求
在后端接口进度落后
的状况下,还
能获取到和后端约定数据结构同样的模拟数据
的一门技术,以免后端接口进度滞后影响咱们正常的开发。
mock可能会涉及到4门技术,分别是服务端技术、随机生成特定格式数据的技术、请求转发、请求拦截。vue
将模拟数据直接写在代码里
优势:简单暴力
缺点:改变了代码原有逻辑,且耦合度高,当后端接口完成的时候还须要再改代码。node
mockjs
mockjs经过改写ajax函数来实现拦截请求,同时它还能伪造各类随机数据,经过mockjs咱们能很方便的实现简单的mock效果,
优势:简单方便
缺点:在chrome里面无法看请求(查看传递的参数是否正确),不支持fetch(须要额外调用插件)
webpack
Mock.mock('/api/news', { name: 'Jack', 'age|10-20': 10 });
Charles、 Fiddler 、postman
利用 Charles、 Fiddler 等代理工具拦截请求
优势:有真实的请求
缺点:配置上优势复杂ios
node/express/json-server + mockjs/fakejs
Mock Server简单的说就是起一个服务器,服务器提供接口产生相应的mock数据
前者用来起服务,后者用来产生模拟数据。
json-server是对express的一个封装,用于快速构建服务器而不用写后台代码这里重点注意一下,对于通常的项目咱们能够用json-server起一个服务,可是若是是在vue-cli之类的webpack生成的项目里面,实际上webpack已经帮咱们起了一个服务,咱们能够在webpack的devServer.before里面进行配置。固然你要不嫌麻烦,能够用proxy代理到本身到json-server起的服务上....
web
devServer: { // proxy: { //额外起一个服务,而后进行转发 // '/api': { // target: 'json-server服务的ip:端口号', // pathRewrite: { '/api': '' } // } // } before: function(app) { //直接用devserver这个服务 app.get('/api/news', function(req, res) { res.json({ msg: 'dev-before' }) }) } }
优势:真实,低耦合,可扩展
缺点:后端参与较少ajax
RAP/Easy-Mock
对于小型开发团队的话,Mock Server或者mockjs彻底够了,由于此时先后端沟通代价比较小。可是若是是大型开发团队呢,这时候,文档的编写,接口的变动,通知到每个人,代价就比较大了。
这也是RAP,Easy-Mock这类mock平台由来的缘由。
优势:接口代理,协同编辑,mock数据,智能提醒,自动生成文档
缺点:你要说服后端使用它chrome
这里就假设咱们用devServer.before + mock.js来开发
假设后端要开发两个接口 www.test/api/news/, www.test/api/price/
3.1 后端开没开动
咱们在devServer虚拟两个接口vue-cli
//在devserver里面配置before进行接口拦截 devServer: { before: function(app) { app.get('www.test/api1/news', function(req, res) { //只对api1进行拦截 res.json({ mockjs产生的模拟数据 }) }) app.get('www.test/api1/price', function(req, res) { //只对api1进行拦截 res.json({ mockjs产生的模拟数据 }) }) } }
//在/src/api/index.js里面 const getNews = axios.get(www.test/api1/news) const getPrice = axios.get(www.test/api1/price) export { getNews,getPrice } // 因为/api1会被before拦截从而获得mock数据,没有问题
3.2 后端开发了部分接口,好比www.test/api/news/开发完毕express
//在/src/api/index.js里面修改/api1为/api const getNews = axios.get(www.test/api/news) //此时这个请求不会被拦截,走真实接口,而未开发完的接口请求仍是走模拟数据接口
3.3 后端所有开发完毕
所有将/api1修改成/api,同时注释掉devserver.before
固然,这个拦截功能也能够直接用mockjs来作,步骤差很少,可是更简单
现阶段暂时没法接口联动
,也就是对于前端来讲,接口变动或者开发完成,还须要手动在ide上修改代码。若是可以开发一套插件,前端只需初始编写一次代码,后面ide自动同步接口变化,而后自动修改代码,不是爽歪歪!
今天关于前端mock的介绍就到这里,具体的代码实现能够自行google。因为做者刚参加工做,水平有限,若是哪里写到不对,请评论指出。
中小型项目,推荐使用mockjs或者devServer.before,若是项目比较大,多人协做,仍是建议使用在线mock平台。