Node.JS(新)Package.json exports 字段


翻譯自 Node.JS (New) Package.json Exports Field

聽說過 export 映射嗎?它相當強大!

總而言之

exports package.json 字段的文檔在這里 ,它來自這個提案。我不會涵蓋所有內容,因此如果您需要任何其他信息,請查看提案。
另外我沒有涉及 importsESModule 世界中非常有趣的領域。

“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-amodule-b 同時限制對 module-c. 我們還希望我們的包提供 CommonJSESModule 輸出。

以下是如何利用該 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM