关于webpack require.context() 的那点事
先说
webpack里面有这么一招:使用require.context()方法来自动导入模块
官方文档有点深奥,老衲百度下拿了一段来直接使用,但是想看下它是如何运行的
本篇这里不会有太深入的研究,只是用一种解读方式更有助于理解它的原理
老衲使用的是随便vue项目的vuex改造来做例子
我们这里只研究require.context()怎么回事,不是讲解vuex怎么改造。
开始
先建这么个目录结构,里面2个模块:

模块里随便导出点东西,我们就用简单的对象:

在store.js中,然后我们抄了段代码是这样子的:

当然是先看输出结果,是这样子的:

这样,就成功读取了我们2个文件内导出的模块对象
研究
上面的代码可能有点玄乎,我们来改造下,拆解成最土的代码以便理解,比如这样子:

require.context()运行后,返回的是一个函数,把rcfn打印出来:

可以点击它(使用chrome),进入这个函数内部,看到这么些东西:

下面的模块向外暴露出webpackContext方法
这个方法有一个参数,返回了使用__webpack_require__方法加载的模块
并且webpackContext还有一个keys属性,是一个方法,返回了上面map对象的key
也就是我们上面例子调用时,modules目录下面的文件+路径名
所以很清楚了,代码中我们使用const moduleKeys = rcfn.keys(),来得到文件名数组:


新建一个空数组,遍历上面那个得到的文件名+路径数组,带入最开始require.context()返回的方法rcfn

上面提到,这个返回的方法,其实内部就是返回引用__webpack_require__来加载模块

这样,我们得到了modules数组,里面就是2个元素,每个元素里面有我们导出的默认模块
使用map过滤一下:


解散
总结 require.context() 用法就是 遍历目录下的文件名,再用文件名来加载文件中的模块。
关于webpack require.context() 的那点事的更多相关文章
- dva webpack 利用require.context加载多个model
dva redux数据管理都在models,根据业务不同models可能会有几十甚至上百的 [模块.js], 每次在index.js使用 app.model(require('./models/exa ...
- [Vue]webpack的require与require.context
1.require 1.1完整路径的require语句: require('tools'); //preset alias tools require('./js/main'); 1.2带表达式的 r ...
- 一张图带你了解webpack的require.context
很多人应该像我一样,对于webpack的require.context都是一知半解吧.网上很多关于require.context的使用案例,但是我没找到可以帮助我理解这个知识点的,于是也决定自己来探索 ...
- webpack的带表达式require和require.context()方法
带表达式的 require 语句如果 require参数含有表达式(expressions),会创建一个上下文(context),因为在编译时(compile time)并不清楚具体是哪一个模块被导入 ...
- require.context() 用于获取一个特定上下文的,webpack的一个api
参考链接: 1.https://www.jianshu.com/p/c894ea00dfec 2.https://www.jianshu.com/p/c894ea00dfec require.cont ...
- webpack中require.context 用法
1.require.context(directory, useSubdirectories = false, regExp = /^\.\//) Examples: require.context( ...
- webpack的require.context()实现路由“去中心化”管理
最近在开发一个大型vue单页面应用的时候,项目最初是将所有的路由写在一个router.js的文件里. const router = new Router({ mode: "history&q ...
- require.context('.', true, /\.router\.js/) webpack 编译的时候读取目录文件
const routerList = [] function importAll (r) { r.keys().map(value => { r(value).default.map(item ...
- webpack - require 概要
webpack 是一个预编译模块打包工具,它只会对使用到的模块进行打包. 一个模块是否被使用?可以根据该模块是否被 require 来判断.如果require时指定的是具体的模块名称与正确的路径,那么 ...
随机推荐
- java根据模板生成pdf
原文链接:https://www.cnblogs.com/wangpeng00700/p/8418594.html 在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支 ...
- Feeding Time 【bfs求最大连通块】
题目链接:https://ac.nowcoder.com/acm/contest/1870/J 题目大意:求最大的连通块是多大 主要是为了防止自己忘记bfs怎么写..... #include<s ...
- CSS内联--与块级元素区别
内联元素:1.内联元素(inline)不会独占一行,相邻的内联元素会排在同一行.其宽度随内容的变化而变化. 2.内联元素不可以设置宽高 3.内联元素可以设置margin,padding,但只在水平方向 ...
- MySQL之mysqldump数据备份还原
一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理 ...
- RMAN执行crosscheck archive报错ORA-19633问题处理
一.问题现象 RMAN connect target /; run { crosscheck archivelog all; } ORA-: control file record is out of ...
- Java Fibonacci 斐波那契亚
Java Fibonacci 斐波那契亚 /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternat ...
- 南宁AI项目
1.能了解并对项目整体进度情况有清晰的认识,什么时间点需要完成什么工作项. 2.认识了解项目干系人,能和客户独立沟通交流,理解现场业务,不要一问三不知,什么情况都不了. 3.能推动项目进展和问题及时处 ...
- 使用shared memory 计算矩阵乘法 (其实并没有加速多少)
#include "cuda_runtime.h" #include "device_launch_parameters.h" #include "d ...
- 基于【 Docker】二 || Docker的入门安装
一.前提条件 本文介绍 Docker CE 的安装使用. 目前,CentOS 仅发行版本中的内核支持 Docker. Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3. ...
- Unity UGUI Button 无法点击问题一例
理论上,只要一个按钮自己这一层或者子节点有一个控件勾选了RaycastTarget,并且按钮为Interactable的.并且不被其他可以点击的控件阻挡,那么这个按钮就可以被点击 在调一个界面时发现一 ...