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

Download history 6030/week @ 2024-04-24 4980/week @ 2024-05-01 6066/week @ 2024-05-08 6319/week @ 2024-05-15 5358/week @ 2024-05-22 10760/week @ 2024-05-29 18087/week @ 2024-06-05 12362/week @ 2024-06-12 9144/week @ 2024-06-19 14683/week @ 2024-06-26 7682/week @ 2024-07-03 8494/week @ 2024-07-10 7912/week @ 2024-07-17 10014/week @ 2024-07-24 10646/week @ 2024-07-31 12701/week @ 2024-08-07

每月下载量 42,770
22 包中使用(直接使用 3 个)

MIT 许可

405KB
9K SLoC

OXC Logo

Crates.io npmjs.com

Docs.rs Build Status Code Coverage CodSpeed Badge Sponsors Discord chat MIT licensed

Oxc Resolver

Rust 版本的 enhanced-resolve

  • 发布在 crates.ionpm
  • 内置 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)

  1. 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 }; 一个决定请求是否应该被缓存的函数。该函数接收一个带有 pathrequest 属性的对象。
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: "..."

输入值是 optionspathspecifier,返回值是 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

测试

测试是从以下移植的:

测试用例位于 ./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

赞助商

My sponsors

📖 许可证

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