1. package.json exports 条件导出与类型解析(exports.types 条件、typesVersions 回退)的工程实践与常见踩坑
package.json 的 exports 条件导出如何配置?类型解析中 exports.types 条件与 typesVersions 回退各在什么场景使用,工程实践中有哪些常见踩坑?
- exports 字段的条件导出语法与通配符子路径映射
- exports.types 条件与 typesVersions 在 TS 类型解析中的优先级
- 双格式发布、require/import 条件与打包器解析的常见踩坑
exports 字段以"包名"为根声明子路径与条件的映射,如 "."、"./utils",每个目标可带 import/require/types/default 等条件,Node.js 按顺序匹配第一个成立的条件,未声明的子路径直接禁止访问(区别于 main/files 的宽松放行)。类型解析上,TS 先看 exports 内 types 条件(或 typesVersions 映射),再回退到顶层 types 字段;typesVersions 主要用于旧版本 TS 或无法用 exports 表达的历史路径重映射,现代包通常优先在 exports 中声明 "types" 条件并置于 import/require 之前,因为 TS 按条件顺序取第一个命中项。
常见踩坑:把 "types" 放在 import 之后导致 ESM 消费者解析到 .d.ts 失败;对 CJS/ESM 双产物分别提供 .d.ts 与 .d.mts,却忘记在 require 条件中声明类型导致 require 侧 any;exports 中通配符与精确路径冲突;以及在 exports 中使用 "./package.json" 之外未导出的路径造成运行时 Error [ERR_PACKAGE_PATH_NOT_EXPORTED]。工程建议是双产物各自带类型、把 types 条件放最前,并用 arethetypeswrong 工具校验发布的类型解析结果。
本题考察对"条件导出"作为现代包入口契约的完整理解:exports 不仅控制运行时解析,还参与类型解析,types 条件与 typesVersions 是两条互补的兼容路径。答题时应先讲清条件匹配顺序,再落到双格式发布的类型文件配对与常见错误,体现真实发布踩坑经验。
{
"name": "my-lib",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./utils": {
"types": "./dist/utils.d.ts",
"import": "./dist/utils.mjs",
"require": "./dist/utils.cjs"
}
}
}