如果生活有奇迹,那一定是努力的轨迹!
Hello,大家好,我是小羽同学,一个平凡而又不甘于平凡的前端开发工程师~
emmm,大兄弟们,在做项目的时候又没有遇到过那种就是要引入整个文件夹下的所有文件。文件少的时候还好说,但项目大了,就很容易出现那种要引入10多20个文件的情况,这个时候一个一个文件的引入是最简单的方法,也是最烦人的方法。所以有没有什么好的解决方案呢?
小羽在开发SULG UI 组件库的时候也遇到了这个问题,咱们一起来看看小羽当时是怎么处理这个问题的~
1.require.context()
自动加载文件主要是使用了webpack中的require.context(),来动态引入文件。
来,咱们先看下require.context()到底是个啥子东西。
打开webpack的文档,搜索require.context,可以看到如下的内容。
可以通过
require.context()函数来创建自己的 context。可以给这个函数传入三个参数:一个要搜索的目录,一个标记表示是否还搜索其子目录, 以及一个匹配文件的正则表达式。
webpack 会在构建中解析代码中的
require.context()。语法如下:
require.context( directory, (useSubdirectories = true), (regExp = /^\.\/.*$/), (mode = 'sync') );示例:
require.context('./test', false, /\.test\.js$/); //(创建出)一个 context,其中文件来自 test 目录,request 以 `.test.js` 结尾。
2.获取文件夹下的所有文件
不想举栗子了,那就直接实战吧~
如SULG UI中的指令文件夹如下,那我们该怎么通过require.context()来获取所有的文件呢?
在index.js中,咱们写下如下的代码,然后打开控制台。可以看到已经成功获取到我们的文件路径。
let res = require.context('./modules', false, /^\.\/.*\.js$/)
console.log(res.keys())
3.注册自定义指令
vue中注册自定义指令的方式大概如下
Vue.directive('指令名称', {指令内容});
将指令注册和require.context()结合起来可以得到如下代码
import Vue from "vue"
Vue.use((Vue) => {
((requireContext) => {
const arr = requireContext.keys().map(requireContext);
(arr || []).forEach((directive) => {
directive = directive.__esModule && directive.default ? directive.default : directive;
Object.keys(directive).forEach((key) => {
Vue.directive(key, directive[key]);
});
});
})(require.context('./modules', false, /^\.\/.*\.js$/));
});
然后我们只用引入该文件,就可以直接使用相关的指令了
4.其他场景
除了在自定义指令中用到了该方式,还有如下的一些场景也会经常使用到该方式
API接口
如在api文件夹下,我们也可以通过该方式动态加载modules下的所有js文件。
VUEX
同上,直接动态加载modules下的所有js文件,然后通过createStore统一创建。
小结
本文是小羽拆解SULG UI组件库得到的一小部分知识点。主要带着小伙伴们实现文件的自动化加载,并提供一些常见的使用场景,从而提高开发的效率。
如果看这系列文章后,感觉有收获的小伙伴们可以点赞+关注哦~
如果想和小羽交流技术可以加下wx,也欢迎小伙伴们来和小羽唠唠嗑,嘿嘿~
ps:纯原创,转载请标明出处
最后奉上SULG UI组件库的GitHub链接:github.com/sulgweb/sul…
如果条件允许的话,希望小伙伴们给小羽的github添加一颗小星星哦~