NodeJS 包.json中的“main”和“module”与“exports”之间有什么区别?

rdlzhqv9  于 2023-01-16  发布在  Node.js
关注(0)|答案(2)|浏览(201)

我正在尝试编写一个既可以是require d又可以是import ed的库。我在网上找到了不同的方法,如下所示:

{
  "main": "mylib-cjs.js",
  "module": "mylib-esm.js"
}

以及

{
  "exports": {
    "import": "mylib-esm.js",
    "require": "mylib-cjs.js"
  }
}

这两种方法的优缺点是什么,它们有什么不同?

mwngjboj

mwngjboj1#

我认为你不应该再使用module了。它可以在webpack和其他一些捆绑工具中使用,但在node.js中不起作用。它是定义ESM入口点的旧方法。所以如果你纯粹是在编写FE库,使用module就可以了,但在node.js中你需要使用exports。只有在type: module模式下运行时,它才能正常工作。
不确定捆绑器和他们对exports的支持,但我希望他们能与节点的入口点保持一致。

4ioopgfo

4ioopgfo2#

"exports"替换了"module"字段。
关于"main""exports"之间的差异,请参见节点文档:
在软件包的package.json文件中,有两个字段可以定义软件包的入口点:"main""exports"。这两个字段同时适用于ES模块和CommonJS模块入口点。
所有版本的Node.js都支持"main"字段,但其功能有限:它只定义包的主入口点。
"exports"提供了"main"的现代替代品,允许定义多个入口点,支持环境之间的条件入口解析,并防止除“导出”中定义的入口点之外的任何其他入口点。这种封装允许模块作者为他们的包明确定义公共接口。
对于以当前支持的Node.js版本为目标的新程序包,建议使用"exports"字段。对于支持Node.js 10及更低版本的程序包,"main"字段是必需的。如果同时定义了"exports""main",则在支持的Node.js版本中,"exports"字段优先于"main"
请记住"main"字段仍然可以被其他在线工具使用,如jsDelivr:https://www.jsdelivr.com/features#publishing-packages

相关问题