2 个不稳定版本

新功能 0.2.0 2024年8月12日
0.1.0 2024年7月7日

#141开发工具

Download history 202/week @ 2024-07-02 204/week @ 2024-07-09 302/week @ 2024-07-16 188/week @ 2024-07-23 322/week @ 2024-07-30 302/week @ 2024-08-06

1,138 每月下载量
用于 45 个包(通过 rspack_core

MIT 许可证

405KB
9K SLoC

Rspack Resolver

[!注意]
这是一个 oxc-resolver 的分支,将在 Rspack 中使用,因为 oxc-resolver 本身的目标不是与 enhanced-resolve 完全兼容,我们可能会添加一些 enhanced-resolve 特定功能,例如在将来添加 pnp 支持替代支持

enhanced-resolve 的 Rust 版本。

  • 内置 [tsconfig-paths-webpack-plugin]
  • 通过 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. 让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 };; 一个函数,用于判断请求是否应该被缓存。将包含 pathrequest 属性的对象传递给函数。
cacheWithContext true 如果启用了不安全的缓存,则将 request.context 包含在缓存键中
plugins [] 要应用的其他解析插件列表
resolver undefined 一个准备好的解析器,插件将被附加到该解析器
unsafeCache false 使用此缓存对象不安全地缓存成功的请求

依赖项

~2.3–9.5MB
~87K SLoC