vuex前端工程化之动态导入文件--require.context( )
随着项目的复杂,文件结构越来越多,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文件呢?
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/
vuex前端工程化之动态导入文件--require.context( )的更多相关文章
- vue 动态注册路由 require.context
需求场景: 在日常的功能练习和调试过程中,需要一个demo项目进行功能测试,由于频繁.vue页面的同时,又要再router.js文件里面注册路由,感觉有点无聊和枯燥.基于此出发点,考虑能否自动读取文件 ...
- vue 动态添加路由 require.context()
之前的写法 'use strict' import Vue from 'vue' import MessageBroadcast from 'page/MessageBroadcast' import ...
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)
1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...
- 通过config文件配置动态导入模块
需求: 固定的服务中要调用不同的算法,当前服务中实现的动态导入是通过在config配置中加上参数:proto="AiProto(1,4)",在服务中from pathname im ...
- 公司内部技术分享之Vue.js和前端工程化
今天主要的核心话题是Vue.js和前端工程化.我将结合我这两年多的工作学习经历来谈谈这个,主要侧重点是前端工程化,Vue.js侧重点相对前端工程化,比重不是特别大. Vue.js Vue.js和Rea ...
- 使用webpack+vue.js构建前端工程化
参考文章:https://blog.csdn.net/qq_40208605/article/details/80661572 使用webpack+vue.js构建前端工程化本篇主要介绍三块知识点: ...
- vue组件续和前端工程化
1.3 插槽 slot template: ` <button> <slot></slot> </button> ` <my-button> ...
- 10分钟学会前端工程化(webpack4.0)
一.概要 1.1.前端工程化 随着前端的不断发展与壮大,前端变得越来越复杂,组件化.模块化.工程化.自动化成了前端发展中不可或缺的一部分,具体到前端工程化,面临的问题是如何提高编码->测试-&g ...
- 基于webpack的前端工程化开发解决方案探索(二):代码分割与图片加载
今天我们继续来进行webpack工程化开发的探索! 首先来验证上一篇文章 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML 中的遗留问题:webpack将如何处理按需加载的 ...
随机推荐
- time_formatter writeup
攻防世界time_formatter writeup UAF漏洞和命令注入. 前置知识 1.strdup函数 char * __strdup(const char *s) { size_t len = ...
- Docker部署Mysql实践
前言:由于Docker部署容器时,没有指定IP,当机器重启后,容器的IP会变化,所以在创建容器的时候,最好能固定IP:同时,在Ubuntu系统中,每次执行命令,都需要root权限,命令需要加sudo标 ...
- awk-03-操作符
操作符 在awk中,有3种情况表达式为假: 1.数字是0 2.空字符串 3.未定义的值 数值运算,未定义变量初始值为0 字符运算,未定义变量初始值为空 示例 1.截取整数( + - ) 2.感叹号 读 ...
- Golang语言系列-11-goroutine并发
goroutine 并发 概念 package main import ( "fmt" "time" ) /* [Go语言中的并发编程 goroutine] [ ...
- 22javascript笔记(2)
JavaScript 1.js事件和作用域 js事件:html页面中每一个元素都可以产生某些触发js函数的事件.这些事件是可以被js侦测到的一种行为,并且js程序能应对这些事件. 常见的html事件 ...
- linux service脚本
vim /etc/systemd/system/node_exporter.service [Unit] Description=node_exporter Documentation=https:/ ...
- 漏洞复现|Dubbo反序列化漏洞CVE-2019-17564
01漏洞描述 - Apache Dubbo支持多种协议,官方推荐使用Dubbo协议.Apache Dubbo HTTP协议中的一个反序列化漏洞(CVE-2019-17564),该漏洞的主要原因在于当A ...
- 【MySQL】自定义数据库连接池和开源数据库连接池的使用
数据库连接池的概念 数据库连接背景 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性 ...
- CAS 5.3使用MySQL数据库验证
一.本例环境说明 JDK 1.8 CAS 5.3 apache-maven-3.6.0 mysql-5.6.32 二.CAS 5.3基础环境搭建与验证 需要按照<CAS 5.3服务器搭建> ...
- Django CBV装饰器 中间件 auth模块 CSRF跨站请求
CBV添加装饰器 给CBV添加装饰器有三种方法,三种方法都需要导入模块: from django.utils.decorators import method_decorator 第一种直接在方法上面 ...