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

package.json中exports字段的键顺序是否影响功能?

package.json exports字段键顺序的常见疑问

先看你给出的exports配置示例:

// package.json
{
  "exports": {
    ".": {
      // 供TypeScript使用
      "types": "./file_with_type_defs.d.ts",
      // 供ESM解析使用
      "import": "./file_to_import.mjs",
      // 供CJS解析使用
      "require": "./file_to_require.cjs",
      // 兜底场景
      "default": "./file_one_more.js"
    }
  }
}

键顺序到底重要吗?

得分工具和场景来看:

  • 从JSON规范本身来说:对象键是无序的,语法上不保证键的顺序会被保留或按特定逻辑处理。
  • 从实际解析行为来说:现代JS引擎(包括Node.js)和工具(如TypeScript)在解析JSON时,会保留键的插入顺序(ES2015后的标准行为),所以键的实际顺序会影响工具的解析逻辑。

为什么文档会有“types放最前、default放最后”的要求?

TypeScript要求types放最前

早期TypeScript版本在解析exports时,可能会优先读取第一个匹配的字段,因此要求types放在最前确保被识别。但在新版本中,TS会直接查找exports对象里的types键,和位置无关——这也是你调换types顺序后没影响的原因。

文档里的“最前”更像是历史遗留的最佳实践,或者是为了兼容旧版工具/打包器,避免出现类型识别异常。

Node.js要求default放最后

Node.js处理exports的逻辑是按顺序匹配条件:解析模块时,会依次检查import(ESM场景)、require(CJS场景)等字段,找到第一个匹配的就停止。而default是兜底选项,只有当前面所有条件都不匹配时才生效。

如果把default放在其他条件前面,Node.js会优先匹配它,导致import/require等条件直接失效,完全违背兜底的设计意图。所以必须把default放在最后,才能保证条件匹配逻辑正常运行。

实际开发中的建议

  • types:虽然新版本TS不强制顺序,但建议放在最前,符合文档规范和兼容性要求。
  • import/require:顺序影响不大,但通常按import在前、require在后的习惯编写(对应ESM优先的趋势)。
  • default:必须放在最后,否则会破坏Node.js的条件匹配逻辑,导致模块解析异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:28:06