webpack的require-context

114 阅读1分钟

require.context

reqiure.context(directory, useSubdirectories = true, regExp = /^\.\/.*$/,mode = 'sync)
  • 参数一:要搜索的目录
  • 参数二:一个标记,表示是否还搜索其子目录
  • 参数三:一个匹配文件的正则表达式

webpack会在构建中解析代码中的 require.context()

实例

reqiure.context('./test',false,/\.test\.js$/)

(创建出)一个context,其中所有文件都来自test 目录,request以.test.js结尾

require.context('../',true,/\.stories\.js$/)

(创建出)一个context,其中所有文件都是来自父文件夹及其所有子级文件夹, request以.stories.js结尾

导出的结果

上下文模块导出一个带一个参数的(require)函数:请求。 导出的功能有三个属性:resolve,keys,id

  • resolve是一个函数,返回已解析请求的模块ID
  • keys是一个函数,它返回上下文模块可以处理的所有可能请求的数组。 如果要在目录中要求所有文件或与模式匹配,这将很有用
function importAll(r){
 r.keys().forEach(r);
}
importAll(require.context('../components/', true, /\.js$/))

require.context 的返回值,这个返回值是一个函数,只要传入函数名就会被 webpack 自动进行导入

const cache = {};
function importAll(r){
 r.keys().forEach(key =>  cache[key] = r(key))
 importAll(require.context('../components/', true, /\.js$/));
 // 在构建时缓存将填充所有必需的模块。
  • id是上下文模块的模块ID。这可能对有用module.hot.accept。

forEach() 性能比 map() 要好,map() 比 for 在遍历时要慢几百倍,如果追求性能,更推荐手工 for。

参考来源

webpack-context 参考