隨着項目的復雜,文件結構越來越多,Store中modules中的文件也越來越多,如果一個一個加載是不是很麻煩呢?
先看一個項目中store項目結構:
過去都是通過import分別引入文件:
1 import Vue from 'vue'; 2 import Vuex from 'vuex'; 3 4 Vue.use(Vuex); 5 6 import user from './modules/user'; 7 import info from './modules/info'; 8 //此處省略N多文件。。。。。 9 10 export default new Vuex.Store({ 11 modules: { 12 user, 13 info 14 }, 15 });
通過上述引入雖然可以達成效果但是如果有很多文件呢?難道也要一個一個引入?那么如何動態加載modules文件下的所有JS文件呢?
那么這里就會用到webpack文檔中的require.context( ) ,來實現前端工程化;
require.context( )語法如下:
require.context(directory, useSubdirectories = false, regExp = /^.//);
示例:
require.context("./test", false, /\.test\.js$/); // (你創建了)一個test文件夾下面(不包含子目錄),能被require請求到,所有文件名以 `.test.js` 結尾的文件形成的上下文(模塊)。 require.context("../", true, /\.stories\.js$/); // (你創建了)一個父級文件夾下面(包含子目錄),所有文件名以 `.stories.js` 結尾的文件形成的上下文(模塊)。
那么我們怎么把它應用到Vue項目當中呢?
1 import Vue from 'vue'; 2 import Vuex from 'vuex'; 3 import camelcase from 'camelcase’; //駝峰命名的一個npm包 4 Vue.use(Vuex); 5 6 const context = require.context('./modules', false, /\.js$/); 7 //獲取moudules文件下所有js文件; 8 const moduleStores = {}; 9 10 context.keys().forEach(key => { 11 // context.keys() 返回匹配成功模塊的名字組成的數組 12 const fileName = key.slice(2, -3); 13 //截取名字 14 const fileNameInCamelCase = camelcase(fileName); 15 //camelcase 是一個駝峰命名包; 16 const fileModule = context(key).default; 17 //通過 context(key)導出文件內容。在文件中時通過 export.default 導出的,所以后邊加.default 18 moduleStores[fileNameInCamelCase] = { 19 ...fileModule, 20 namespaced: true, //文件中有寫可以省略;不過這樣寫可以不用給每個文件寫入;這個屬性不知道自己去查文檔; 21 }; 22 }); 23 24 export default new Vuex.Store({ 25 modules: { 26 ...moduleStores, 27 }, 28 });
通過以上方法就可以動態的導入modules文件夾中的所有js文件,這樣就方便管理了,也不用一個個引入;
如果你某個文件不想引入可以在forEach中,通過判斷來解決:
1 context.keys().forEach(key => { 2 const fileName = key.slice(2, -3); 3 const fileNameInCamelCase = camelcase(fileName); 4 const fileModule = context(key).default; 5 6 if (fileName === 'user') { 7 return; 8 } 9 moduleStores[fileNameInCamelCase] = { 10 ...fileModule, 11 namespaced: true, 12 }; 13 });
管理依賴-webpack中文檔(2.2)-更多詳細內容可查 : https://www.html.cn/doc/webpack2/guides/dependency-management/