vue一键引入指定文件夹下的组件(不限于vue/.vue文件/.js文件等等)

一、前言

在工作中经常通过一些小细节来增加代码可读性,让代码看起来更加优雅,同时可以减少不必要的操作和时间。

通常会遇到需要引入一堆功能或作用类似文件,不过已经给出了对应的Api可以优雅的解决


示例

二、正片

这里以框架vue在不同构建环境为例(webpack、vite)

1. webpack

先瞅代码

<script>
  const allComponents = require.context("./components", true, /\.vue$/);
  let res_components = {};
  allComponents.keys().forEach((item) => {
    let comp = allComponents(item);
    let name = comp.default.name;
    res_components[name] = comp.default;
  });

export default {
  name: 'StudentList',
  components: { ...res_components },
}
</script>
require.context() 是什么

一个webpack的api,通过执行require.context函数获取一个特定的上下文,主要用来实现自动化导入模块,在前端工程中,如果遇到从一个文件夹引入很多模块的情况,可以使用这个api,它会遍历文件夹中的指定文件,然后自动导入,使得不需要每次显式的调用import导入模块

require.context() 用法
  //传入参数
  require.context(directory, useSubdirectories = false, regExp = /^.//);
  //返回的函数
  function webpackContext(req) {return __webpack_require__(webpackContextResolve(req))};

接受三个参数:require.context(directory,useSubdirectories,regExp)
directory:说明需要检索的目录 ,你要引入文件的目录
useSubdirectories:是否要查找该目录下的子级目录
regExp:匹配文件的正则表达式,匹配要引入的文件 ,一般是文件名

返回的函数:function webpackContext(req) {return __webpack_require__(webpackContextResolve(req))};
函数有三个属性:resolve 、keys、id
resolve: 是一个函数,他返回的是被解析模块的id ,接受一个参数request。
keys: 也是一个函数,他返回的是一个数组,该数组是由所有可能被上下文模块解析的请求对象组成
id:是上下文模块里面所包含的模块 id. 它可能在你使用 module.hot.accept 的时候被用到

2. vite

先瞅代码

<script>
  import { defineComponent} from "vue";

  const allComponents = import.meta.globEager("../components/*.vue");
  let res_components = {};
  Object.keys(allComponents).forEach((item) => {
    let comp = allComponents[item];
    let name = comp.default.name;
    res_components[name] = comp.default;
  });

  export default defineComponent({
    components: { ...res_components },
  });
</script>

在使用vite 时,发现不能使用require.context 自动导入,可以使用import.meta.globEager或import.meta.glob替换

import.meta.glob()/import.meta.globEager()是什么

vite的glob函数是基于fast-glob实现的。fast-glob是node.js非常快速和高效的glob库提供了遍历文件系统和返回路径名的方法,这些路径名根据 Unix Bash shell 使用的规则和一些简化的规则返回匹配一组定义的指定模式,同时以任意顺序返回结果。快速、简单、有效。

import.meta.glob 为过动态导入,构建时,会分离为独立的 chunk
import.meta.globEager 为直接引入

import.meta.glob()/import.meta.globEager()需要注意什么
  • 这只是一个 Vite 独有的功能而不是一个 Web 或 ES 标准
  • 必须是相对路径(以 ./ 开头)或绝对路径(以 / 开头,相对于项目根目录解析)或一个别名路径
  • Glob 匹配是使用 fast-glob 来实现的 —— 阅读它的文档来查阅 支持的 Glob 模式
  • glob 的导入不接受变量,你应直接传递字符串模式。
  • glob 模式不能包含与包裹引号相同的引号字符串(其中包括 '",```),例如,如果你想实现 '/Tom\'s files/**' 的效果,请使用 "/Tom's files/**" 代替。

三、结束总结

此文只是已vue引用组件为例,只限于参考,具体场景再稍稍调整

适用场景

  • 在vuex中 多个modules模块 需要使用 import 一个一个引入
  • 如果页面需要导入多个组件时,一般的写法
  • 遍历目录所有图片、加载所有的图片
  • 等等。。。。。。。。

遇到的问题及解决方法

问题:引用的文件在同一目录,引用时带了此文件。
方法: let fileName = item.replace(/^.+[/\w+]/(.).\w+/, "1");//取所有文件名称
if (fileName === "index") return;//过滤当前文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容