vuex提供module功能,若是模塊不少,手工填寫至關麻煩,還容易弄錯,require.context()解決了此問題vue
// 查找modules目錄下的全部js文件
const files = require.context("./modules", false, /\.js$/)
const modules = {}
// 將文件列表賦值給modules
files.keys().forEach(key => {
modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
})
export default {
modules
}
複製代碼
import modules from './modules'
Vue.use(vuex)
return new vuex.Store({
modules
})
複製代碼
上面的操做實現了自動導入模塊 可是,多級模塊怎麼辦。 vuex是支持多級模塊,上面的方法若是遍歷全部的目錄,key就不對,包含「/」分隔符。vuex
modules:{
child1:{
},
child2:{
modules:{
}
}
}
複製代碼
下面就能夠實現多級模塊自動導入,但目錄結構得像這樣:bash
要實現多級目錄的導入要用遞歸方法,修改modules.js const files = require.context("./modules", true, /.js$/)ui
/**
* 讀取模塊
* @param ks
* @param value
* @param modules
* @param i
* @param len
* @returns {*|{}}
*/
export function getModule(ks,value,modules,i,len){
modules = modules || {};
if(i<len){
if(i == len -1){
// 最後一層,賦值
modules[ks[len -1]] = value;
}else{
let m = {}
// 在父級模塊,是否存在對象
if(modules[ ks[i]]&&modules[ ks[i]]['modules']){
m = modules[ ks[i]]['modules'];
}else if(modules[ ks[i]]){
let pm = modules[ ks[i]];
m = pm['modules'];
pm['namespaced'] = true;
}else{
let pm = modules[ ks[i]] || {}
modules[ ks[i]] = pm;
pm['modules'] = m
pm['namespaced'] = true;
}
i++
getModule(ks,value,m,i,len)
}
}
return modules;
}
files.keys().forEach(key => {
let k = key.replace(/(\.\/|index\.js)/g, '').replace(/(\/)$/g,'');
let ks = k.split('/');
if(ks.length > 1){
// 有子模塊
getModule(ks,files(key).default,modules,0,ks.length)
}else{
modules[k] = files(key).default
}
})
複製代碼
日誌輸出modules,獲得以下結果:spa
到此,就實現了無限制的多級模塊導入。