前后端分离之数据Mock
文章内容整理于互联网,方便学习
# 一、学前预热
为了做到前后端并行开发,数据
mock就成为环境搭建的重要一环
# 1.1 Web应用前后端分离
- 后台向前台提供
API接口,只负责数据的提供和计算,而完全不处理展现 - 前台通过
Http(Ajax)请求获取数据, 在浏览器端动态构建界面显示数据
# 1.2 利用Node+express提供模拟数据
- 优点:可以在浏览器端访问
- 缺点:如果是打包发布就无法访问模拟数据, 只能是测试时使用
修改build/dev-server.js
//加载json数据
var apiData = require('../src/mock/data.json')
var home = apiData.home;
//得到路由器
var apiRouter = express.Router()
//注册路由
apiRouter.get('/home', function (req, res) {
res.json({
code: 0, //0代表正确数据
data: seller
})
})
//启用路由
app.use('/api', apiRouter)
//访问http://localhost:8080/api/home
@前端进阶之旅: 代码已经复制到剪贴板
# 1.3 利用mockjs提供模拟数据
Mockjs: 用来拦截ajax请求, 生成随机数据返回
- 优点:不可以在浏览器端访问
- 缺点:打包发布运行模拟接口也是可以用的
import Mock from 'mockjs'
import apiData from './data.json'
Mock.mock('/api2/seller', {code:0, data:apiData.seller})
Mock.mock('/api2/goods', {code:0, data:apiData.goods})
Mock.mock('/api2/ratings', {code:0, data:apiData.ratings})
@前端进阶之旅: 代码已经复制到剪贴板
# 1.4 使用postman工具测试接口
postman是用来测试API接口的chrome插件postman也是一个活接口文档
# 1.5 ajax请求mock数据接口
vue-resource是用于ajax请求的vue插件axios是浏览器/服务器端通用的ajax请求库
//使用示例
import VueResource from 'vue-resource'
Vue.use(VueResource)
//组件对象多了$http属性, 使用它发送ajax请求
this.$http.get('/api2/seller').then((response) => {
console.log(response.body)
}, (response) => {
console.log('失败了')
})
import axios from 'axios'
axios.get('/api2/seller').then((response) => {
console.log(response.body)
}, (response) => {
console.log('失败了')
})
@前端进阶之旅: 代码已经复制到剪贴板
# 二、数据mock思路
- 在
client端处数据mock - 在
server端mock
- 第一种方式拦截了请求的发出,直接返回
mock的数据,而第二种方式请求则真实地发出,只是在server端进行route拦截- 前后端分离的方式,就是在传统开发模式中加了一个
node层,这样数据mock完全可以在node server端完成,基本思路如下

# 2.1 mock思路说明
- 只有线下开发模式,才会需要进行数据
mock - 根据请求的
url,拼接形成一个file path - 为了避免
node缓存,删除require.cache(path) - 读取
require(path),如果该文件不存在或读取失败,则跳转到失败路由。这样简单的数据mock就实现了
# 2.2 代码描述
// 伪代码
if (process.env.NODE_ENV === 'development') {
router.set('/api/*', mockapi)
}
function mockapi(req, res, opts) {
var basePath = url.parse(req.url).pathname;
try {
var findPath = require.resolve(prefixPath + basePath + '.js');
delete require.cache[findPath]
var result = require(findPath);
} catch (err) {
return next(err);
}
if (typeof result === 'function') {
return result(req, res, opts);
}
if (typeof result.status === 'undefined' || typeof result.body === 'undefined') {
next(new Error('status 或 body 不存在'))
return;
}
res.writeHead(result.status, {
'Content-Type': 'application/json;charset=UTF-8'
});
res.write(JSON.stringify(result.body))
res.end();
cb()
}
@前端进阶之旅: 代码已经复制到剪贴板
# 三、Mock.js使用详解
# 3.1 Mock.js实现的功能
- 让前端攻城师独立于后端进行开发
- 通过随机数据,模拟各种场景
- 不需要修改既有代码,就可以拦截
Ajax请求,返回模拟的响应数据 - 支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。
# 3.2 Mock安装
# 3.2.1 Node下使用
# 安装
npm install mockjs
@前端进阶之旅: 代码已经复制到剪贴板
// 使用 Mock
var Mock = require('mockjs')
var data = Mock.mock({
// 属性 list 的值是一个数组,其中含有 1 到 10 个元素
'list|1-10': [{
// 属性 id 是一个自增数,起始值为 1,每次增 1
'id|+1': 1
}]
})
// 输出结果
console.log(JSON.stringify(data, null, 4))
@前端进阶之旅: 代码已经复制到剪贴板
# 3.2.2 RequireJS (AMD)
// 配置 Mock 路径
require.config({
paths: {
mock: 'http://mockjs.com/dist/mock'
}
})
// 加载 Mock
require(['mock'], function(Mock){
// 使用 Mock
var data = Mock.mock({
'list|1-10': [{
'id|+1': 1
}]
})
// 输出结果
document.body.innerHTML +=
'<pre>' +
JSON.stringify(data, null, 4) +
'</pre>'
})
@前端进阶之旅: 代码已经复制到剪贴板
# 3.3 使用语法
Mock.js的语法规范包括两部分- 数据模板定义规范
- 数据占位符定义规范
# 3.3.1 数据模板定义规范
- 数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值
// 属性名 name
// 生成规则 rule
// 属性值 value
'name|rule': value
@前端进阶之旅: 代码已经复制到剪贴板
-
属性名 和 生成规则 之间用竖线
|分隔 -
生成规则 是可选的
-
生成规则 有 7 种格式
'name|min-max': value'name|count': value'name|min-max.dmin-dmax': value'name|min-max.dcount': value'name|count.dmin-dmax': value'name|count.dcount': value'name|+step': value
-
生成规则 的 含义 需要依赖 属性值的类型 才能确定
-
属性值 中可以含有
@占位符 -
属性值 还指定了最终值的初始值和类型
# 3.3.2 生成规则和示例
-
属性值是字符串
String'name|min-max': string- 通过重复
string生成一个字符串,重复次数大于等于min,小于等于max
- 通过重复
'name|count': string- 通过重复
string生成一个字符串,重复次数等于count。
- 通过重复
-
属性值是数字
Number'name|+1': number- 属性值自动加
1,初始值为number
- 属性值自动加
'name|min-max': number- 生成一个大于等于
min、小于等于max的整数,属性值number只是用来确定类型
- 生成一个大于等于
'name|min-max.dmin-dmax': number- 生成一个浮点数,整数部分大于等于
min、小于等于max,小数部分保留dmin到dmax位
- 生成一个浮点数,整数部分大于等于
Mock.mock({
'number1|1-100.1-10': 1,
'number2|123.1-10': 1,
'number3|123.3': 1,
'number4|123.10': 1.123
})
// =>
{
"number1": 12.92,
"number2": 123.51,
"number3": 123.777,
"number4": 123.1231091814
}
@前端进阶之旅: 代码已经复制到剪贴板
-
属性值是布尔型
Boolean'name|1': boolean- 随机生成一个布尔值,值为
true的概率是1/2,值为false的概率同样是1/2
- 随机生成一个布尔值,值为
'name|min-max': value- 随机生成一个布尔值,值为
value的概率是min / (min + max),值为!value的概率是max / (min + max)\
- 随机生成一个布尔值,值为
-
属性值是对象
Object'name|count': object- 从属性值
object中随机选取count个属性
- 从属性值
'name|min-max': object- 从属性值
object中随机选取min到max个属性
- 从属性值
-
属性值是数组
Array'name|1': array- 从属性值
array中随机选取1个元素,作为最终值
- 从属性值
'name|+1': array- 从属性值
array中顺序选取1个元素,作为最终值
- 从属性值
'name|min-max': array- 通过重复属性值
array生成一个新数组,重复次数大于等于min,小于等于max
- 通过重复属性值
'name|count': array- 通过重复属性值
array生成一个新数组,重复次数为count
- 通过重复属性值
-
属性值是函数
Function'name': function- 执行函数
function,取其返回值作为最终的属性值,函数的上下文为属性'name'所在的对象
- 执行函数
-
属性值是正则表达式
RegExp'name': regexp- 根据正则表达式
regexp反向生成可以匹配它的字符串。用于生成自定义格式的字符串
- 根据正则表达式
# 3.3.3 数据占位符定义规范
占位符,只是在属性值字符串中占个位置,并不出现在最终的属性值中
- 占位符 的格式为
@占位符
@占位符(参数 [, 参数])
@前端进阶之旅: 代码已经复制到剪贴板
# 3.4 Mock.mock()
- 根据数据模板生成模拟数据
搭建主要思路
- 启动服务
