博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用装饰器实现mock和api的局部分离切换
阅读量:7128 次
发布时间:2019-06-28

本文共 2161 字,大约阅读时间需要 7 分钟。

前言

在一般的前端开发中,我们一般会利用mock产生数据来过渡到正式api实现之间的真空期,当正式api实现后,再把mock地址切换为正式api地址。

本文就是利用ES7的装饰器来实现mock和api地址之间的切换。

项目背景

  • vue-cli搭建的单页项目
  • axios

核心技术

项目架构

具体实现

以用户登录为例

  • service 层
...    async login (params) {        await Api.member.login(params)    }...复制代码
  • api 层
import axios from 'axios'...  // mock api地址,正式api实现之后,将其删除即可  @Mock({    method: 'post',    url: '/members/login'  })  async login (params) {    await axios.post('/members/login', params) #正式api地址  }...复制代码
  • mock装饰器
设置axios的baseURl为/mock
import axios from 'axios'axios.defaults.baseURL = '/mock'/** * mock装饰器类的初步实现,未做优化判断 */function Mock (params) {  const {method, url} = params  return function (target, name, descriptor) {    descriptor.value = async function () {      const result = await axios({        method,        url,        params: arguments[0]      })      return result    }    return descriptor  }}export default Mock复制代码
  • dev代理
利用dev代理将以/mock开头的地址代理到mock服务器
proxyTable: {      '/mock':{        target:'http://mock.server.url',        changeOrigin: true,        pathRewrite: {          '^/mock': '/api'        }      },    },复制代码

其他

  • babel插件
"babel-plugin-transform-decorators-legacy": "^1.3.4",复制代码
  • 当正式api接口完成后,将mock装饰器删除即可。

升级优化

存在的问题

经过一晚的反复思考,发现上述实现存在一些问题

  • 使用比较繁琐
  • 内部实现不够优雅,本质就是重写了一个api接口。
  • 发布线上版本时,还需手动删除mock装饰器。

优化

所以,针对上述问题做了一些优化。

  • api类
// 增加属性  constructor () {    this.baseUrl = '/members'  }    // 修改为  @Mock()  async login (params) {    await axios.post(`${this.baseUrl}/login`, params) #正式api地址  }复制代码
  • mock装饰器
return function (target, name, descriptor) {    // 初始化目标实例    const targetInstance = new target.constructor()    //根据环境变量判断并修改实例的baseUrl    targetInstance.baseUrl = process.env.ENABLE_MOCK === 'true'      ? `${process.env.MOCK_URL}${targetInstance.baseUrl}`      : targetInstance.baseUrl    const oldValue = descriptor.value    // 目标方法    descriptor.value = async function () {      // 执行原方法            const result = await oldValue.apply(targetInstance, arguments)      return result    }    // 返回    return descriptor  }复制代码
  • dev环境变量
// 增加mock配置  ENABLE_MOCK: '"true"',  MOCK_URL: '"/mock"'复制代码

后续展望

  • 研究能否通过webpack打包时,自动去掉装饰器。

转载于:https://juejin.im/post/5ad9a500f265da0b736d342d

你可能感兴趣的文章
redmien使用技巧,按分派人分组显示问题,方便跟踪
查看>>
Project Server 2013新手入门 (五)配置用户登录
查看>>
linux下yum三种搭建方法
查看>>
VB.NET-QQ新闻弹窗样式图片制作工具
查看>>
iOS 7侧边栏菜单解决方案
查看>>
移动web开发框架研究
查看>>
Word 2013 发布51CTO博客
查看>>
byRef 与 byVal
查看>>
QTP对日前控件的处理
查看>>
ES6中的尾递归优化例子
查看>>
(寻求志同道合的兄弟)寻求eclipse插件开发能手
查看>>
斗地主算法的设计与实现(一)--项目介绍&如何定义和构造一张牌
查看>>
前端技术/前端冷知识集锦
查看>>
免费高清视频素材下载网站
查看>>
RGW Usage类解析
查看>>
mouseover、mouseout防止多次触发
查看>>
Linux命令行:rpm 命令参数使用详解
查看>>
expdp数据泵自动备份脚本
查看>>
菲波那切数列
查看>>
java 调用存储过程示例版
查看>>