Webpack(二十一):比mock模擬數(shù)據(jù)更簡單的方式

### 目錄結(jié)構(gòu)如下:
demo1                                       # 工程名
|   |--- dist                               # 打包后生成的目錄文件             
|   |--- node_modules                       # 所有的依賴包
|   |--- app
|   | |---index
|   | | |-- views                           # 存放所有vue頁面文件
|   | | | |-- parent.vue                    # 父組件
|   | | | |-- child.vue                     # 子組件
|   | | | |-- index.vue
|   | | |-- components                      # 存放vue公用的組件
|   | | |-- js                              # 存放js文件的
|   | | |-- store                           # store倉庫
|   | | | |--- actions.js
|   | | | |--- mutations.js
|   | | | |--- state.js
|   | | | |--- mutations-types.js
|   | | | |--- index.js
|   | | |-- app.js                          # vue入口配置文件
|   | | |-- router.js                       # 路由配置文件
|   |--- views
|   | |-- index.html                        # html文件
|   |--- json                               # 存放所有模擬數(shù)據(jù)
|   | |-- parent_getPower.json
|   | |-- parent_reConfig.json
|   | |-- parent_reconlist.json
|   | |-- parent_reGroup.json 
|   |--- mock.js                            # mock 數(shù)據(jù)的所有調(diào)用方法
|   |--- webpack.config.js                  # webpack配置文件 
|   |--- .gitignore  
|   |--- README.md
|   |--- package.json
|   |--- .babelrc                           # babel轉(zhuǎn)碼文件

項目的結(jié)構(gòu)如上所示:其中 json 文件夾內(nèi)會存放所有模擬的數(shù)據(jù),比如和開發(fā)后臺約定好的數(shù)據(jù),我可以直接把數(shù)據(jù)復(fù)制到j(luò)son文件內(nèi),比如我們簡單的看下 parent_reConfig.json 數(shù)據(jù)代碼如下(假如開發(fā)接口返回的數(shù)據(jù)是這樣的):

{
  "data": [{
      "bTableName": "reconfig",
      "businessCode": "reconfig",
      "businessImportImpl": "reconfig",
      "businessImportMethod": "reconfig",
      "businessName": "reconfig"
    }
  ],
  "code": 0
}

其他的json文件也是類似的數(shù)據(jù),這里不一一貼代碼哦,有興趣的話,可以到下面的github上查看demo。

json文件命名方式:比如我上面json下的叫 parent_reConfig.json, 因為vue頁面叫 parent.vue, 所以前綴就是頁面的名稱,然后下劃線(_) + reConfig + 'json', 其中reConfig 是接口的最后一個名字,這樣命名的話,我一眼就可以知道是那個頁面下的接口,接口是做什么使用的。方便以后接口很多更容易區(qū)分。

2. 在項目的根目錄下 mock.js 代碼是如下所示:

const getPower = require('./json/parent_getPower.json');
const reConfig = require('./json/parent_reConfig.json');
const reConList = require('./json/parent_reconlist.json');
const reGroup = require('./json/parent_reGroup.json');

function Mock(app) {
  app.get('/xxxx/yyy', function(req, res) {
    console.log('getPower111');
    res.json(getPower);
  });
  app.post('/reconfig', function(req, res) {
    console.log('reConfig111');
    res.json(reConfig);
  });
  app.post('/conlist', function(req, res) {
    console.log('reConList111');
    res.json(reConList);
  });
  app.post('/regroup', function(req, res) {
    console.log('reGroup111');
    res.json(reGroup);
  });
}

module.exports = Mock;

如上代碼首先是把 json文件夾下的所有的json文件 require進來,然后定義一個函數(shù),里面寫所有的(get或post)方法,然后使用 res.json 方式就可以把上面的json數(shù)據(jù)模擬返回回來。如上的app參數(shù)是從webpack.config.js 配置傳進來的。

3. webpack.config.js 配置方式如下:

// 引入mock.js
const Mock = require('./mock.js');

module.exports = {
  devServer: {
    port: 8082,
    host: '0.0.0.0',
    headers: {
      'X-foo': '112233'
    },
    inline: true,
    overlay: true,
    stats: 'errors-only',
    before: function(app) {
      console.log(app);
      if (process.env.NODE_ENV === 'mock') {
        Mock(app);
      }
    }
  },
  plugins: [
    // 設(shè)置環(huán)境變量信息
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify(process.env.NODE_ENV)
      }
    })
  ]
}

如上配置代碼,首先引入 mock.js 進來,上面的mock.js對外返回函數(shù),因此在devServer.before中配置調(diào)用下Mock函數(shù),傳入?yún)?shù)是app,并且環(huán)境變量也判斷了下,如果是 mock環(huán)境,就執(zhí)行mock函數(shù)代碼的數(shù)據(jù),否則不是mock命令的話,就不會執(zhí)行mock數(shù)據(jù),而是執(zhí)行真正環(huán)境的數(shù)據(jù)。下面我們來看下 上面 before函數(shù)打印的app是什么東西,如下所示:

{ [EventEmitter: app]
  domain: undefined,
  _events: { mount: [Function: onmount] },
  _maxListeners: undefined,
  setMaxListeners: [Function: setMaxListeners],
  getMaxListeners: [Function: getMaxListeners],
  emit: [Function: emit],
  addListener: [Function: addListener],
  on: [Function: addListener],
  prependListener: [Function: prependListener],
  once: [Function: once],
  prependOnceListener: [Function: prependOnceListener],
  removeListener: [Function: removeListener],
  removeAllListeners: [Function: removeAllListeners],
  listeners: [Function: listeners],
  listenerCount: [Function: listenerCount],
  eventNames: [Function: eventNames],
  init: [Function: init],
  defaultConfiguration: [Function: defaultConfiguration],
  lazyrouter: [Function: lazyrouter],
  handle: [Function: handle],
  use: [Function: use],
  route: [Function: route],
  engine: [Function: engine],
  param: [Function: param],
  set: [Function: set],
  path: [Function: path],
  enabled: [Function: enabled],
  disabled: [Function: disabled],
  enable: [Function: enable],
  disable: [Function: disable],
  acl: [Function],
  bind: [Function],
  checkout: [Function],
  connect: [Function],
  copy: [Function],
  delete: [Function],
  get: [Function],
  head: [Function],
  link: [Function],
  lock: [Function],
  'm-search': [Function],
  merge: [Function],
  mkactivity: [Function],
  mkcalendar: [Function],
  mkcol: [Function],
  move: [Function],
  notify: [Function],
  options: [Function],
  patch: [Function],
  post: [Function],
  propfind: [Function],
  proppatch: [Function],
  purge: [Function],
  put: [Function],
  rebind: [Function],
  report: [Function],
  search: [Function],
  subscribe: [Function],
  trace: [Function],
  unbind: [Function],
  unlink: [Function],
  unlock: [Function],
  unsubscribe: [Function],
  all: [Function: all],
  del: [Function],
  render: [Function: render],
  listen: [Function: listen],
  request: IncomingMessage { app: [Circular] },
  response: ServerResponse { app: [Circular] },
  cache: {},
  engines: {},
  settings: {},
  _eventsCount: 1,
  locals: 
   { settings: {}},
  mountpath: '/',
  _router: {} 
}

更多關(guān)于 devServer.before可以看官網(wǎng)(https://webpack.js.org/configuration/dev-server/#devserver-before)。

4. package.json 配置如下:

{
  "scripts": {
    "dev": "cross-env NODE_ENV=development webpack-dev-server --progress --colors --devtool cheap-module-eval-source-map --hot --inline",
    "build": "cross-env NODE_ENV=production webpack --progress --colors --devtool cheap-module-source-map",
    "build:dll": "webpack --config webpack.dll.config.js",
    "start": "webpack-dev-server --progress --colors --devtool cheap-module-eval-source-map --hot --inline",
    "mock": "cross-env NODE_ENV=mock npm run start"
  },
}

5. app/index/views/parent.vue 代碼如下所示:

<template>
  <div>
  </div>
</template>
<script type="text/javascript">
  import { mapActions } from 'vuex';
  export default {
    data() {
      return {
      }
    },
    created() {
      this.testMock();
    },
    methods: {
      testMock() {
        const obj = {
          'xx': 11
        };
        // 請求的地址是 '//xxx.abc.com/xxxx/yyy'
        Promise.all([this.commonActionGet(['getPower', obj])]).then((res) => {
          console.log('getPower');
          console.log(typeof res);
          console.log(res);
        });

        Promise.all([this.commonActionPost(['reConfig', obj])]).then((res) => {
          console.log('reConfig');
          console.log(res);
        });

        Promise.all([this.commonActionPost(['reConList', obj])]).then((res) => {
          console.log('reConList');
          console.log(res);
        });

        Promise.all([this.commonActionPost(['reGroup', obj])]).then((res) => {
          console.log('reGroup');
          console.log(res);
        });
      },
      ...mapActions(['commonActionGet', 'commonActionGetJSON', 'commonActionPost', 'commonActionPostJSON'])
    },
    mounted() {

    }
  }
</script>

如上代碼,當(dāng)我執(zhí)行打包命令 npm run mock 時,就會調(diào)用webpack中的 devServer.before函數(shù),該函數(shù)會判斷當(dāng)前的環(huán)境是否是mock命令,如果是mock命令就執(zhí)行 mock.js中的Mock函數(shù),然后會請求數(shù)據(jù)。

注意:上面的請求數(shù)據(jù)是:'//0.0.0.0:8082/reconfig' 這樣的,這樣就可以把 json/parent_reConfig.json請求的數(shù)據(jù)返回回來,但是我們真正的接口的前綴可能是 '//xxx.abc.com', 因此我們在配置所有的接口名稱的時候,接口域名的前綴我們可以定義一個變量,然后傳遞進去。比如我下面是這樣定義的:

// const prefix = '//xxx.abc.com'; // 真正的域名接口先注釋掉
const prefix = '//0.0.0.0:8082';

我們可以簡單的判斷下:

let prefix;
if (process.env.NODE_ENV === 'mock') {
  prefix = '//0.0.0.0:8082'; // 測試域名
} else {
  prefix = '//xxx.abc.com'; // 正式域名
}

const url = prefix + '/reconfig';

類似上面這中形式,因此當(dāng)我們在頁面上請求 this.$http.get(url);的時候,實際上在mock數(shù)據(jù)下請求的是 '//0.0.0.0:8082/reconfig' 這樣的,因此會直接被 devServer.before中攔截到,因此會返回我們的模擬上的數(shù)據(jù),但是在我們使用 npm run dev 或 npm run build 的時候,我們需要把 //xxx.abc.com 這個真正的接口域名前綴打開,'//0.0.0.0:8082' 需要被注釋掉。就可以了,其他的vue中的代碼不需要做任何改動,以前該怎么寫,現(xiàn)在也還是就那么寫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,347評論 2 377