前端 mock 数据

Easy Mock

由于easy mock线上服务基本打不开的情况,所以有能力的还是做一下本地部署(参考)
在easymock创建一个项目,并将项目的 Base URL 配置到axios的 baseURL,easymock不需要解决跨域的问题。

Yapi

公司内部的话也可以做一下内网部署
用法和easymock差不多,将yapi内项目的mock地址配置到axios的baseURL,也不需要解决跨域的问题

vue cli3 配置本地 mock 数据

通过webpack的 devServer.before 来实现

module.exports = {//...devServer: {before: function(app, server) {app.get('/some/path', function(req, res) {res.json({ custom: 'response' });});}}
};

如果mock数据过多,我们可以单独建一个文件夹用来存放:
mock/login.js:

const loginMock = [{type: 'post',url: '/api/loginPost',res: function (req, res, next) {console.log(req.body)res.json({ "data": "post" })}},{type: 'get',url: '/api/loginGet',res: function (req, res, next) {console.log(req.query)res.json({ "data": "get" })}}
]module.exports = loginMock

mock/index.js:

module.exports = app => {// 使用Express中间件body-parser来解析请求体const bodyParser = require('body-parser')// 解析 application/jsonapp.use(bodyParser.json())// 解析 application/x-www-form-urlencodedapp.use(bodyParser.urlencoded({extended: true}))// 引入mock数据const loginMock = require('./login.js')const mocks = [...loginMock,...chartMock]for (const mock of mocks) {app[mock.type](mock.url, mock.res)}
}

vue.config.js:

module.exports = {...devServer: {...// 在服务器内部的所有其他中间件之前执行定制中间件before: require('./mock/index.js'),}
}

按这样配置完后,基本就完成了本地的数据mock。但有一点不足的就是不能够热更新。每当我们重新修改mock数据,需要重新启动服务才能看到最新的mock数据。
解决这个问题我们可以通过chokidar插件来监控mock文件夹的变化,在发生变化时会清除之前注册的mock-api接口,重新动态挂载新的接口,从而支持热更新。
修改mock/index.js:

const bodyParser = require('body-parser') // 使用Express中间件body-parser来解析请求体
const chokidar = require('chokidar') // 文件夹监控
const path = require('path')const mockDir = path.join(process.cwd(), 'mock') // 获取文件夹路径function registerRoutes(app) {let mockLastIndexconst baseMock = require('./base.js')const chartMock = require('./chart.js')const mocks = [...baseMock,...chartMock]for (const mock of mocks) {app[mock.type](mock.url, mock.res) // 在express中注册路由mockLastIndex = app._router.stack.length // 获取所有已注册路由的长度}const mockRoutesLength = Object.keys(mocks).length // 获取所有mock数据的长度return {mockRoutesLength: mockRoutesLength,mockStartIndex: mockLastIndex - mockRoutesLength}
}
// nodejs清除require缓存 参考:https://blog.hellozwh.com/?post=433
function unregisterRoutes() {Object.keys(require.cache).forEach(i => {if (i.includes(mockDir)) {delete require.cache[require.resolve(i)] // require.resolve 相当于把相对路径转化成绝对路径,避免了自己手写的绝对路径跟cache里的key不一致的问题}})
}module.exports = app => {// 解析 application/jsonapp.use(bodyParser.json())// 解析 application/x-www-form-urlencodedapp.use(bodyParser.urlencoded({extended: true}))const mockRoutes = registerRoutes(app)var mockRoutesLength = mockRoutes.mockRoutesLengthvar mockStartIndex = mockRoutes.mockStartIndexchokidar.watch(mockDir, { // 监控当前目录ignored: /index/, // 忽略index.js文件的变更ignoreInitial: true // 忽略对增加文件或者增加文件夹而触发事件}).on('all', (event, path) => { // 监听除了ready, raw, and error之外所有的事件类型if (event === 'change' || event === 'add') { // 文件内容改变或新增文件时触发try {// 删除已经挂载到express的路由app._router.stack.splice(mockStartIndex, mockRoutesLength)// clear routes cacheunregisterRoutes()const mockRoutes = registerRoutes(app)mockRoutesLength = mockRoutes.mockRoutesLengthmockStartIndex = mockRoutes.mockStartIndexconsole.log('请求更新!')} catch (error) {console.log('请求更新出错:', error)}}})
}

用node启动一个本地服务,来实现mock

在项目根目录建一个mockServer.js文件:

let express = require('express') // 引入express
let Mock = require('mockjs') // 引入mocklet app = express() // 实例化expressapp.use(function (req, res, next) {res.header('Access-Control-Allow-Origin', '*')res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS')res.header('Access-Control-Allow-Headers', 'X-Requested-With')res.header('Access-Control-Allow-Headers', 'Content-Type')next()
})
// mock接口示例
app.post('/api/loginPost', function (req, res) {res.json(Mock.mock({'status': 200,'data|1-9': [{'key|+1': 1,'mockTitle|1': ['肆无忌惮'],'mockContent|1': ['角色精湛主题略荒诞', '理由太短 是让人不安', '疑信参半 却无比期盼', '你的惯犯 圆满', '别让纠缠 显得 孤单'],'mockAction|1': ['下载', '试听', '喜欢']}]}))
})// 实际项目中肯定有很多mock接口,可以分类目建立,然后引入
const loginMock = require('./mock/login.js')
const chartMock = require('./mock/chart.js')
const mocks = [...loginMock,...chartMock
]
// 挂载这些接口
for (const mock of mocks) {app[mock.type](mock.url, mock.res)
}
// 启用一个端口并监听。注意不能和项目一个端口,会把项目停掉
app.listen('3001', () => {console.log('监听端口 3001')
})

在vue.config.js里配置跨域代理:

module.exports = {...devServer: {...// 跨域代理proxy: {'/web': {target: 'http://localhost:3001', // mockServer监听的端口号ws: false,changeOrigin: true}}}
}

在package.json里配置启动命令:

"scripts": {"mock": "node ./mockServer"
},

yarn mock启动mock服务

前端 mock 数据相关推荐

  1. 前端 mock 数据及工具介绍

    前端 mock 数据及工具介绍 阅读本文,需要有前端开发的简单知识,接下来我们分别从介绍 Mock 数据概念(what).为啥要 Mock(why).如何 mock(how).mock 工具等方面来展 ...

  2. 前端mock数据详细讲解

    在实际的项目研发过程中,我们经常会遇到如下的尴尬场景: 前端开发依赖于后端接口数据,但是后台人员不足或者无法立即到位,前端迟迟不能开工,或者前端小伙子自己参照ui设计图,完成对应的静态页面(没有数据交 ...

  3. 前端mock数据(超级详细)

    在实际的项目研发过程中,我们经常会遇到如下的尴尬场景: 前端开发依赖于后端接口数据,但是后台人员不足或者无法立即到位,前端迟迟不能开工,或者前端小伙子自己参照ui设计图,完成对应的静态页面(没有数据交 ...

  4. 前端mock数据 - mockjs

    mockjs简介 Mock.js is a simulation data generator to help the front-end to develop and prototype separ ...

  5. vue前端用服务器上路径的图片展示_5分钟教你用nodeJS手写一个mock数据服务器

    对于前端开发者而言,javascript正扮演着越来越重要的地位,它不仅能为浏览器端赋能,在web服务器方面也有很大的价值(我们可以用nodeJS来写服务端代码,启动web服务器),因此本文所要描述的 ...

  6. 小程序高级电商前端第1周走进Web全栈工程师一----小程序注册、开发工具推荐、《风袖》首页布局详尽分析、Webstorm开发小程序必配配置、mock数据...

    接下来开启一门全新的课程的学习,其实这是去年6月份所记录的,只是木有公开,然后到目前为止已经间隔了快1年没管了,基本上是已经快放弃的节奏,但是呢它又是我一直特别想学习的,所以决定公开,鞭策自己得继续前 ...

  7. 前端如何mock数据

    前言 在工作中总会遇到,临近开发结束了后端才出接口,造成了前端的狼狈加班,搞不还要因此背锅.因此,我们前端一定要学会如何mock数据. 为什么要mock数据? 为什么要mock数据? 要回答这个问题, ...

  8. 模拟数据(前端mock,JSON-Server)

    前端mock 目的:体验前端mock接口数据 1)安装 yarn add axios mockjs 2)发送请求 App.vue import axios from "axios" ...

  9. 前端通信:ajax设计方案(十)--- 完善Promise A+规范,增加mock数据功能

    同步更新博客: www.cnblogs.com/GerryOfZhon- 同步更新专栏: zhuanlan.zhihu.com/zhongqiang 同步更新github: github.com/Ge ...

最新文章

  1. 变量声明和定义的区别
  2. CentOS6.5上源码安装MongoDB3.2.1
  3. 第三组 通信一班 030 ISISv6
  4. ContentProviderOperation批量操作提升性能
  5. Fragment专辑(三):Fragment的添加(add)和替换(replace)的不同
  6. Boost:基于Boost的管道pipeline通信
  7. React Native 开发环境搭建
  8. 基于深度学习的图像分割在高德的实践
  9. java.util.concurrent.RejectedExecutionException: event executor terminated 错误分析
  10. Jenkins的定时构建与轮询SCM
  11. 学以致用深入浅出数字信号处理 pdf_数字阵列雷达:零中频接收机的优缺点
  12. 嵌入式的c语言,嵌入式c语言
  13. CRM客户关系管理系统开发第七讲——实现客户管理模块中删除客户的功能
  14. CSR1010A05-IQQM-R首款单模单芯片蓝牙低功耗
  15. linux下创建用户分组及设置分组权限
  16. 时间复杂度和空间复杂度及多道例题讲解
  17. python 使用爬虫下载京东图片
  18. matlab狐狸与野兔数学模型,数学建模论文-狐狸野兔问题.doc
  19. SpringBoot-quartz配置页面可视化任务调度
  20. 不要试图用OKR解决所有绩效考核

热门文章

  1. 页式地址重定位模拟(JAVA语言)
  2. Auto.js 教程 高级教程 界面 技术 技巧
  3. 聚类算法(1)——层次、K-means聚类
  4. 什么是Carlink?
  5. nginx+nginx-rtmp-module的流媒体服务器搭建(记录)
  6. 有n个人围一圈,顺序排号,报号游戏
  7. Docker部署微服务时间快8小时
  8. 用python证明中心极限定理_中心极限定理及Python实验
  9. 影片剪辑动起来-雅酷互动flash简易教程第2篇
  10. 球员评历史最佳阵:乔丹魔术师坚如磐石詹皇选自己