純手工打造前端后端分離項目中的mock-server

為了更好的分工合作战得,讓前端能在不依賴后端環(huán)境的情況下進行開發(fā),其中一種手段就是為前端開發(fā)者提供一個web容器,這個本地環(huán)境就是 mock-server。

數(shù)據(jù)mock可以有兩種思路:

  • 在 client 端mock
  • 在 server 端mock

第一種方式攔截了請求的發(fā)出媒抠,直接返回 mock 的數(shù)據(jù),而第二種方式請求則真實地發(fā)出咏花,只是在 server 端進行 route 攔截趴生。然而身為一名有“尊嚴”的前端怎么能去求后端呢?所以我們毫不猶豫的選擇第一種方式昏翰。

目前很多前端 mock 數(shù)據(jù)的方案的基本流程都是使用 node.js 來模擬 http 請求苍匆,配置 router 返回 mock 數(shù)據(jù)。

讓我們設(shè)想一下一個比較好的 mock-server 該有的能力:

  • 與線上環(huán)境一致的接口地址棚菊,每次構(gòu)建前端代碼時不需要修改調(diào)用接口的代碼
  • 所改即所得锉桑,具有熱更新的能力,每次增加/修改 mock 接口時不需要重啟 mock 服務(wù)窍株,更不用重啟前端構(gòu)建服務(wù)
  • 能配合 Webpack
  • mock 數(shù)據(jù)可以由工具生成不需要自己手動寫
  • 能模擬 POST民轴、GET 請求
  • 簡單(包括:文件結(jié)構(gòu)簡單、編寫代碼簡單)

所以接下來給大家介紹一下我自己總結(jié)下來一套使用起來比較舒服的 mock-server 解決方案球订,其中也用到了許多工具和框架后裸,在整個搭建過程中自己同時也學(xué)習(xí)了很多。

大致的主要思路:以 json-server 作為 mock 服務(wù)器冒滩, mock.js 生成 mock 數(shù)據(jù)微驶,利用 gulp + nodemon + browser-sync 監(jiān)聽 mock 文件的改動重啟 node 服務(wù),刷新瀏覽器开睡,以此達到一種相對完美的 mock-server 要求因苹。

json-server搭配mock.js

這里以 Webpack 的前端工程為例:

npm install json-server mockjs --save

在項目根目錄新建 mock 文件夾,新建 mock/db.js 作為 mock 數(shù)據(jù)源篇恒,mock/server.js 作為 mock 服務(wù)扶檐,mock/routes.js 重寫路由表。

// db.js
var Mock = require('mockjs');

module.exports = {
  getComment: Mock.mock({
    "error": 0,
    "message": "success",
    "result|40": [{
      "author": "@name",
      "comment": "@cparagraph",
      "date": "@datetime"
    }]
  }),
  addComment: Mock.mock({
    "error": 0,
    "message": "success",
    "result": []
  })
};

這里我們利用 mock.js 生成 mock 數(shù)據(jù)胁艰,可以盡可能的還原真實數(shù)據(jù)款筑,還可以減少數(shù)據(jù)構(gòu)造的復(fù)雜度。

// routes.js
module.exports = {
  "/comment/get.action": "/getComment",
  "/comment/add.action": "/addComment"
}

我們可以通過路由表的配置實現(xiàn)復(fù)雜的路由配置腾么,詳細配置規(guī)則

// server.js
const jsonServer = require('json-server')
const db = require('./db.js')
const routes = require('./routes.js')
const port = 3000;

const server = jsonServer.create()
const router = jsonServer.router(db)
const middlewares = jsonServer.defaults()
const rewriter = jsonServer.rewriter(routes)

server.use(middlewares)
// 將 POST 請求轉(zhuǎn)為 GET
server.use((request, res, next) => {
  request.method = 'GET';
  next();
})

server.use(rewriter) // 注意:rewriter 的設(shè)置一定要在 router 設(shè)置之前
server.use(router)

server.listen(port, () => {
  console.log('open mock server at localhost:' + port)
})

現(xiàn)在打開 terminal 輸入命令

$ node mock/server.js

打開 http://localhost:3000/comment/get.action 即可查看到我們想要的數(shù)據(jù):

是不是這樣就算搭建完了我們的 mock-server 奈梳?不,并沒有解虱。我們可以嘗試修改一下 db.js 的文件內(nèi)容攘须,刷新瀏覽器發(fā)現(xiàn) mock 數(shù)據(jù)并沒有像我們想象的那樣修改。那也就是說每次當(dāng)我們需要添加/修改 mock 數(shù)據(jù)使都需要重啟一次 mock 服務(wù)殴泰。What 于宙??艰匙?

除此之外我們還需要進行端口代理限煞,以至于不與 Webpack 的構(gòu)建端口產(chǎn)生跨域。

端口代理

通過 Webpack 配置 proxy 代理:

module.exports = {
  ...
  devServer: {  
    //其實很簡單的员凝,只要配置這個參數(shù)就可以了  
    proxy: {  
      '/api/': {  
        target: 'http://localhost:3000',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  } 
}

接著在代碼里進行 ajax 請求就可以寫成署驻,這里以 axios 為例子:

function getComments () {
  axios.get('api/comment/get.action', {}).then((res) => {
    console.log(res.data)
  })
}

文件改動自動刷新

我們希望更改 mock 文件能和 webpack 熱更新一樣,所改即所得健霹。這里我使用了 nodemon旺上,利用 gulp 建立自動執(zhí)行的任務(wù)。

npm install gulp gulp-nodemon browser-sync --save

gulpfile.js 的代碼如下:

const path = require('path');
const gulp = require('gulp');
const nodemon = require('gulp-nodemon');
const browserSync = require('browser-sync').create();
const server = path.resolve(__dirname, 'mock');

// browser-sync配置糖埋,配置里啟動nodemon任務(wù)
gulp.task('browser-sync', ['nodemon'], function() {
  browserSync.init(null, {
    proxy: "http://localhost:8080", // 這里的端口和webpack的端口一致
    port: 8081
  });
});

// browser-sync 監(jiān)聽文件
gulp.task('mock', ['browser-sync'], function() {
  gulp.watch(['./mock/db.js', './mock/**'], ['bs-delay']);
});

// 延時刷新
gulp.task('bs-delay', function() {
  setTimeout(function() {
    browserSync.reload();
  }, 1000);
});

// 服務(wù)器重啟
gulp.task('nodemon', function(cb) {
  // 設(shè)個變量來防止重復(fù)重啟
  var started = false;
  var stream = nodemon({
    script: './mock/server.js',
    // 監(jiān)聽文件的后綴
    ext: "js",
    env: {
      'NODE_ENV': 'development'
    },
    // 監(jiān)聽的路徑
    watch: [
      server
    ]
  });
  stream.on('start', function() {
    if (!started) {
      cb();
      started = true;
    }
  }).on('crash', function() {
    console.error('application has crashed!\n')
    stream.emit('restart', 10)
  })
});

這樣以后我們在構(gòu)建我們 Webpack 工程時只需要先執(zhí)行

$ npm run dev

之后新建 terminal 執(zhí)行

$ gulp mock

就可以搭建一個隨改隨變的 mock-server 環(huán)境宣吱,再也不用看后臺的臉色啦~

如果有任何問題歡迎留言

個人的 vue-starter-kit 項目也采用了這種 mock 方案,如果有需要也可以參考瞳别,歡迎 star

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末征候,一起剝皮案震驚了整個濱河市杭攻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疤坝,老刑警劉巖兆解,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跑揉,居然都是意外死亡锅睛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門历谍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來现拒,“玉大人,你說我怎么就攤上這事望侈∮∈撸” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵甜无,是天一觀的道長扛点。 經(jīng)常有香客問我,道長岂丘,這世上最難降的妖魔是什么陵究? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮奥帘,結(jié)果婚禮上铜邮,老公的妹妹穿的比我還像新娘。我一直安慰自己寨蹋,他們只是感情好松蒜,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著已旧,像睡著了一般秸苗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上运褪,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天惊楼,我揣著相機與錄音,去河邊找鬼秸讹。 笑死檀咙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的璃诀。 我是一名探鬼主播弧可,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劣欢!你這毒婦竟也來了棕诵?” 一聲冷哼從身側(cè)響起裁良,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎校套,沒想到半個月后趴久,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡搔确,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灭忠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳算。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弛作,靈堂內(nèi)的尸體忽然破棺而出涕蜂,到底是詐尸還是另有隱情,我是刑警寧澤映琳,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布机隙,位于F島的核電站,受9級特大地震影響萨西,放射性物質(zhì)發(fā)生泄漏有鹿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一谎脯、第九天 我趴在偏房一處隱蔽的房頂上張望葱跋。 院中可真熱鬧,春花似錦源梭、人聲如沸娱俺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荠卷。三九已至,卻和暖如春烛愧,著一層夾襖步出監(jiān)牢的瞬間油宜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工屑彻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留验庙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓社牲,卻偏偏與公主長得像粪薛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搏恤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 在現(xiàn)在的前端開發(fā)中违寿,前后端分離湃交、模塊化開發(fā)、版本控制藤巢、文件合并與壓縮搞莺、mock數(shù)據(jù)等等一些原本后端的思想開始...
    Charlot閱讀 5,448評論 1 32
  • GitChat技術(shù)雜談 前言 本文較長,為了節(jié)省你的閱讀時間掂咒,在文前列寫作思路如下: 什么是 webpack才沧,它要...
    蕭玄辭閱讀 12,698評論 7 110
  • 最近在學(xué)習(xí) Webpack,網(wǎng)上大多數(shù)入門教程都是基于 Webpack 1.x 版本的,我學(xué)習(xí) Webpack 的...
    My_Oh_My閱讀 8,190評論 40 247
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,286評論 25 707
  • 正念,從現(xiàn)在開始绍刮,我將用“正念”這個詞來指“對當(dāng)下的實相保持有覺知” 就要即刻在日常生活中開始修習(xí)温圆,而不只是在禪修...
    swanlin閱讀 294評論 0 0