【发布时间】:2023-01-04 17:45:55
【问题描述】:
如题。由于 Node.js 现在支持 ES6 模块,您只需在 package.json 中添加 "type": "module" 即可促进 import/export 语法,即使没有 --experimental-modules 标志也可以通过 node CLI 运行您的代码-命令没有任何问题。大部头书:
- 这也意味着我们实际上不需要将我们的 ES6 模块语法从代码中的 CommonJS 规范转换为那些
require()。 - 但在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