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

时间:2016-10-28 04:59:19

标签: javascript ecmascript-6 es6-module-loader es6-modules

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

然而,查看ES6 module documentation并阅读其他信息,我认为通过importexport关键字本机支持模块加载。如果是这种情况,我是否更正ES6 JS modules原生支持异步模块加载,因此我不需要使用其他工具,如CommonJSRequireJS

3 个答案:

答案 0 :(得分:7)

  

在我看来,通过导入和导出关键字本身支持模块加载。

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

  

如果是这种情况,我是否不需要使用CommonJS或RequireJS等其他工具?

没有。您仍然需要为ES6模块使用加载程序,它可以解析名称或路径或从import到实际模块文件的任何内容,并使用依赖于实现的方法加载它们。

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

  • webpack:将所有内容捆绑成一个大脚本
  • System.js:动态和异步加载单个模块(类似于require.js所做的那样)
  • native:node.js和web浏览器仍在计算如何在没有附加库的情况下支持模块加载
  • babel transpilation:您可以将ES6模块转换为AMD或CommonJS格式,并使用诸如require.js之类的已知工具来实现这些

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

https://github.com/systemjs/systemjs