有三种类型的 resolver,每种都用于不同类型的模块:
compiler.resolvers.normal
:解析一个普通模块(common module)。compiler.resolvers.context
:解析一个上下文模块(context module)。compiler.resolvers.loader
:解析一个 loader。所有插件都应该使用 this.fileSystem
作为 fileSystem,因为它被缓存了。它只具有异步命名功能,但如果用户使用同步文件系统实现(即在增强需求中),则它可能表现为同步。
要加入 path 路径,所有插件都应该使用 this.join
。它规范了路径。此外还有一个 this.normalize
。
this.forEachBail(array, iterator, callback)
提供了一个 bailing async forEach
实现。
要将 request 传递给其他解析插件,请使用 this.doResolve(types: String|String[], request: Request, message: String, callback)
方法。types
是可能是多种 request 类型,按照优先级顺序进行匹配(test)。
interface Request {
path: String // 当前 request 目录
request: String // 当前 request 字符串
query: String // request 的 query string(如果有的话)
module: boolean // request 以模块为开始
directory: boolean // request 指向一个目录
file: boolean // request 指向一个文件
resolved: boolean // request 已被解析/已被完成
// 未定义(undefined)表示 boolean 字段为 false
}
// 示例
// 在 /home/user/project/file.js 中 require("../test?charset=ascii")
{
path: "/home/user/project",
request: "../test",
query: "?charset=ascii"
}
// 在 /home/user/project/file.js 中 require("test/test/")
{
path: "/home/user/project",
request: "test/test/",
module: true,
directory: true
}
resolve(context: String, request: String)
解析过程开始之前。
resolve-step(types: String[], request: Request)
解析过程中的一个步骤开始之前。
module(request: Request)
async waterfall找到一个模块 request,应该进行解析。
directory(request: Request)
async waterfall找到一个目录 request,应该进行解析。
file(request: Request)
async waterfall找到一个文件 request,应该进行解析。
这里列出 webpack 提供的默认插件列表。他们都是 (request: Request)
异步的 waterfall。
普通模块和上下文模块的处理过程是 module -> module-module -> directory -> file
。
loaders 处理过程是 module -> module-loader-module -> module-module -> directory -> file
。
module-module
应该在指定目录中查找模块。path
包含目录。
module-loader-module
(only for loaders)在模块模板(module template)应用于模块名称(module name)之前使用。该过程继续使用 module-module
。