为什么在 JavaScript 中有不同的导入模块的方法?

Why are there different ways to import Modules in JavaScript?

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

为什么有这么多导入 javascript 模块的方法? "module" 在不同的实现中有不同的定义吗?都在做同样的事情但语法不同吗?

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

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

在某些用例中,ES2015 的静态语法不能完全胜任,因此 import() (dynamic import) proposal 已在某些环境中得到支持,并将在 ES2020 中得到支持。