我正在尝试编写一个既可以是require d又可以是import ed的库。我在网上找到了不同的方法,如下所示:
require
import
{ "main": "mylib-cjs.js", "module": "mylib-esm.js" }
以及
{ "exports": { "import": "mylib-esm.js", "require": "mylib-cjs.js" } }
这两种方法的优缺点是什么,它们有什么不同?
mwngjboj1#
我认为你不应该再使用module了。它可以在webpack和其他一些捆绑工具中使用,但在node.js中不起作用。它是定义ESM入口点的旧方法。所以如果你纯粹是在编写FE库,使用module就可以了,但在node.js中你需要使用exports。只有在type: module模式下运行时,它才能正常工作。不确定捆绑器和他们对exports的支持,但我希望他们能与节点的入口点保持一致。
module
exports
type: module
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
"exports"
"module"
"main"
package.json
2条答案
按热度按时间mwngjboj1#
我认为你不应该再使用
module
了。它可以在webpack和其他一些捆绑工具中使用,但在node.js中不起作用。它是定义ESM入口点的旧方法。所以如果你纯粹是在编写FE库,使用module就可以了,但在node.js中你需要使用exports
。只有在type: module
模式下运行时,它才能正常工作。不确定捆绑器和他们对
exports
的支持,但我希望他们能与节点的入口点保持一致。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