如果我使用的是 ES6 模块,还需要模块加载器吗?

Do I still need a module loader if I'm using ES6 modules?

不幸的是,我对 JavaScript 模块加载器的了解仍在增长,我正试图了解它们与新 ES6 Modules 的关系。据我所知,使用 CommonJSRequireJS 之类的模块加载器使用 ES5 兼容 JavaScript 确实需要使用异步模块加载器来提高性能和加载仅作为需要使用相应的模块加载器的语法。

但是查看 ES6 module documentation 和阅读其他信息,在我看来模块加载是通过 importexport 关键字原生支持的。如果是这种情况,我是否更正 ES6 JS modules 本身支持异步模块加载,因此我不需要使用像 CommonJSRequireJS 这样的额外工具?

ES6 JavaScript 文件本质上被视为一个模块。如果您在 .js 文件中定义任何内容,它只会在该文件(本地范围)内可见。 export 的作用是,它公开定义为 export 的 类 / 变量,对外部可见。然后你可以将它导入另一个模块。还有其他定义模块的方法,例如使用 CommonjsAMD 等。如果您想动态延迟加载模块,则需要模块加载器。前任。 Systemjs就是这样一个动态模块加载器。它会在请求时从服务器动态获取物理模块文件,并防止多次加载同一个文件。在 SPA 应用程序中,过去必须在开始时加载所有内容才能工作。使用动态模块加载器,现在我们可以只拥有完成预期工作所需的文件。希望对你有帮助。

https://github.com/systemjs/systemjs

据我了解,ES6支持定义和导入模块的语法。导入所需模块的实际行为是基础设施的工作。

在现代浏览器中(截至 2016 年)没有内置功能来支持模块加载,因此您仍然需要像 SystemJS 这样的东西来进行实际加载。

it appears to me that module loading is natively supported via the import and export keywords.

不完全是。 importexport 声明只定义了每个模块的依赖关系和接口。它们允许静态提取命名所需模块的字符串,仅此而已。

If this is the case, do I not need to use an additional tool like CommonJS or RequireJS?

没有。您仍然需要为 ES6 模块使用加载器,它将名称或路径或任何从 imports 解析为实际模块文件并使用依赖于实现的方法加载它们。

有许多可用的工具或工具链,不同解决方案的示例是

  • webpack:将所有内容打包成一个大脚本
  • System.js:动态和异步加载单个模块(类似于 require.js 所做的)
  • 原生:node.js 和网络浏览器仍在研究如何在没有额外库的情况下支持模块加载
  • babel 转译:您可以将 ES6 模块转换为 AMD 或 CommonJS 格式,并使用已知的工具,如 require.js 这些