翻譯自 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
映射中聲明的路徑。
就是這樣 !
我們到此結束。我沒有介紹如何使用生產/開發導出,但是你明白了,你可以自己試驗它 😉
我如何相遇的故事…… exports map
這里是 原作者如何發現 exports 字段的故事, 感興趣的轉到原文查看...
譯者注:可參考 axios-retry 這個庫的package.json