翻译自 Node.JS (New) Package.json Exports Field
听说过 export 映射吗?它相当强大!
总而言之
exports
package.json
字段的文档在这里 ,它来自这个提案。我不会涵盖所有内容,因此如果您需要任何其他信息,请查看提案。
另外我没有涉及 imports
到 ESModule
世界中非常有趣的领域。
“exports”
是什么?
该 exports
字段(或 “export map”
)提供了一种方法来为不同的环境和 JavaScript
风格公开您的包模块,同时限制对其内部部分的访问。
像 NodeJS
、浏览器
这样的环境,甚至是类似 node-env
的过滤器 production/development
,例如 React
可以(或是否?)将它用于带有警告和内容的开发构建,以及它的生产构建。EcmaScript
模块 import … from '…'
与 CommonJS
之类的风味 const … = require(…)
。
如何使用它
考虑以下结构:
my-awesome-lib
├── lib/
│ ├── whole-lib.browser.js (iife 格式)
│ ├── public-module-a.cjs (commonjs 格式)
│ ├── public-module-a.mjs (esmodule 格式)
│ ├── public-module-b.cjs
│ ├── public-module-b.mjs
│ └── internals/
│ ├── private-module-c.cjs
│ └── private-module-c.mjs
├── package.json
└── …
我们想要导出 module-a
并 module-b
同时限制对 module-c
. 我们还希望我们的包提供 CommonJS
和 ESModule
输出。
以下是如何利用该 exports
字段的示例
{
"name": "my-awesome-lib",
…
"exports": {
".": {
"browser": {
"default": "./lib/whole-lib.browser.js"
}
},
"module-a": {
"import": "./lib/public-module-a.mjs",
"require": "./lib/public-module-a.cjs"
},
"module-b": {
"import": "./lib/public-module-b.mjs",
"require": "./lib/public-module-b.cjs"
}
}
}
package.json | export field usage
注意:每个路径都应该相对于包根目录。意味着每条路径必须以 ./
通过提供有关我们的包的以下信息 my-awesome-lib
,我们现在可以像这样在任何地方(受支持)使用它:
// CommonJS flavor
const moduleA = require('my-awesome-lib/module-a')
// ESModule flavor
import moduleA from 'my-awesome-lib/module-a'
// 行不通的!
const moduleA = require('my-awesome-lib/lib/public-module-a')
const moduleC = require('my-awesome-lib/internals/private-module-c')
import moduleA from 'my-awesome-lib/lib/public-module-a'
import moduleC from 'my-awesome-lib/internals/private-module-c'
JavaScript usage
在这两种风格中,请注意路径中没有:/lib/
。 路径对应于我们在 exports
映射中声明的路径。
就是这样 !
我们到此结束。我没有介绍如何使用生产/开发导出,但是你明白了,你可以自己试验它