依赖管理(require.context)
我们知道 nodejs 中,经常使用的 require
关键字,是一个函数,能够动态引入模块。而前端开发中,尤其是基于 webpack 的开发,你有可能会遇到 require.context
注意,require
后面的属性 context ,是 webpack 专属的,也就是 webpack 修改了 require
,使之拥有了额外的能力
这个 require.context
也是一个函数,能够引入一个文件内的所有模块,而 require
本身只能引入一个模块
下面讲讲 require.context
这个函数的详细功能,结合stackoverflow上的回答What is "require.context"?,
因为比较精通typescript一点,用ts描述基于require.contex的依赖管理:
declare namespace Webpack {
/**
* 这是模块id,webpack会将所有的模块构建成一个逻辑上的图,
* 我们知道图这种数据结构,需要一个id来标志每个部分
* webpack通过modelueId来区分每个模块
*/
type modelueId = string
/**
* 模块
*/
type modelue = {
default: any, //默认模块
[key: string]: any //有名称的模块
}
/**
* nodejs有require关键字,webpack在上面添加了自己的api: context
*/
interface require {
//这是webpack提供的API,会将指定目录下的得到的文件形成一个module,允许我们在runtime阶段动态引入目录下的文件
//该module中的每个文件,以request标志,resquet是一个字符串
//resquet是一个字符串,modelueId一样的作用,标志文件而已。
//注意被标志的文件没有进入webpack构建的模块图中,仅仅是在内存中存着
context: {
(
directory: string, //文件目录的路径,以使用该函数的js文件的相对路径为主,就像'../components/'
useSubdirectories?: true, //是否递归,如果目录有子目录,继续解析子目录
regExp?: RegExp, //模式匹配目录下的文件
mode?: 'sync' | '' //模块导入模式
)
: {
(request: string): modelue //解析一个request,动态注册一个模块,并返回该模块
resolve: () => modelueId //动态注册一个模块后调用该函数,得到该模块的id
id: modelueId //文件目录模块的id
keys: () => string[] //目录下得到的所有的文件的request值
}
}
}
}