【问题标题】:What's the benefit of using ES6 module syntax in Node.js without transpilation?在没有转译的情况下在 Node.js 中使用 ES6 模块语法有什么好处?
【发布时间】:2023-01-04 17:45:55
【问题描述】:

如题。由于 Node.js 现在支持 ES6 模块,您只需在 package.json 中添加 "type": "module" 即可促进 import/export 语法,即使没有 --experimental-modules 标志也可以通过 node CLI 运行您的代码-命令没有任何问题。大部头书:

  1. 这也意味着我们实际上不需要将我们的 ES6 模块语法从代码中的 CommonJS 规范转换为那些 require()
  2. 但在Node.js v16.x documentation 中,他们明确列出了 CommonJS(模块)和 ECMAScript 模块(加载器)规范之间的一些差异。所以它实际上是不是就像以不同的方式做同样的事情一样简单。必须有一些权衡来选择一个而不是另一个,这就是我想知道的!

    那么为什么有人要使用ES6模块呢?它仅用于异步导入模块吗?我不这么认为。他们大多是一些比这更重要的原因。但显然转向最新的语法将是一种趋势。任何的想法?


    附:我读过一些旧帖子说大多数测试框架不支持 ES6 模块语法,从 CommonJS 列表的最后一点开始:

    它不能用于加载 ECMAScript 模块(尽管可以从 CommonJS 模块加载 ECMAScript 模块)。

    所以我相信这可能是大多数人的原因之一不在乎关于迁移到 Node.js 上最新的 import 语法。

    如果我上面提供的某些陈述有误,谁能纠正我?

【问题讨论】:

  • 你可以用 ES6 导入 CJS 模块,但你不能用 CJS 导入 ES6 模块。这是主要原因。许多库只能作为 ES6 模块使用。
  • ES6 模块是语言的标准化部分,而不是(或多或少)特定于 Node.js 的解决方案。坚持语言标准可确保更好的跨环境兼容性。 ES6 模块的“静态特性”也使模块包更容易进行 tree shaking 等操作。越来越多的包在 Node.js 和 Web 之间共享。当然,如果您专门为 Node.js 编写了一些东西并且您没有使用 Typescript,那么您也可以坚持使用 require()
  • 我没有参考。我从 AFAIK 开始发表评论。我不知道我不能用 ES6 替换 CJS 模块的任何情况,但我知道我不能用 CJS 替换 ES6 模块的情况。 ES6 import可以导入ES6模块和CJS模块,但是CJS require不能导入部分ES6模块。您可以将 require() 替换为 import() 并处理承诺。据我所知,CJS 模块没有优势,您应该更喜欢 ES6 模块。
  • 没有同步import函数,在ES6中动态导入需要异步import函数,例如可选依赖项和可选功能,使用模拟模块进行单元测试。我不明白这个问题的意义。你问的是 ES6 的优点,但我想问的是 CJS 的优点和现在使用它的原因。我猜,CJS 很快就会消亡,因为越来越多的库被写入或转换为 ES6 模块。浏览器、Node.js 和 Deno 支持 ES6 模块。
  • 另一个重要特性 (IMO) 是顶级等待,仅在 (ES6) 模块中受支持。 ES6 模块不仅仅是时髦的。他们是优越的。它们允许使用 CJS 可以做的所有事情以及 CJS 没有的多种优势。

标签: javascript node.js ecmascript-6 es6-modules


【解决方案1】:

我OP下的评论区已经变得很大了。因此,让我尝试为自己(和未来的读者)提供一个结论,在我(最终)组织了很多选项卡(可能超过 100 个)之后现在关闭了它们。


在 Node.js 中使用 ES6 模块语法有什么好处没有转译

“without transpilation”意味着你使用的 Node.js 版本必须支持 ES6 模块,这它确实从 v12 开始,根据@Felix Kling's answer


[...]所以它实际上并不像做同样的事情那么简单不同的.

但实际上你可以import CommonJS模块没有问题,根据an article by Simon Plenderleith,其中包含指向 Node.js 存储库中相关拉取请求的链接。 This is also mentioned by @jabaa 在我的 OP 的评论部分下。但不幸的是,他/她没有参考资料。


那么为什么有人要使用ES6模块呢?它仅用于异步导入模块吗?我不这么认为。他们大多是一些比这更重要的原因。 [...]

那么其中一个原因一定是摇树, 其中提到两次在我的 OP 下的评论部分。请注意,虽然这在 CommonJS 模块上可能是可行的,但它在 ES6 模块上的性能必须更好,因为语法级 ES6 import 本质上是静态的(我不是在谈论 import() 版本),和 ES6 模块只会被初始化一次.通过 tree-shaking,您的代码变得更小,因此您的网站/库将运行/加载更快,并且速度很重要在前端,不是吗?


但显然转向最新的语法将是一种趋势。任何的想法?

绝对地。在我写这篇文章的时候,由于兼容性,Node.js 默认为 "type": "commonjs",因为在过去 ES6 模块语法还没有被合并/发明。现在使用 ES6 模块语法是面向未来的,即使人们将来不使用 Node.js,它也可以工作(抱歉这么说!但显然它可能会在未来被新的/奇特的东西取代......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2016-12-15
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多