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

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

听说过 export 映射吗?它相当强大!

总而言之

exports package.json 字段的文档在这里 ,它来自这个提案。我不会涵盖所有内容,因此如果您需要任何其他信息,请查看提案。
另外我没有涉及 importsESModule 世界中非常有趣的领域。

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

“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 映射中声明的路径。

就是这样 !
我们到此结束。我没有介绍如何使用生产/开发导出,但是你明白了,你可以自己试验它

上一篇:dart系列之:创建Library package


下一篇:project-lede / luci-app-godproxy