vuex中使用require.context动态引入模块

当要管理的状态比较多,有一定的功能区分的时候,就可以将其拆成几个模块,然后再在index页面内引入。

如果手动去引入的话,就显得不高级,所以这个时候就可以用到webpack的require.context函数做到自动化引入,以后要新增多少模块,都不用再在index文件夹中手动再入加入一遍。

使用require.context()函数创建一个context.
参数:
1、要搜索的目录;
2、标记是否还搜索其子目录,true:搜索子目录,false:不搜索子目录
3、匹配文件的正则表达式。在引入store模块的时候,文件后缀都是.js,所以表达式是/.js$/
如下:

// store文件夹下的index.js文件中写入
const modulesFiles = require.context('./modules',true,/\.js$/)

·注意:·传递给require.context函数的参数,必须是是字面量
这样就可以引入modules文件夹下面的所有js文件,得到一个变量为modules的函数。

modulesFiles是个函数,这个函数有3个属性,分别是:

  • resolve,是一个函数,返回模块id;
  • keys,函数,返回一个由所有被上面函数表达式处理引入的文件的相对路径组成的数组。
  • id,可能在使用module.hot.id的时候用得到。
    modulesFiles还可以接收一个参数,参数内容是相对路径字符串,也就是keys函数返回的内容。返回的是一个es module
    例如
// 定义一个对象,用来存放modules
const modules = {}
// modulesFiles.keys()的输出结果如下:
// ['./app.js', './errorLog.js', './permission.js', './settings.js', './tagsView.js', './user.js']
modulesFiles.keys().forEach(modulePath => {
// modulePath 是文件的相对路径的字符串,如上。所以要想获取模块名字,要用正则表达处理后使用
	const moduleName = modulePath.replace(/\.\/(.*)\.\w+$/,;'$1')
	// 此段正则表达式解析
	// .* .匹配除换行符\n之外的所有单字符,*表示0次或多次
	// \w 匹配任意拉丁字母表中的字母数字字符以及下划线,等价于[A-Za-z0-9_]
	// + 匹配1次及其以上
	// ()和$1,$1表示返回的()中第一次匹配返回的结果。举例这里的返回结果就是模块名字
	const value = modulesFiles(modulePath) // 这里传入的参数是一个相对路径,返回的是一个es module。有两个属性,分别是:default和_esModule。其中default是模块的内容。
	modules[moduleName] = value.default 
)
// 最后,我们要引入的store模块都在modules这个对象里面了,这个时候我们再将其创建成一个store实例
const store = new Vuex.Store({
  modules
})

参考:require.context

在Vue项目,要正确配置webpack使用require.context进行动态导入,你需要按照以下步骤操作: 1. **理解require.context**:require.context是一个webpack的编译时函数,允许你创建自己的上下文,用于动态导入。你可以指定一个目录,是否搜索子目录,以及匹配文件的正则表达式。 2. **配置webpack**:在webpack的配置文件(通常是webpack.config.js),你需要确保有两个配置选项是启用的: - **context**:设置为你的项目源文件的根目录。 - **resolve.alias**:这可以用来定义模块的别名,使得require.context可以更方便地使用。 3. **使用require.context**:在你的Vue组件或JavaScript文件,你可以使用require.context来创建上下文,并使用它的.keys()和.resolve()方法动态地加载模块。 以下是一个简单的配置示例: ```javascript // 在webpack.config.js const path = require('path'); module.exports = { //... resolve: { alias: { // 设置别名,例如: '@': path.resolve(__dirname, 'src'), // 其他别名... }, }, //... }; // 在Vue组件或JavaScript文件使用require.context const files = require.context('路径', 是否递归搜索, 正则表达式); const modules = files.keys().reduce((modules, modulePath) => { const key = modulePath.replace(/(\.\/|\.js)/g, ''); modules[key] = files(modulePath); return modules; }, {}); ``` 这里是一个具体的使用场景: ```javascript // 假设我们有一个目录结构如下: // components/ // ├── Button.vue // ├── Icon.vue // └── Layout/ // ├── Header.vue // ├── Footer.vue // 我们想动态加载components目录下的所有组件 const requireComponent = require.context('./components', false, /\.vue$/); const components = requireComponent.keys().reduce((components, filePath) => { const componentConfig = requireComponent(filePath); const componentName = filePath.split('/').pop().split('.')[0]; components[componentName] = componentConfig.default || componentConfig; return components; }, {}); // 现在可以在Vue实例这样使用components对象: // components: { // Button: components.Button, // Icon: components.Icon, // LayoutHeader: components.LayoutHeader, // LayoutFooter: components.LayoutFooter // } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值