标准答案

  1. main 是传统入口字段,很多 Node 和旧工具默认读取它。
  2. module 常用于告诉打包工具 ESM 入口,但它不是 Node 标准字段。
  3. exports 可以精确声明不同子路径、不同条件下的入口,例如 import、require、types。
  4. types 或 typings 指向 TypeScript 类型声明文件。
  5. 配置这些字段时要保证 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 指向不存在或过期的声明文件,发布后类型体验损坏。

作者信息