我看到一些npm模块的package.json有这样的
exports
{
"name": "my-package",
"exports": {
".": "./lib/index.js",
"./package.json": "./package.json"
}
}
"./package.json": "./package.json"
在出口中的目的是什么?我在 npm 文档中搜索了 package.json 但没有提到 exports
。
虽然 npm 文档没有提供
exports
关键字的解释,但我发现 Nodejs 文档对此进行了解释。
来自 nodejs 14.x,
“exports”字段提供了“main”的替代选项,其中 可以定义包主入口点,同时也封装 包,防止除了定义的入口点之外的任何其他入口点 “出口”。这种封装允许模块作者定义一个公共的 他们的包的接口。
警告:引入“出口”字段会阻止消费者 包避免使用任何未定义的入口点,包括 package.json(例如 require('your-package/package.json')。这将 可能是一个重大改变。
我发现这是一个不断发展的功能。在 nodejs 12.x 中添加了
要设置包的主入口点,建议定义 包的 package.json 文件中的“exports”和“main”:
{ "main": "./main.js", "exports": "./main.js" }
当定义“exports”字段时,包的所有子路径都是 封装后不再提供给进口商。例如, require('pkg/subpath.js') 抛出 ERR_PACKAGE_PATH_NOT_EXPORTED 错误。
这不是一个强封装,因为直接 require 包的任何绝对子路径,例如 require('/path/to/node_modules/pkg/subpath.js') 仍然会加载 subpath.js。
{ "main": "./main.js", "exports": { ".": "./main.js", "./submodule": "./src/submodule.js" } }
现在只有“exports”中定义的子路径可以被导入 消费者,而其他子路径会出错。