CommonJS淘汰后,JavaScript库package.json的main字段该如何配置?
停止分发CommonJS版本时package.json的
"main"字段处理方案 当JavaScript包维护者决定不再提供CommonJS版本时,针对"main"字段有两种合理的处理方式,具体取决于你的目标兼容场景:
方案1:将"main"指向ES模块入口
直接把"main"的值设置为和"module"、"exports"一致的ES模块路径,示例如下:
"type": "module", "module": "dist/pretty-print-json.js", "browser": "dist/pretty-print-json.min.js", "main": "dist/pretty-print-json.js", "types": "dist/pretty-print-json.d.ts", "files": ["dist"], "exports": "./dist/pretty-print-json.js",
适用场景
- 需要兼容不支持
"exports"字段的老旧打包工具或运行环境,这类工具可能会优先读取"main"作为入口,设置为ES模块路径能保证它们加载到正确的模块(前提是这些工具已支持ES模块)。 - 希望保持package.json字段的完整性,避免部分工具因缺失
"main"而抛出异常。
方案2:直接移除"main"字段
如果你的包目标用户都使用支持"exports"的现代Node.js版本和打包工具,可以直接删掉"main"字段,示例如下:
"type": "module", "module": "dist/pretty-print-json.js", "browser": "dist/pretty-print-json.min.js", "types": "dist/pretty-print-json.d.ts", "files": ["dist"], "exports": "./dist/pretty-print-json.js",
适用场景
- 包的使用者均采用Node.js 12.7+(该版本开始稳定支持
"exports")或现代打包工具(如Webpack 5+、Rollup 2+),这些环境会优先读取"exports",完全不需要依赖"main"。 - 希望精简package.json,移除冗余字段。
关键说明
根据Node.js官方规则,当包存在"exports"字段时,通过包名导入时"exports"的优先级高于"main",所以无论选择哪种方案,Node.js本身都会正确加载ES模块入口。差异仅体现在对老旧工具的兼容性上。
内容的提问来源于stack exchange,提问作者Pilaf T. Pilafian
相关产品推荐
相关产品推荐

