依赖管理(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值
                }
        }
    }


}
posted @ 2021-03-18 11:38  Sebastian·S·Pan  阅读(605)  评论(0编辑  收藏  举报