【发布时间】:2019-11-26 19:03:33
【问题描述】:
我不确定以下导入 JavaScript 模块的区别:
- CommonJS
- ES5
- ES6
- NodeJS
- 打字稿
为什么有这么多方法可以导入 javascript 模块? “模块”在不同的实现中定义不同吗?是否都在做同样的事情,但语法不同?
【问题讨论】:
标签: javascript node.js typescript commonjs
我不确定以下导入 JavaScript 模块的区别:
为什么有这么多方法可以导入 javascript 模块? “模块”在不同的实现中定义不同吗?是否都在做同样的事情,但语法不同?
【问题讨论】:
标签: javascript node.js typescript commonjs
在 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>