Vue CLI 3 + webpack + Mockjs实现本地数据模拟

前言

Vue CLI 3将webpack的配置融合到了自己的vue.config.js中,官方说法:https://cli.vuejs.org/zh/config/#devserver-proxy ,也就是说只要在vue.config.js中仿照webpack来配置即可。

webpack的DevServer参考文档:https://cloud.tencent.com/developer/section/1477376

我们打算实现:

  1. 正常的路由,就由vue cli来管理。
  2. ajax请求的路由,因为这个路由我们希望拿到模拟数据,所以不归vue cli管,而是由webpack的DevServer来拦截。拦截之后,我们要提前安装一个package叫mockjs,由它来生成模拟数据,然后返回模拟数据。

原理

  1. 利用webpack的DevServer实现一个本地服务器,这个服务器跟Vue CLI默认生成的服务器使用同一个IP和端口,也就是要同源,这样问题最简单,不用考虑代理。
  2. 准备一个mock/mock.js负责编写规则。
  3. DevServer的before中拦截所有请求,交给Mock。其实拦截所有请求不是最佳实践,应该根据请求内容拦截,但是今天我们只把问题最简单化,所以拦截所有请求,交给Mock。
  4. Mock返回模拟数据,这样我们编写的请求代码,得到的就是模拟数据了。

DevServer配置本地服务器

  1. 在项目根目录,也就是跟package.json平级,新建一个mock目录,内容一会再说。

  2. 在vue.config.js中加入:

const path = require('path');
const Mock = require('./mock/mock.js');
  devServer: {
    contentBase: path.join(__dirname, 'mock'),
    compress: true,
    port: 8080,
    overlay: {
      warnings: false,
      errors: true
    },
    before(app){
      Mock(app)
    }
}

DevServer的配置中有一个before配置项,意思是拦截路由请求。我们现在简单粗暴的拦截所有请求,全部交给Mock(app)处理。

app是什么呢,它是一个很复杂的对象,暂时没必要了解它具体是什么,你只需要知道,app.get()就等同于axios.get()就行了,也就是app的一些方法会映射到axios上。

注意,修改webpack的配置之后,需要重新运行yarn serve!否则不生效!后续有修改如果也不生效的话,重新运行yarn serve一般就没问题了。
如果你有能力,可以使用https://github.com/paulmillr/chokidar来监听目录文件变化,然后自动重启服务器。这里我就不介绍了。

在mock目录新建一个mock.js

  1. 我们先写它的基础内容,比如说,我请求购物车的商品列表,那么可以是:
function Mock(app) {
  app.get('/cart/getCartList', function(req, res) {
    res.json({ aaa: '111' });
  });
}

module.exports = Mock;

其中'/cart/getCartList'是真的路径,而{ aaa: '111' }是我mock出的数据。

在src/api/目录新建一个cart.js

这个操作是Vue CLI项目的业界惯例的操作,也就是将ajax请求写成模块,比如内容是:

import $httpJava from '@/assets/js/httpJava.js'; // 我封装的axios实例

const devBaseURL = 'http://192.168.2.142:8080'; // 因为经常要切换baseURL,所以另外定义一个变量

export function getCartList() {
  return $httpJava({
    baseURL: devBaseURL,
    url: '/cart/getCartList',
    method: 'get'
  })
}

在组件中调用你的ajax模块

比如在Cart.vue中:

import { getCartList } from '@/api/cart'
create() {
  methods: {
    getCartList()
  }
}

打开浏览器的Network,可以看到:

image.png
image.png

到此,如果你的模拟数据够简单的话,看到这里就不用再看下去了。如果你的模拟数据很庞大,很复杂,需要随机数据,需要各种计算数据,那么显然返回一个JSON对象是不能满足需求了。怎么办?——Mockjs该登场了。

安装Mockjs

yarn add mockjs --dev

官方文档:https://github.com/nuysoft/Mock/wiki/Getting-Started

先来一个例子。

首先先把/mock/mock.js做模块化处理:

mock.js:

const cartMock = require('./cart');

function Mock(app) {
  cartMock(app)
}

module.exports = Mock;

旁边新建cart.js:

var Mockjs = require('mockjs')

const cartMock = function (app) {
  app.get('/cart/getCartList', function(req, res) {
    var data = Mockjs.mock({
      // 属性 list 的值是一个数组,其中元素的数量从 1 到 10 个都有可能,随机
      'list|1-10': [{
          // 属性 id 是一个自增数,起始值为 5,每次增 1
          'id|+1': 5
      }]
    })
    res.json(data);
  })
}

module.exports = cartMock;

得到:

image.png

现在我们构建一个复杂的模拟数据数组:

var Mockjs = require('mockjs')
var Random = Mockjs.Random

const cartMock = function (app) {
  app.get('/cart/getCartList', function(req, res) {
    var goods_id = 1
    var data = Mockjs.mock({
      'list|3-5': [{
          'merchant_id|+1': 50,
          'merchant_name': Random.cword( '阿福水果苹果梨哈密瓜桃杏', 2, 3 ) + '旗舰店',
          'goodsList|2-4': [{
            'goods_id': goods_id++,
            'goods_img': 'https://img.yzcdn.cn/upload_files/2014/11/29/FjKSRZNOLrncW19bpyfLu3hrtNPe.jpg?imageView2/2/w/260/h/260/q/75/format/jpg',
            'goods_title': '四川红心猕猴桃 新鲜当季水果奇异果应季猕猴桃孕妇批发五只装精品豪华装',
            'goods_price': '@float( 11, 44, 0, 2 ),
            'good_quantity': Random.natural( 1, 4 )
          }]
      }]
    })
    res.json(data);
  })
}

module.exports = cartMock;
image.png

如果仔细看你会看到,'goods_id': goods_id++,在每一个元素中随机出的结果是一样的,都是1,Random的结果也都是一样的,如果要避免这种现象,可以使用@natural这种占位符加参数。

总而言之,你就是攒出一个JS对象,传给Mockjs.mock()就完事。如果看不懂,请仔细阅读手册。

拿到response之后再怎么用,就不说了。

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

推荐阅读更多精彩内容