使用require.context实现前端工程自动化

require.context是什么
什么时候需要用到require.context
这个时候我们可以使用require.context函数遍历modules文件夹的所有文件一次性导入到index.js中。
require.context参数说明
directory {String} -读取文件的路径 useSubdirectories {Boolean} -是否遍历文件的子目录 regExp {RegExp} -匹配文件的正则
//例如require.context('./modules', false, /.test.js$/)/*上面的代码遍历当前目录下的modules文件夹的所有.js结尾的文件,不遍历子目录就像这样*/router // 路由文件夹|__index.js // 总入口,这里做一些自动化处理|__common.js // 通用路由:声明通用路由|__modules // 业务逻辑模块:所以的业务逻辑模块|__b.js // 业务模块b|__home.js // 业务模块home:业务模块|__a.js // 业务模块a
在index.js中调用 require.context('./modules', false, /.js$/);会得到modules文件下3个文件的执行环境。
值得注意的是require.context函数执行后返回的是一个函数,并且这个函数有3个属性
resolve {Function} -接受一个参数request,request为modules文件夹下面匹配文件的相对路径,返回这个匹配文件相对于整个工程的相对路径
keys {Function} -返回匹配成功模块的名字组成的数组
id {String} -执行环境的id,返回的是一个字符串,主要用在module.hot.accept,应该是热加载?
这三个都是作为函数的属性(注意是作为函数的属性,函数也是对象,有对应的属性)
废话不多说 直接上代码,看看怎么用
index.js自动化文件中这么写
const files = require.context('./modules', false, /\.js$/)console.log(files.keys()) // ["./home.js"] 返回一个数组let configRouters = []/*** inject routers*/files.keys().forEach(key => {configRouters = configRouters.concat(files(key).default) // 读取出文件中的default模块})export default configRouters // 抛出一个vue-router期待的结构的数组
业务模块中这样写
import Frame from '@/views/frame/Frame'import Home from '@/views/index/index'export default [// 首页{path: '/index',name: '首页',redirect: '/index',component: Frame,children: [ // 嵌套路由{path: '',component: Home}]}]
大功告成!!!!

评论
