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

关于package.json中exports字段条件解析及main/module字段必要性的技术咨询

关于package.json中exports字段条件解析及main/module字段必要性的技术咨询

你提的这些问题刚好说到了现代JavaScript模块系统里的核心细节,我来逐个给你解答清楚:

一、exports中的import/require是条件解析关键字吗?

完全正确!package.json里exports字段下的import和require就是条件导出标识,它的作用就是让Node.js、Vite、Webpack这类工具根据用户使用的模块语法,自动匹配对应的入口文件。

你的理解也完全没问题:

  • 当开发者用ESM语法导入时(注意你之前的示例有个小语法错误,应该用引号而非大括号):
    import { Foo } from 'my-lib'
    
    工具会自动解析到exports里指定的./dist/my-lib.js。
  • 当用CommonJS语法导入时:
    const myLib = require('my-lib')
    
    就会匹配到./dist/my-lib.umd.cjs这个UMD格式的文件。

二、有了exports之后,还需要main和module吗?

这俩字段和exports确实有功能重叠,但要不要保留取决于你的兼容性需求:

  • 从功能上看:exports是Node.js v12.7+引入的更强大、更灵活的字段,它完全可以替代main和module的作用——不仅能区分ESM/CJS,还能做子路径导出、条件环境匹配等更复杂的配置。
  • 从兼容性上看:如果你的包需要兼容一些旧工具(比如Webpack 4及更早版本)或者Node.js v12之前的版本,那最好保留main和module作为降级方案:
    • main是Node.js早期的标准入口字段,用来指定CommonJS模块的入口;
    • module是社区约定的字段,用来指定ESM模块的入口,很多旧构建工具会优先读取它。

简单说:如果你的用户都是用现代工具和新版本Node.js,只留exports就够;要是要兼容老环境,就同时保留三个字段,避免出现模块解析错误。

最后附上你提到的示例package.json(修正转义引号):

{
  "name": "my-lib",
  "type": "module",
  "files": ["dist"],
  "main": "./dist/my-lib.umd.cjs",
  "module": "./dist/my-lib.js",
  "exports": {
    ".": {
      "import": "./dist/my-lib.js",
      "require": "./dist/my-lib.umd.cjs"
    }
  }
}

备注:内容来源于stack exchange,提问作者Ole

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:09:32