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