懂得什么是mock
明白mock的基本用法
了解json5的作用
会使用mock和vue-cli结合
会把mock应用于原生、jquery中的ajax请求
Mock.js,生成随机数据,拦截Ajax请求
当前端工程师要独立于后端并行开发时,后端接口还没有完成(只有后端提供参考的接口文档),那么前端怎么获取数据。
前端自己搭建web server自己模拟假数据,为了使数据更接近于实际需求,那么我们就用到了第三方库mockjs来生成随机数据,拦截Ajax请求
最后当后端接口完全实现,前端工程师只需移除Mock模拟的接口数据即可
图解:mock、json5、devServer、axios的职责
vue脚手架会让我们在创建vue项目时,方便快捷且高效,对于vue脚手架的了解,get一下此文章vue脚手架
注意:上述依赖仅用于mock模拟数据,对于其他功能,需安装相应依赖
代码:
const Mock = require('mockjs')
const obj = Mock.mock({
id: "@id", //获取随机的id对象
cname: "@cname()", //随机生成中文名称
date: "@date", //随机生成日期
avatar: "@image('200*200','red','#fff','avatar')", //生成图片且含参数
description: "@paragraph()", //生成内容描述
ip: "@ip", //IP地址
email: "@email()" //email
})
console.log(obj)
什么是json5
json5为json的扩展,在json的基础上新增了强大的功能
本文为何使用json5
{
id: "@id", //获取随机的id对象
cname: "@cname()", //随机生成中文名称
date: "@date", //随机生成日期
avatar: "@image('200*200','red','#fff','avatar')", //生成图片且含参数
description: "@paragraph()", //生成内容描述
ip: "@ip", //IP地址
email: "@email()", //email
}
const fs = require('fs') // 引入文件读取模块
const path = require('path') // 引入路径模块
const JSON5 = require('json5') // 引入json5模块
const json = fs.readFileSync(path.join(__dirname, './userInfo.json5'), 'utf-8') // 对本地json5文件进行读取
var obj = JSON5.parse(json) // 将读取的字符串转换为json对象
console.log(obj)
运行testJSON5.js(读取数据为json格式)
要想在vue项目中使用mock,就要在devServer启动服务之前(devServer:{before:}),对其进行拦截,让mock生效(请求自己本地的mock数据
const fs = require('fs')
const path = require('path')
const Mock = require('mockjs')
const JSON5 = require('json5')
function getJsonFile(filePath) { // 读取json文件
var json = fs.readFileSync(path.join(__dirname, filePath), 'utf-8') // 读取指定json文件
return JSON5.parse(json) // 解析并返回
}
// 返回一个函数
module.exports = function(app) {
// 对环境变量进行判断
if (process.env.MOCK == 'true') {
app.get('/user/userInfo', (req, res) => { //发送http请求
// 每次响应时读取mock可以随机生成的json文件
// getJsonFile方法定义了如何读取json文件并解析成数据对象
var json = getJsonFile('./userInfo.json5')
res.json(Mock.mock(json))
})
}
}
注意:webpack启动服务时,任何请求都会被devServer.before
中间件拦截,我们在此时可做一系列操作,操作完成后其他中间件才开始工作
调整webpack配置最简单的方式就是在 vue.config.js中的 configureWebpack 选项提供一个对象,该对象将会被webpack-merge合并入最终的webpack配置
module.exports = {
devServer: {
before: require('./mock/index.js') //引入文件
}
}
<script>
import axios from 'axios'
export default {
name: 'HelloWorld',
props: {
msg: String
},
mounted(){
axios.get('/user/userInfo')
.then(doc=>{
console.log(doc)
})
.catch(err=>{
console.log(err)
})
}
}
</script>
注意:此处生成的数据会随着index.js中内容的改变来动态变化
综上:使用Mock成功在vue项目中模拟了接口数据
MOCK=true
图解:
注意:mock.js下载地址:https://github.com/nuysoft/Mock/blob/160173f6ab95e13f82bf63c0b301926447e7e106/dist/mock-min.js
Mock.mock('/user/userInfo', 'get', {
id: "@id", //获取随机的id对象
cname: "@cname()", //随机生成中文名称
date: "@date", //随机生成日期
avatar: "@image('200*200','red','#fff','avatar')", //生成图片且含参数
description: "@paragraph()", //生成内容描述
ip: "@ip", //IP地址
email: "@email()" //email
})
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/jquery.min.js"></script>
<script src="js/mock-min.js"></script>
</head>
<body>
</body>
<script src="./mock/mock.js"></script>
<script>
$.ajax({
url: '/user/userInfo',
dataType: 'json',
success: function(data) {
console.log(data)
}
})
</script>
</html>
打开页面(发送请求)