随便记录一些东西,如有错误欢迎指出

作者:心_c2a2

转发链接:https://www.jianshu.com/p/c894ea00dfec

require.context是什么

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

什么时候需要用到require.context

如果有以下情况,可以考虑使用require.context替换

index.js

modules

在Vue写的项目中,我把路由通过不同的功能划分成不同的模块,在index.js中一个个导入(原谅ide的警告-.-),但是如果项目变大了之后,每次手动import会显得有些力不从心,这里可以使用require.context函数遍历modules文件夹的所有文件一次性导入到index.js中

分析require.context

require.context函数接受三个参数

  1. directory {String} -读取文件的路径
  2. useSubdirectories {Boolean} -是否遍历文件的子目录
  3. regExp {RegExp} -匹配文件的正则

语法: require.context(directory, useSubdirectories = false, regExp = /^.//);

借用webpakc官网的例子

require.context('./test', false, /.test.js$/);

上面的代码遍历当前目录下的test文件夹的所有.test.js结尾的文件,不遍历子目录

大概用图片来表示的话就是这样子的

在index.js中调用 require.context('./test', false, /.test.js$/);会得到test文件下3个文件的执行环境

值得注意的是require.context函数执行后返回的是一个函数,并且这个函数有3个属性

  1. resolve {Function} -接受一个参数request,request为test文件夹下面匹配文件的相对路径,返回这个匹配文件相对于整个工程的相对路径
  2. keys {Function} -返回匹配成功模块的名字组成的数组
  3. id {String} -执行环境的id,返回的是一个字符串,主要用在module.hot.accept,应该是热加载?

这三个都是作为函数的属性(注意是作为函数的属性,函数也是对象,有对应的属性)

talk is cheap ,show me the code

结合工程看一下这3个属性返回了什么

我们在里层的modules文件夹新建一个index.js,用来收集所有的模块然后一次性导出给外层的index.js

这里我们先上代码,代码是写在里层的index.js中的(代码借鉴于加快Vue项目的开发速度)

这里我把require.context函数执行后的代码赋值给了files变量,files中保存了图一的以.js结尾的文件,files是个函数,我们分别调用者3个属性看看会返回什么

控制台打印结果

可以看到

执行了keys方法返回了一个由匹配文件的文件名组成的数组 id属性返回了匹配的文件夹的相对于工程的相对路径,是否遍历子目录,匹配正则组成的字符串

对于resolve方法可以看到它是一个函数接受req参数,经过实践我发现这个req参数的值是keys方法返回的数组的元素,接着我们传入其中一个元素执行resolve函数

resolve方法返回了一个字符串代表着传入参数的文件相对于整个工程的相对路径

同时files作为一个函数,也接受一个req参数,这个和resolve方法的req参数是一样的,即匹配的文件名的相对路径,而files函数返回的是一个模块,这个模块才是真正我们需要的

这个Module模块和使用import导入的模块是一样的

回到工程

  • 首先调用require.context导入某个文件夹的所有匹配文件,返回执行上下文的环境赋值给files变量
  • 声明一个configRouters用来暴露给外层index.js作为vue-router的数组
  • 调用files函数的keys方法返回modules文件夹下所有以.js结尾的文件的文件名,返回文件名组成的数组
  • 遍历数组每一项,如果是index.js就跳过(index.js并不是路由模块),调用files函数传入遍历的元素返回一个Modules模块
  • 因为我的路径是用export default导出的,所以在Module模块的default属性中获取到我导出的内容(即路由的结构),类似这种样子
  • 将上一步返回的所有路由结构添加到configRouters数组然后暴露给外层的index.js

外层index.js

  • 外层引入后导入到vue-router中就可以使用了

写在后面

在使用require.context自动导入路由文件时发现一个问题,路由的顺序不是你期望的样子,因为webpack是根据你文件夹中文件的位置排序的,这个时候需要定义一个标识符来给路由数组排序,这里我们给每个文件夹最上层的路由添加一个sort属性用于排序

随后在读取模块后,给外层index传入路由配置前,给路由的模块排序

require.context另外一个常用的地方是svg图标,可以不用每次导入图标文件,相对于以前的iconfont,svg。

作者:心_c2a2
转发链接:https://www.jianshu.com/p/c894ea00dfec

vue require图片_手把手教你使用require.context实现前端自动化相关推荐

  1. python 批量下载网页图片_手把手教你爬取天堂网1920*1080大图片(批量下载)——实战篇|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ /1 前言/ 上篇文章 手把手教你爬取天堂网1920*1080大图片(批量下载)--理论篇我们谈及了天堂网 ...

  2. 用python字符画生日快乐图片_手把手教你用python将图片做成字符画!

    字符视觉排序 我们可以看到list中左边的字符视觉上较深,右边的字符视觉上较浅. 打开图片,调整大小 打开我们需要转化的图片,并将图片调整为我们所指定的宽和高(字符画的宽和高) 我们使用PIL来进行图 ...

  3. python绘制小提琴图片_手把手教你用 Origin 绘制小提琴图

    在统计图像里面,小提琴图算是比较漂亮的一种图形了. 常见的小提琴图绘制方法包括 graphpad, R 语言,python 等,今天给大家介绍如何用 Origin 绘制小提琴图. 注明一点:Origi ...

  4. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

  5. 怎么批量在数字里加入网页_手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇

    /1 前言/ 平时我们要下载图片,要要一个一个点击下载是不是觉得很麻烦?那有没有更加简便的方法呢?答案是肯定的,这里我们以天堂网为例,批量下载天堂网的图片. /2 项目准备工作/ 首先 我们第一步我们 ...

  6. ppt怎么把图片做成翻书效果_手把手教你做图片翻书效果.ppt

    手把手教你做图片翻书效果 第六张幻灯片 (第2张翻第3张的动画过程) 第七张幻灯片 (右边超链接到自定义放映中的"第3张翻第4张" , 左边超链接到自定义放映中的"第3张 ...

  7. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  8. centos7 nginx安装_手把手教你PHP(一) Centos7上的LEMP配置

    相信有些刚刚接触web开发的小伙伴对于服务器上搭建web环境还不太了解,今天手把手教大家搭建lemp的线上环境,您需要做如下一些准备: 阿里云或者其他服务商的云主机一台 云主机已安装Centos 7 ...

  9. python 词云手把手_手把手教你生成炫酷的词云

    前言: 话说,在这个大数据时代,获取信息显得极为容易,可正是如此,我们想要对信息进行直观地了解难度就大了.Excel是一个很好的数据可视化方法,不过有时候我们的数据来源可能并不是一张或者多张Excel ...

最新文章

  1. Oracle会话和进程数的监控
  2. 《大数据导论》——1.4节案例学习背景
  3. ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件
  4. HDU 1573: X问题
  5. Java IO流学习总结八:Commons IO 2.5-IOUtils
  6. I.Mx6 使用串口连接PSAM卡的注意事项
  7. 可能是最好的单例模式
  8. 小米申请雷军签名商标获批
  9. oracle的ora01504,Oracle中的ORA-01548: active rollback segment '_SYSSMU1$' found
  10. 如何快速导入SVN服务器的项目代码
  11. stl非变易算法(一)
  12. [2018.07.17 T1] 字符串最大值
  13. DBC2000数据库,DBC2000怎么设置?DBC2000架设传奇教程
  14. unity如何实现图片透视_实战 | 自己实现扫描全能王
  15. [BZOJ3717] [PA2014] Pakowanie [状态压缩][dp]
  16. python爬虫之——爬取煎蛋网图片
  17. mysql ip访问限制解除
  18. 2018年5月出海记录(HYPACK、SES2000、Klein3000)
  19. efi linux win10,WIN10+UBUNTU15.04 kylin(EFI+GPT)
  20. 中望3D 2021出图进阶版-3D出图技巧合集

热门文章

  1. 自考计算机非笔试英语怎么考,自考中的非笔试课程是什么,怎么进行考核?
  2. db2 设置表 not null
  3. 打码(C语言)常见粗心小错误 (前方高能,一定要点)
  4. 选择自己用的到的文件编译一个CEGUISample(一)
  5. 模拟电子技术不挂科学习笔记3(放大电路的分析方法)
  6. JavaScript之BOM对象(JS函数作用域、window、history、location对象)
  7. python中列表相加规则_在Python字典列表中使用公共键/值求和值
  8. Python自动检测视频画面的旋转角度
  9. 微课|中学生可以这样学Python(6.5节):lambda表达式
  10. Python寻找给定序列中相差最小的两个数字