【问题标题】:Why are there different ways to import Modules in JavaScript?为什么有不同的方式在 JavaScript 中导入模块?
【发布时间】:2019-11-26 19:03:33
【问题描述】:

我不确定以下导入 JavaScript 模块的区别:

  • CommonJS
  • ES5
  • ES6
  • NodeJS
  • 打字稿

为什么有这么多方法可以导入 javascript 模块? “模块”在不同的实现中定义不同吗?是否都在做同样的事情,但语法不同?

【问题讨论】:

    标签: javascript node.js typescript commonjs


    【解决方案1】:

    在 ES5 及更早版本中没有模块。由于当时 JavaScript 中没有标准的模块系统,因此创建了各种模块系统(CommonJS、AMD 以及 Node.js 和 TypeScript 中的类似 CommonJS 的系统),但拥有它确实是一件非常有用的事情。因此,工具和工具制造商满足了这一需求。

    ES2015(又名“ES6”)为 JavaScript 中的模块创建了标准语法,现已被所有现代浏览器、Node.js 和 TypeScript 采用。该标准语法将模块标识符的语义留给主机环境,因此 Web 社区的领导者必须就如何在浏览器中执行它们达成共识(并且 Node.js 必须弄清楚如何在 Node.js 中执行它等),因此在 ES2015 发布和您能够原生使用该语法之间存在一些延迟(尽管 Webpack、Rollup 等处理了它)。

    在某些用例中,ES2015 的静态语法并不能很好地完成这项工作,因此 import() (dynamic import) proposal 在某些环境中已经得到支持,并将在 ES2020 中提供。

    【讨论】:

    • <opinion> 现在有了标准语法和广泛的支持,包括用于动态案例的import(),我怀疑 CommonJS 等的使用会随着时间的推移而减少。但话虽如此,支持 CommonJS 等的工具可能会继续这样做相当长的一段时间,所以它们很可能会继续使用。但是——再一次,这是意见——标准语法可能是未来,如果不是很大程度上是现在的话。 </opinion>
    • 谢谢!!!总结一下,如果我的意图是学习最新 Web 开发(2019 年 11 月)的最佳实践,我会为 vanilla JS 使用 ES6 模块导入,并在 Node.js 中使用节点模块系统?如果你愿意,你可以帮助澄清我的词汇......“节点模块系统”听起来很奇怪
    • @MM。 - 您现在可以在 Node.js 中使用 ESM(众所周知,JavaScript 模块系统,ECMAScript Modules)也是。 :-) 在 v13.something 中,它没有标记。在 v12 中,它位于旗帜后面。因此,只需学习一组语义,除非您最终出于遗留原因(或仅出于偏好原因)从事使用 CommonJS 或 AMD 的项目。
    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多