在前后端分离的开发中,需要前后端同时开发,但是在后端完成前,暂时是没有数据返回给前端使用的,如果先写静态后面再改,就有重复工作的内耗存在。
所以我们需要一种简单快速的模拟数据的模块,本文选的是mockjs。
步骤:
- 安装mockjs
npm install mockjs
- 在项目的src文件夹下建mock文件夹,在mock文件夹下建index.js(存放模拟的接口数据)
import Mock from 'mockjs'; const vehicle = Mock.mock( '/api/car', 'post', (req, res) => { return { code: 200, data: [{ id: 1, name: 'BYD', }, { id: 1, name: 'baojun', }], message: '查询成功' } }) const user = Mock.mock( '/api/user', 'get', (req, res) => { return { code: 200, data: { id: 1, sex: 1, age: 25, createTime: '2017-04-01' }, message: '查询成功' } }) export default { vehicle, user }
- 为了方便在所有组件中使用mock模拟数据在项目的main.js中导入刚编辑的接口数据
import mockdata from "./mock"; //这样的话组件里就可以随意调用接口了
- 在组件中调用虚拟接口
在生命周期钩子函数中调用接口即可:
如使用axios 一个按钮执行点击事件,下面方法调接口
<button @click="search()">点击查询</button>
methods: { search() { this.$http.get("/api/user").then(res => { console.log(res); }); this.$http.post("/api/car").then(res => { console.log(res); }); } },
5. 在项目接口调试完成后需要删除main.js中对于mock的引用,以及mock/index.js这些模拟的资源,从而组件中不用做任何修改,最大减少重复工作量
如何使用mock
- 安装mockjs npm install --save-dev mockjs 或 npm install -D mockjs
- 根目录src中添加mock文件夹,如下图结构
- index.js
import Mock from 'mockjs' import { Service } from './data/service' Mock.mock(/\/Service\/ServiceList/, 'get', Service ) console.log('%c前端 mock 环境启动成功', 'color: #38f;font-weight: bold') export default Mock
- service.js
mock模拟返回的数据
import Mock from 'mockjs'; const Service = []; for (let i = 0; i < 5; i++) { Service.push(Mock.mock({ id: Mock.Random.guid(), serviceName: `${Mock.Random.protocol()} --${Mock.Random.id()}`, 'port|8000-9000': 1, ip: Mock.Random.ip(), status: Mock.Random.pick(['passing', 'Critical', 'critical','null']), 'node|0-2': 1 })); } export default Service;
- 在main.js中引入定义的mock文件夹
import Mock from './mock'
打开终端控制面板,运行 npm run dev 后,打开开发者调试工具的console,可见
4. 发送的所有http请求均会被mock拦截,如果匹配到与mock中设置的url路径一致 /Service/ServiceList 就会将service.js的模拟出的数据返回,如下
import axios from "axios"; export default { data() { return { }; }, methods: { getServer() { axios .get('/Service/ServiceList') .then((res) => { console.log(res); }) .catch((error) => { console.log(error); }); } }, };
如上图,可以看出已经将发送给该url的请求匹配拦截并返回了一个对象,可以定义一个空数组将res.data的数据保存起来,到页面进行渲染
- 如果发送http请求的url与mock中定义的不匹配或不存在的话,就会弹出报错
注意:mock会拦截所有http请求,包括要请求的真实API,也会拦截,提示404报错;此时将main.js中的引入的 import Mock from ‘./mock’ 注释掉就好了
mock无侵入式配置
如何将mock在项目代码中分离,既能保证前后端分离开发,又能在不改代码的情况下任意切换环境;
用vue-cli搭建好的项目框架中,会有直接配置好的 npm run dev 和 npm run build 环境;
那就再配置一套dev环境,重命名为mock,后期直接通过 npm run mock 和 npm run dev 一条指令随意切换代码运行环境
- 用vue-cli搭建好的项目框架,打开 package.json 文件,添加运行脚本
"mock": "webpack-dev-server --inline --progress --config build/webpack.mock.conf.js"
"scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "mock": "webpack-dev-server --inline --progress --config build/webpack.mock.conf.js", //---此条脚本就是需要配置的参数,注意json文件中不能写注释,切勿复制此句话 "start": "npm run dev", "lint": "eslint --ext .js,.vue src", "build": "node build/build.js" },
- 在根目录下的build文件夹中创建 webpack.mock.conf.js 文件,并将 webpack.dev.conf.js 的文件内容全部复制过来
- 在 webpack.mock.conf.js 中添加配置,如下
let entry = baseWebpackConfig.entry Object.keys(entry).forEach(function (name) { entry[name] = ['./src/mock'].concat(entry[name]) //---在运行npm run mock时将mock这个文件在entry中打包编译进来 })
保存好后,打开终端运行 npm run mock
后期如果需要与后台调试接口了,直接运行 npm run dev 即可切换过来,保证了mock在业务代码中抽离出
注意 :在 webpack.mock.config.js 中配置了entry后,是不需要在main.js中再引入Mock的