Mockjs如何方便的在基于`webpack`构建的项目中使用

axios和mock

为什么把axiosmock放在一起呢?

因为在开发环境它们有时候需要配合使用,现代项目往往是前后端分离式的开发,前端和后端的主要联系在于接口的联调,前端往往需要依赖后端提供的接口返回的数据来编码页面逻辑。但因为分离式的开发,前端可能在需要某个接口的时候,这个接口后端还没有开发完成,无法调用。mock便是为了应付这种场景,后端没数据没有关系,我前端自己造,后端提供接口文档说明接口规范,前端根据文档正常定义xmlhttp请求,然后调用mock拦截请求,返回mock定义的数据,这样就实现了伪后端联调的效果。

那么,这个过程如何实现呢?

不着急,我们先分别看看这两个插件的用法。

axios

官方文档见这里

axios是一款基于Promise的用于浏览器node.js环境的http请求插件。

现以常见的基于npmwebpack项目为例,来大概介绍下其使用方法:

  1. 首先安装axios插件,我这里用的yarn,用npm或者cnpm之类的请自行切换对应的命名。
    yarn add axios
    
  2. 统一请求配置和设置拦截器

    assets/js/目录下新建http.js文件,添加公共的请求配置和对应的requestresponse拦截器。
    import axios from 'axios'
    
    const instance = axios.create({
      timeout: 30000,
      headers: {}
    });
    
    // 添加请求拦截器
    instance.interceptors.request.use(function (config) {
      // 在发送请求之前做些什么,比如说这里统一调用loading遮罩层,给每个请求添加时间戳的参数
      return config;
    }, function (error) {
      // 对请求错误做些什么
      return Promise.reject(error);
    });
    
    // 添加响应拦截器
    instance.interceptors.response.use(function (response) {
      // 对响应数据做点什么,比如说移除遮罩层,根据后端返回code判断是不是登录失效而统一配置跳到登录页
      if(response.status === 200) return response.data;
      return Promise.reject(response);
    }, function (error) {
      // 对响应错误做点什么
      return Promise.reject(error);
    });
    
    export default instance;
    
  3. 使用

    main.js或者vue项目的store.js中引入http.js中实例化的axios对象instance
    import $http from '../http.js'
    
    main.js中,可以将$http挂载到Vue原型上,这样就可以直接在各组件中调用。
    // 挂载到原型上后可通过this.$http来调用
    Vue.prototype.$http = $http
    
    又或者直接在store.js(可以根据实际使用自由拆分再合并到store.js)中引入,然后配置请求,在各组件中用dispatch的方法调用。
    import Vue from 'vue'
    import Vuex from 'vuex'
    import http from '../http.js'
    Vue.use(Vuex)
    export default new Vuex.Store({
      state: {},
      mutations: {},
      actions: {
        getWeatherInfo({commit},str){ // 获取城市天气,str为城市code,如深圳为101280601
          return new Promise((resolve, reject) => {
            http({
              method: 'get',
              url: `/api/weather/city/${str}`, // 该请求的ip为http://t.weather.sojson.com,有兴趣的可以试试,能够调通
            }).then(rs => {
              if(rs.result === 'success') {
                resolve(rs)
              }else{
                reject(rs)
              }
            })
          })
        },
      },
      modules: {}
    })
    
    经过上面这样的配置后,你可以在组件中这样调用:
    this.$store.dispatch('getWeatherInfo',101280601).then(rs => {/* ... */})
    
    上面这种配置方式的好处是service层和views层的代码可以很好的解耦,后期某个接口若有改动,直接去store.js修改相应请求的配置,而不用一个一个去搜索使用到了这个接口的每处代码然后一一修改。

mock

官方文档见这里

先搬个官网的使用说明:

# 安装
yarn add 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))

说实话,上面的代码是看懂了,但并没有什么用,因为光靠这个使用方法,我也不知道如何将它和axios的请求联系起来。网上搜索许久,也不知道个个都是大神还是怎么回事,几乎都是复制粘贴的内容,而内容主体与官网说明没有多少出入,看完依旧很懵。

那么到底该怎么使用呢?浪里淘沙般的操作还是让我找到了一些有帮助的帖子,按照思路整了一番,终于找到一种能让自己满意使用mock.js的模式了。

组合使用

我对mockjs的期望一直是非侵入式拦截,并且有个类似总开关的存在可以决定是否开启mockjs

那如何来使用mockjs呢?

  1. 首先在某文件夹中新建mock.js文件,其内容大致如下:
    const MOCK = require('mockjs')
    MOCK.mock('/api/weather/city/101280601','get',{
      status: 'error',
      msg: '天气查询失败'
    })
    
  2. main.jsrequire加载mock.js文件
    if(process.env.NODE_ENV === 'development'){ // 区分环境,这样即使打包时忘了把下面代码注释掉也不会影响生产环境
      require('../mock') // 不需要开启mock
    }
    
    这样你在某组件中调用这个天气查询接口,你console.log返回的内容会发现返回的是你自己定义的mock数据,查看控制台的network也会发现这个请求并没有被发送出去。但这个过程给人的体验与正常从后端接口获取数据无异。

    所以这是什么情况呢?

    原来,只要你的项目中有做require('mockjs')这个动作,那么mockjs便会拦截所有请求,不管你是否配置了某个接口应该返回什么样的假数据。这个你可以从network中验证这一点。

    那么,在实际开发过程中,为了正常使用mockjs,我们在配置接口的时候都要做两份,一份是假设可以正常从后端获取数据的逻辑代码,一份是mock定义的模拟数据代码。

    mockjs使用的基本方式如下:,
    MOCK.mock(url,method,mockData) // api,方式,假数据
    
    关于axiosmockjs一些细节方面的东西都可以参考官方文档。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容