49 个版本 (稳定版)
1.10.2 | 2024年7月16日 |
---|---|
1.9.2 | 2024年6月30日 |
1.6.4 | 2024年3月29日 |
1.0.1 | 2023年12月21日 |
0.5.5 | 2023年11月30日 |
在 开发工具 中排名 16
每月下载量 42,770
在 22 个 包中使用(直接使用 3 个)
405KB
9K SLoC
Oxc Resolver
Rust 版本的 enhanced-resolve。
- 发布在 crates.io 和 npm。
- 内置 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)
- let MATCH = PACKAGE_EXPORTS_RESOLVE(pathToFileURL(DIR/NAME), "." + SUBPATH,
package.json
"exports", ["node", "require"]) 定义在 ESM 解析器中。
这意味着当调用者是 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使用"类型":"模块"),但它被主要的打包器采用,因为ECMAScript风格的模块可以实现更好的摇树优化,即删除死代码。browser
- 这个字段来自一个提议,允许打包器用浏览器友好的版本替换node特定的文件或模块。它允许指定一个替代的浏览器特定入口点。请注意,一个包可以同时使用browser和module字段(见下文注释)。
错误
Error: 包子路径 '.' 没有由 "exports" 在
- 当没有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 | 使用此缓存对象以不安全方式缓存成功的请求 |
调试
以下环境变量会为 oxc_resolver::resolve
函数发出跟踪信息。
例如:
2024-06-11T07:12:20.003537Z DEBUG oxc_resolver: options: ResolveOptions { ... }, path: "...", specifier: "...", ret: "..."
at /path/to/oxc_resolver-1.8.1/src/lib.rs:212
in oxc_resolver::resolve with path: "...", specifier: "..."
输入值是 options
、path
和 specifier
,返回值是 ret
。
NAPI
OXC_LOG=DEBUG your_program
Rolldown
RD_LOG='oxc_resolver' rolldown build
Rspack
RSPACK_PROFILE='TRACE=filter=oxc_resolver=trace&layer=logger' rspack build
测试
测试是从以下移植的:
- enhanced-resolve
- tsconfig-path 和 parcel-resolver 用于 tsconfig-paths
测试用例位于 ./src/tests
,固定值位于 ./tests
- alias.test.js
- browserField.test.js
- dependencies.test.js
- exportsField.test.js
- extension-alias.test.js
- extensions.test.js
- fallback.test.js
- fullSpecified.test.js
- identifier.test.js (参见
crates/oxc_resolver/src/request.rs
中的单元测试) - importsField.test.js
- incorrect-description-file.test.js (需要添加 ctx.fileDependencies)
- missing.test.js
- path.test.js (参见
crates/oxc_resolver/src/path.rs
中的单元测试) - plugins.test.js
- pnp.test.js
- resolve.test.js
- restrictions.test.js (部分完成,尚不支持正则表达式)
- roots.test.js
- scoped-packages.test.js
- simple.test.js
- symlink.test.js
无关测试
- CachedInputFileSystem.test.js
- SyncAsyncFileSystemDecorator.test.js
- forEachBail.test.js
- getPaths.test.js
- pr-53.test.js
- unsafe-cache.test.js
- yield.test.js
赞助商
📖 许可证
oxc_resolver
是免费和开源软件,根据 MIT 许可证 许可。
Oxc 部分复制以下项目的代码。
项目 | 许可证 |
---|---|
webpack/enhanced-resolve | MIT |
dividab/tsconfig-paths | MIT |
parcel-bundler/parcel | MIT |
tmccombs/json-comments-rs | Apache 2.0 |
依赖关系
~2.3–8.5MB
~71K SLoC