You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js CommonJS规范中LOAD_PACKAGE_EXPORTS的工作机制疑问

Node.js require()模块ID解析器:LOAD_PACKAGE_EXPORTS与LOAD_PACKAGE_SELF疑问解答

LOAD_PACKAGE_EXPORTS的NAME与SUBPATH分割规则

官方描述:

Try to interpret X as a combination of NAME and SUBPATH where the name may have a @scope/ prefix and the subpath begins with a slash ('/').

针对你的问题,明确规则如下:

  • SUBPATH的起始位置:当X包含多个斜杠时,SUBPATH从NAME部分结束后的第一个斜杠开始。比如@foo/bar/baz/qux里,NAME是@foo/bar,SUBPATH就是/baz/qux;无scope的foo/bar/baz中,NAME是foo,SUBPATH是/bar/baz。
  • @scope/前缀末尾的斜杠不能作为分隔符:@scope/是NAME的一部分,比如@babel/core里的@babel/属于NAME的组成部分,它末尾的斜杠只是scope与包名的内部分隔,不是NAME和SUBPATH的分界。
  • @scope/前缀属于NAME的一部分:带scope的包的NAME完整格式就是@scope/package-name,Node.js解析时会把整个字符串当作包名处理,@scope/是包名的必要组成部分。

LOAD_PACKAGE_SELF中slice操作的作用

官方定义:

let MATCH = PACKAGE_EXPORTS_RESOLVE(pathToFileURL(SCOPE), "." + X.slice("name".length), package.json "exports", ["node", "require"]) defined in the ESM resolver.

你猜的没错,这里的"name"就是package.json里的name字段。虽然X确实以name开头,但X的格式是name/subpath(比如lodash/map),X.slice("name".length)会把开头的name截掉,得到/map,再加.变成./map——这是PACKAGE_EXPORTS_RESOLVE要求的相对路径格式,因为这个ESM解析函数需要传入相对于当前包的路径(必须以.开头),所以必须通过slice去掉包名,再拼接.转换成符合要求的格式。

内容的提问来源于stack exchange,提问作者Tau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:34:54