标准答案
- main 是传统入口字段,很多 Node 和旧工具默认读取它。
- module 常用于告诉打包工具 ESM 入口,但它不是 Node 标准字段。
- exports 可以精确声明不同子路径、不同条件下的入口,例如 import、require、types。
- types 或 typings 指向 TypeScript 类型声明文件。
- 配置这些字段时要保证 JS 产物、类型声明和实际文件路径一致,否则消费方会出现导入失败或类型丢失。
题目解析
这些字段的核心作用是入口解析。使用方写 import 或 require 时,工具链要根据 package.json 找到真正的文件。
exports 的优先级和约束更强。它可以让包发布方明确暴露哪些入口,也会让未声明的内部路径不能随意被深度导入,这对包的长期维护更友好。
类型入口不能当成附属品。TypeScript 项目里,types 指错会让运行时正常、开发时全红;JS 入口和类型入口要一起发布和验证。
代码示例
exports 可以同时声明 import、require 和 types 对应的文件。
JSON
{
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"require": "./dist/index.cjs"
},
"./style.css": "./dist/style.css"
}
}常见误区
- 只配置 main,导致现代构建工具无法优先使用 ESM 产物。
- exports 里漏掉子路径,使用方原本可用的深度导入突然失败。
- types 指向不存在或过期的声明文件,发布后类型体验损坏。