构建前端Mock Server的利器/Json-Server

痛点

项目中前端和后端通常是并行开发,为了减少等待后端接口开发的时间,我们经常需要在本地模拟后端接口用来测试前端效果。这种做法称之为构建前端Mock。平日里我接触的前端Mock方法大致可以分为以下两种:

  1. 本地启动一个静态服务,将所需要的接口写成json文件,根据接口名字将文件放在项目目录下。
  2. 再启动一个Server作为Mock Server,使用第三方Proxy将Mock Server的接口代理到静态服务器上。

第一种方法是接触的最多的方法,这做相对来说相对简单,可是带来的弊端也很多。如果项目的接口较少维护起来还比较容易,但是一旦涉及到数十个接口的调用,我们就需要在项目里写新建许多个json文件,如果恰好后端接口的路径又比较长的话,那项目目录将会十分的混乱。比如“ddos/data/details/todayCleanTime.json”,对应的moch目录必须是

--ddos

|--data

| --details

|--todayCleanTime.json

除此之外,通常情况下接口并不一定就会以json结尾(后端同学也许并不会听你解释。。)
如果按照RESTFUL的格式书写,比如"api/zoos/animals",那么我们需要准备书写两套调用接口代码,一种以json格式结尾作为本地mock,另一套才是线上接口代码,每次build构建代码时,一定得记得将调用接口的地方改为线上代码。这种做法效率太低了。。
第二种方法则避免了修改接口的麻烦,在本地的Mock Server中模拟一个和线上一样的接口,这样的Mock也更接近于线上的环境。我们当然不用从头用Node或者Php写一个完整的后端服务,已经有许多工具造好了轮子。
我试用了许多工具,最后觉得还是** Json-Server **最为方便。这个工具在github上有11000个star,可见他的火爆之处。有便于其他同类工具,Json-Server基于REST API,配合使用Proxy,效率极其高。下面我简单说下使用方法,以及我在项目中是如何与Webpack整合的。

30秒内创建完整的REST API

安装Json-Server:
npm install -g json-server
在项目中新建一个test.json文件,我们现在要模拟一个/issues/total接口

\\ test.json
{
  "issues": [
    {
      "id": 101,
      "text": "something is not right"
    },
    {
      "id": 102,
      "text": "crash on login"
    }
  ],
  "total": {
    "data": {
      "exchange_count": "10",
      "share_count": "23",
      "patent_count": "7",
      "article_count": "37",
      "exchangeRecords": []
    },
    "success": true
  }
}

启动服务
json-server --watch test.json --port 9090

访问localhost:9090



现在可以直接按照RESTFUL的规范调用这个接口,并且所做的POST和DELETE等请求,会直接修改test.json文件的值。

➜  ~ curl http://localhost:9090/issues
[
  {
    "id": 101,
    "text": "something is not right"
  },
  {
    "id": 102,
    "text": "crash on login"
  }
]%                                                                              
➜  ~ curl http://localhost:9090/issues/2
{}%                                                                             
➜  ~ curl http://localhost:9090/issues/101
{
  "id": 101,
  "text": "something is not right"
}%                                                                              
➜  ~ curl -X DELETE http://localhost:9090/issues/102
{}%

除此之外,还可以继续增加路由规则。创建一个routes.json文件

{
  "/api/": "/",
  "/blog/:resource/:id/show": "/:resource/:id"
}

启动服务

json-server --watch test.json --routes routes.json

如果接口并不是Restful或者比较冗长,你也可以采取路由的方法模拟。

整合Webpack Dev Server

在项目中使用JsonServer,还需要再做点小处理。通常在本地调试的时候我们已经启动了一个静态服务,因此需要用代理服务进行跨域(两个服务分别在两个端口上)。对于使用Webpack打包的项目,已经使用了它自带的webpack-dev-server服务,它很贴心的提供了proxy参数来解决这个问题。在webpack.config.js做以下配置:

devServer:{
        proxy: {
            '/gm/api/*': {
                target: 'http://localhost:9090',
                secure: false
            }
        }
    }

在package.json中新添加一个scripts:

 "scripts": {
    "dev": "webpack-dev-server --inline --hot --no-info",
    "build": "cross-env NODE_ENV=production webpack --progress --hide-modules",
    "mock": "node_modules/.bin/json-server --watch mock/db.json --port 9090",
    "mockdev": "npm run mock & npm run dev"
  },

由于json-server是命令行工具,若没有全局安装需要用相对路径去调用它: node_modules/.bin/json-server 。路径不能少,否则会提示找不到命令哦。
这个世界终于清净啦!在代码中每次调用/gm/api/issues的时候,都会调用到json-server服务去,可以真是模拟线上的接口调用情况。现在可以把所有接口都集中写在一个json文件中,代码里面线上环境和本地Mock也保持了一致,不需要再切来切去啦!
如果你使用的本地静态服务并没有提供代理的功能,那可以使用 阿里的开源工具anyproxy ,同样给力!

加上Faker试试?

如果我们想在Mock的时候生成更多的随机数据,这个时候就需要faker了!faker.js可以用来产生大量的模拟假数据,配合json-server,我来给大家举个栗子🌰:
npm install faker lodash –save-dev
在项目中新建一个generate.js文件

module.exports = function(){
  var faker =require("faker");
  vae _ = require("lodash");
  return {
    people: _.times(100,function (n) {
      return {
        id: n,
        name: faker.name.findName(),
        avatar: faker.internet.avatar()
      }
    })
  }
}

使用命令
json-server generate.js
Done!生成了100条数据,关于faker的更多用法请参照官网,它能够生存许多常见的随机数据,faker.js

Tips

在使用的过程中,我发现WebStorm有一个很好用的小工具,叫做TestRestfulWebService。(双击shift输入工具名快速唤出)可以直接用来测试json-server。


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

推荐阅读更多精彩内容