标准答案

  1. main 是传统入口,exports 可以按条件和子路径控制可导入范围,通常优先级更高。
  2. type 决定 .js 默认按 CommonJS 还是 ESM 解释,.cjs/.mjs 可显式指定。
  3. module 是部分工具生态使用的约定,不等于 Node 原生统一标准。
  4. exports 变严格后,深层路径导入可能突然失败,需要提供兼容入口和迁移说明。

题目解析

main 是传统入口,exports 可以限制公开入口并按条件返回不同文件,type 和 cjs/mjs 决定模块解释方式。module 多是工具生态约定,不应当被当作 Node 原生统一字段。

exports 变严格后,消费者原来直接导入的深层路径可能失败;发布库要列出公共 API、类型声明、Node 条件和浏览器/打包器条件,并做真实消费者测试。

模块入口的兼容性属于发布契约。修改 type、exports 或文件布局时要测试 CommonJS、ESM、TypeScript、测试器、打包器和不同 Node 版本。

常见误区

  • 误区:只配置 main 不测试 ESM。改正:按支持范围测试 require、import、类型声明和条件导出。
  • 误区:exports 隐藏旧公共子路径却不提供迁移。改正:保留兼容入口或发布明确的迁移版本和说明。
  • 误区:type 改动后忽略测试脚本和构建工具。改正:验证所有执行入口、脚本和生产启动命令。

作者信息