当 JavaScript 包的维护者决定停止分发 CommonJS 版本时,
package.json文件的
"main"
字段中应该包含哪些内容?
以 CommonJS 文件作为 "main"
条目的旧
package.json字段示例:
"type": "module",
"module": "dist/pretty-print-json.js",
"browser": "dist/pretty-print-json.min.js",
"main": "dist/pretty-print-json.umd.cjs",
"types": "dist/pretty-print-json.d.ts",
"files": ["dist"],
"exports": {
".": {
"import": "./dist/pretty-print-json.js",
"require": "./dist/pretty-print-json.umd.cjs"
},
"./": "./dist/"
},
新 package.json 字段示例:
"type": "module",
"module": "dist/pretty-print-json.js",
"browser": "dist/pretty-print-json.min.js",
"main": “???????????”,
"types": "dist/pretty-print-json.d.ts",
"files": ["dist"],
"exports": "./dist/pretty-print-json.js",
node文档指出:
当通过
查找按名称导入时,"main"
字段定义包的入口点。它的值是一条路径。当包具有node_modules
字段时,在按名称导入包时,该字段将优先于"exports"
字段。"main"
node 将使用
"exports"
而不是 "main"
,但是各种不同的打包器可能会实现不同的规则。一旦软件包放弃对 "main"
CommonJS 模块的支持,是否应该简单地删除 require()
字段?
删除
"main"
字段并使用 "exports"
代替。
许多著名 npm 包的作者 sindresorhus,撰写了一篇题为 “如何将我的 CommonJS 项目转移到 ESM?”的常见问题解答,并推荐:
将 package.json 中的
替换为"main": "index.js"
。"exports": "./index.js"
对我所依赖的一些流行软件包的快速调查显示出许多不一致之处。有些软件包甚至设置
"type": "module"
并将 "main"
指向 ESM 文件。最重要的是正确设置"exports"
。