2 个不稳定版本
新功能 0.2.0 | 2024年8月12日 |
---|---|
0.1.0 | 2024年7月7日 |
#141 在 开发工具 中
1,138 每月下载量
用于 45 个包(通过 rspack_core)
405KB
9K SLoC
Rspack Resolver
[!注意]
这是一个 oxc-resolver 的分支,将在 Rspack 中使用,因为 oxc-resolver 本身的目标不是与 enhanced-resolve 完全兼容,我们可能会添加一些 enhanced-resolve 特定功能,例如在将来添加pnp 支持
和替代支持
。
enhanced-resolve 的 Rust 版本。
- 内置 [tsconfig-paths-webpack-plugin]
- 支持扩展
tsconfig.extends
中定义的 tsconfig - 支持在
tsconfig.compilerOptions.paths
中定义的路径别名 - 支持在
tsconfig.references
中定义的项目引用 - 支持 模板变量 ${configDir} 用于替换配置文件目录路径
- 支持扩展
- 通过
FileSystem
特性支持内存文件系统 - 包含
tracing
仪器
用法
以下用法适用于 Rust 和 Node.js;代码片段是用 JavaScript 编写的。
要处理 package.json
中的 exports
字段,ESM 和 CJS 需要区分。
ESM
根据 ESM 解析算法
defaultConditions 是条件环境名称数组,["node", "import"]。
这意味着当调用者是 ESM 导入(import "module"
)时,解析选项应该是
{
"conditionNames": ["node", "import"]
}
CJS
根据 CJS 解析算法
LOAD_PACKAGE_EXPORTS(X, DIR)
- 让MATCH等于在ESM解析器中定义的PACKAGE_EXPORTS_RESOLVE(pathToFileURL(DIR/NAME), "." + SUBPATH,
package.json
"exports", ["node", "require"]),这是一个JSON文件。
这意味着当调用者是CJS require (require("module")
)时,解析选项应该是
{
"conditionNames": ["node", "require"]
}
缓存
支持CJS和ESM使用相同的缓存
const esmResolver = ResolverFactory({
conditionNames: ["node", "import"]
});
const cjsResolver = esmResolver.cloneWithOptions({
conditionNames: ["node", "require"]
});
浏览器字段
来自这个非标准规范
当将模块打包供客户端使用时,
browser
字段提供给JavaScript打包器或组件工具。
选项是
{
"aliasFields": ["browser"]
}
主字段
{
"mainFields": ["module", "main"]
}
引用esbuild的文档
main
- 这是标准字段,用于所有打算与Node一起使用的包。名称main是硬编码在Node的模块解析逻辑中的。因为它打算与Node一起使用,所以可以合理地期望该字段中的文件路径是CommonJS风格的模块。module
- 这个字段来自一个提案,用于将ECMAScript模块集成到Node中。因此,可以合理地期望该字段中的文件路径是ECMAScript风格的模块。这个提案没有被Node采纳(Node使用"type": "module"),但它被主要的打包器采纳,因为ECMAScript风格的模块可以实现更好的tree shaking,即移除死代码。browser
- 这个字段来自一个提案,允许打包器用其浏览器友好的版本替换特定于Node的文件或模块。它允许你指定一个替代的浏览器特定入口点。请注意,一个包可以使用browser和module字段同时指定(见下面的说明)。
错误
Error: Package subpath '.' is not defined by "exports" in
- 在没有conditionNames
的情况下解析时发生。
选项
选项与[enhanced-resolve]对齐。
字段 | 默认值 | 描述 |
---|---|---|
alias | [] | 模块别名配置列表或映射键到值的对象 |
aliasFields | [] | 描述文件中的别名字段列表 |
extensionAlias | {} | 映射扩展到扩展别名的对象 |
conditionNames | [] | 导出字段的条件名称列表 |
descriptionFiles | ["package.json"] | 要读取的描述文件列表 |
enforceExtension | false | 强制使用extensions中的扩展 |
exportsFields | ["exports"] | 描述文件中的导出字段列表 |
extensions | [".js", ".json", ".node"] | 应尝试的文件扩展名列表 |
fallback | [] | 与alias 相同,但在默认解析失败时使用 |
fileSystem | 应使用的文件系统 | |
fullySpecified | false | 传递给resolve的请求已经完全指定,并且不解析其扩展名或主文件(它们仍然用于内部请求) |
mainFields | ["main"] | 描述文件中的主字段列表 |
mainFiles | ["index"] | 目录中的主文件列表 |
modules | ["node_modules"] | 要解析模块的目录列表,可以是绝对路径或文件夹名称 |
resolveToContext | false | 解析到上下文而不是文件 |
preferRelative | false | 优先将模块请求解析为相对请求,并回退到解析为模块 |
preferAbsolute | false | 在回退到解析根目录之前,优先将服务器相对URL解析为绝对路径 |
restrictions | [] | 解析限制的列表 |
roots | [] | 根路径列表 |
symlinks | true | 是否解析符号链接到它们的符号链接位置 |
未实现选项
字段 | 默认值 | 描述 |
---|---|---|
cachePredicate | function() { return true };; | 一个函数,用于判断请求是否应该被缓存。将包含 path 和 request 属性的对象传递给函数。 |
cacheWithContext | true | 如果启用了不安全的缓存,则将 request.context 包含在缓存键中 |
plugins | [] | 要应用的其他解析插件列表 |
resolver | undefined | 一个准备好的解析器,插件将被附加到该解析器 |
unsafeCache | false | 使用此缓存对象不安全地缓存成功的请求 |
依赖项
~2.3–9.5MB
~87K SLoC