由于Node.js现在支持ES6模块,您可以简单地在您的package.json
中添加"type": "module"
,以简化import
/export
语法,即使没有--experimental-modules
标志,也可以通过node
CLI命令运行您的代码,没有任何问题。
1.这也意味着我们实际上不需要在代码中将ES6模块语法转换为CommonJS规范中的require()
。
1.但是在Node.js v16.x文档中,他们明确地列出了CommonJS(模块)和ECMAScript模块(加载器)规范之间的一些差异。因此,实际上不那么简单,做同样的事情不同。必须有一些权衡,以首选一个比另一个,这是我想知道的!
那么为什么有些人想使用ES6模块呢?它只是为了异步导入模块吗?我不这么认为。他们最多是因为一些比这更重要的原因。但显然朝着最新的语法发展将是一种趋势。有什么想法吗?
另外,我读过一些旧帖子,说大多数测试框架不支持ES6模块语法,从CommonJS列表的最后一点开始:
它不能用于加载ECMAScript模块(尽管可以从CommonJS模块加载ECMAScript模块)。
这意味着(嗯,乍一看确实不是那么可读),ES6模块的直接导入是不可能的CommonJS模块,但你可以做到这一点 * 间接 *。这可能是大多数人 * 不麻烦 * 迁移到Node.js上最新的import
语法的原因之一。
如果我上面提供的一些陈述是错误的,有人能纠正我吗?
1条答案
按热度按时间efzxgjgh1#
我的OP下面的评论部分已经变得相当大了。所以让我试着为自己(和未来的读者)提供一个结论,在我(最终)整理好许多标签(可能超过100个)之后,现在已经关闭了它们。
在Node.js中使用ES6模块语法而不进行翻译的好处是什么?
“没有蒸发”意味着您使用的Node.js版本必须支持ES6模块,根据@Felix Kling的回答,它从v12开始就支持ES6模块。
[...]所以这实际上并不像做同样的事情那么简单。
关键是“你可以可靠地在ES模块中
import
一个CommonJS模块”(引用自Simon Plenderleith的一篇文章),其中有一个到Node.js存储库中相关拉取请求的链接。@jabaa在我的OP的评论部分也提到了这一点。但不幸的是,他/她没有这方面的参考。那么为什么有些人想使用ES6模块呢?它只是为了异步导入模块吗?我不这么认为。他们最多是一些比这更重要的原因。[...]
其中一个 * 重要 * 的原因一定是树抖动,在我的OP下的注解部分中提到了两次。注意,虽然这在CommonJS模块上是可能的,但它在ES6模块上的性能一定更好,因为语法级ES6
import
本质上是静态的(我不是说import()
版本),ES6模块只会初始化一次。使用树抖动,您的代码会变小,因此您的网站/库将运行/加载更快。但很明显,向最新语法发展将是一种趋势。有什么想法吗?
当然。在我写这篇文章的时候,Node.js默认为
"type": "commonjs"
是因为兼容性,因为在过去ES6模块语法还没有被合并/发明。现在使用ES6模块语法是面向未来的,即使人们将来不使用Node.js,它也会工作(很抱歉这么说!但显然它在将来可能会被一些新的/花哨的东西取代...)