查看: 75|回覆: 0

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

[複製鏈接]

1

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-3-27
發表於 2021-11-18 18:18:00 | 顯示全部樓層 |閲讀模式

翻译自 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



来源:https://www.cnblogs.com/taohuaya/p/15573719.html
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部