前后端分离-搭建本地 mock 服务

我不是女神ヾ 2022-03-01 00:07 511阅读 0赞

小编推荐:Fundebug专注于JavaScript、微信小程序、微信小游戏,Node.js和Java实时BUG监控。真的是一个很好用的bug监控费服务,众多大佬公司都在使用。

搭建本地 mock 服务器 —-为了更好的前端开发

工作中,有时候前端的很多工作需要后端的支持,但是可能后端的接口还没有开发完,或者有些时候在联调阶段,修复某个 bug 的时候,环境挂了。。。 那么这个时候,我们的很多工作无法顺利的进行下去。于是萌生了搭建本地服务器的想法。

首先粗略的说一下它的好处

  • 前端更加独立,在开发阶段对于后端的依赖性大大降低。
  • 联调和开发截断,对于新增加的接口,只需要后端提供接口文档就好,不需要等到他们真正的开发完成,前端就可以自己进入联调。
  • 修复和定位 bug 更加便捷,自测阶段中对于某些极端的边界条件,我们自己就可以实现构造数据,模拟边界条件。

mock 数据的方式(这里我提供了三种,可自行选择)

在线 mock 网址: Easy mock (缺点: 当需要修改大量数据和新增很多 api 的时候,比较繁琐)

jsonserver+gulp 实现( 缺点:大部分需求都能满足,但是对于需要动态解析参数的接口,支持的不够完美 )

node+express 实现 ( 可实现几乎所有接口的情况,但是配置起来比第二种麻烦 )

EasyMock

官网提供详细的文档和说明,上手比较快,但是对于保密性比较强的公司,建议舍弃这种方式。

![Image 1][]

JsonServer+Gulp+MockJs

技术选型

  • JsonSever 开启端口,提供服务。
  • Gulp 实现监听文件和热更新的功能。
  • MockJs 一个成熟的 mock 数据平台,通过其提供的 api,可以快速的生成大量测试数据。
  • babel 配置 es6语法。

项目目录预览

介绍

  1. api 为数据文件夹,配置不同的项目所需要的不同接口以及其返回值,在 index中进行继承 然后暴露给 mock/db 下 最后暴露给 server。(这个可以自行更改,只要最后暴露出去就可以
    api/project.projectOne

    let projectOne = {
    ‘getList’: {

    1. code: '0',
    2. data: [{
    3. key: '1',
    4. name: 'John Brown',
    5. age: 32,
    6. address: 'New York No. 1 Lake Park',
    7. tags: ['nice', 'developer']
    8. }, {
    9. key: '2',
    10. name: 'Jim Green',
    11. age: 42,
    12. address: 'London No. 1 Lake Park',
    13. tags: ['loser']
    14. }, {
    15. key: '3',
    16. name: 'Joe Black',
    17. age: 32,
    18. address: 'Sidney No. 1 Lake Park',
    19. tags: ['cool', 'teacher']
    20. }]

    },
    getInfo: {

    1. error_no: 0,
    2. errMessage: '',
    3. data: {
    4. info: {
    5. 'name': 'BeJson',
    6. 'url': 'http://www.bejson.com',
    7. 'page': 88,
    8. 'isNonProfit': true,
    9. 'address': {
    10. 'street': '科技园路.',
    11. 'city': '江苏苏州',
    12. 'country': '中国'
    13. },
    14. 'links': [{
    15. 'name': 'Google',
    16. 'url': 'http://www.google.com'
    17. },
    18. {
    19. 'name': 'Baidu',
    20. 'url': 'http://www.baidu.com'
    21. },
    22. {
    23. 'name': 'SoSo',
    24. 'url': 'http://www.SoSo.com'
    25. }
    26. ]
    27. }
    28. }

    }
    }

    module.exports = {
    …projectOne
    }

api/index (支持 es5 和 es6共存写法)

  1. const test = require('./test/test.js')
  2. import projectOne from './project/projectOne'
  3. module.exports = {
  4. ...test,
  5. ...projectOne
  6. }
  1. mock 文件夹 集中 mock 平台,我们想要通过 mock
    平台生成的接口放在这个文件夹。
    mock/db.js

    // var Mock = require(‘mockjs’)
    import Mock from ‘mockjs’
    var api = require(‘../api’)

    module.exports = {
    …api,
    getComment: Mock.mock({

    1. 'error': 0,
    2. 'message': 'success',
    3. 'result|40': [{
    4. 'author': '@name',
    5. 'comment': '@cparagraph',
    6. 'date': '@datetime'
    7. }]

    }),
    addComment: Mock.mock({

    1. 'error': 0,
    2. 'message': 'success',
    3. 'result|5': [{
    4. 'comment': '@cparagraph'
    5. }]

    }),
    // post/1 和post/2 返回不同的内容
    ‘posts’: [{

    1. 'id': 1,
    2. 'title': 'json-server',
    3. 'author': 'typicode'
    4. },
    5. {
    6. 'id': 2,
    7. 'title': 'json-server',
    8. 'author': 'typicode'
    9. }

    ],
    ‘comments’: [{

    1. 'id': 1,
    2. 'body': 'some comment',
    3. 'postId': 1

    }],
    ‘profile’: {

    1. 'name': 'typicode'

    }
    }

  2. router文件夹 大致结构和 api 文件夹相似,暴露路由(支持 es6 和 es5 的写法共存)

    import test from ‘./test/test’
    const projectOne = require(‘./project/projectOne’)

    module.exports = {
    …test,
    …projectOne
    }

router/project/projectOne

  1. module.exports = {
  2. '/localMock/*': '/$1',
  3. '/localMock/getList': '/getList',
  4. '/localMock/getInfo': '/getInfo',
  5. /*
  6. 如果没有'/localMock/*': '/$1',
  7. 下面接口连接无法访问到
  8. */
  9. '/localMock/getInfo?123456+.2345.3434': '/getInfo'
  10. }
  1. gulpfile 提供监听文件和接口热更新的功能
  2. main.js 中 提供babel 配置 es6 的写法
  3. server.js 中 启动端口,配置路由和接口返回值。

![Image 1][]

运行预览

![Image 1][]

![Image 1][]

![Image 1][]

如何运行?

localMock项目地址

  1. git clone https://github.com/majunchang/localMock.git
  2. cd localMock
  3. npm i
  4. npm dev | npm run start | npm run mock (都可以启动)
  5. npm run gulp ( 启动并且可以热更新 )

在查询了关于jsonserver 的 router 配置方式以后,总感觉对于动态执行参数的接口支持的不太好,于是就有了 nodemock(什么分页,什么查询等,处理起来就是一把梭! 复制粘贴 就是刚!)

NodeMock(node+express+嗯?…)

项目目录

  • api 配置接口以及接口返回值(类似与上面的 localmock 的配置)

api/projectOne

  1. import Mock from 'mockjs'
  2. let projectOne = {
  3. getme: {
  4. name: 'xiaohong',
  5. age: 21,
  6. gender: '男',
  7. xuexi: 'cha11'
  8. },
  9. getshe: Mock.mock({
  10. 'error': 0,
  11. 'message': 'success',
  12. 'result|1': [{
  13. 'author': '@name',
  14. 'comment': '@cparagraph',
  15. 'date': '@datetime'
  16. }]
  17. }),
  18. liyitong: Mock.mock({
  19. 'error': 0,
  20. 'message': 'success',
  21. 'result|3': [{
  22. 'author': '@name',
  23. 'comment': '@cparagraph',
  24. 'date': '@datetime'
  25. }]
  26. })
  27. }
  28. export default projectOne
  • controller 配置动态查询参数的请求 示例中给出了 get 和 post 的两种情况

controller/project.js

  1. import Mock from 'mockjs'
  2. export function test(req, res) {
  3. var arr = Mock.mock({
  4. 'error': 0,
  5. 'message': 'success',
  6. 'result|10': [{
  7. 'author': '@name',
  8. 'comment': '@cparagraph',
  9. 'date': '@datetime'
  10. }]
  11. })
  12. res.json({
  13. arr
  14. })
  15. }
  16. export function geturl(req, res) {
  17. // 对于接口中的 get 参数 我们使用 query 获取即可
  18. const {
  19. num
  20. } = req.query
  21. res.json({
  22. name: 111,
  23. age: 11,
  24. message: req.originalUrl,
  25. num: `get 请求中的接口 num 为${num}`,
  26. })
  27. }
  28. export function postUrl(req, res) {
  29. // 针对普通的 post 请求 如果是表单格式的需要单独配置一下
  30. res.json({
  31. name: `post 请求的接口中,post参数为${req.body}`,
  32. age: 11,
  33. message: req.originalUrl,
  34. })
  35. }
  • router 中为路由配置
  • app.js 启动端口服务,接受路由和接口配置
  • main.js babel 配置es6 语法

![Image 1][]

运行预览

这个项目,没有预览所有接口的功能。感兴趣的读者可以自己添加(当访问指定链接时,获取router 中的信息 进行展示出来,解决方法不唯一,可以查文档 自己添加)。

![Image 1][]

![Image 1][]

项目启动

项目地址

  1. git clone https://github.com/majunchang/node-mock
  2. cd node-mock
  3. npm i
  4. npm run dev

![Image 1][]

你可能感兴趣的

  • 黑科技!Fundebug支持网页录屏!
  • Async/Await替代Promise的6个理由
  • 30个极大提高开发效率的VS Code插件
  • 10个JavaScript难点
  • 2018前端工程师成长路线图
  • Source Map入门教程
  • 2018年最值得关注的30个Vue开源项目
  • 10个最佳ES6特性
  • 重新思考单元测试
  • 不要争了!技术选择没那么重要

[Image 1]:

发表评论

表情:
评论列表 (有 0 条评论,511人围观)

还没有评论,来说两句吧...

相关阅读