3

我正准备通过 babel 使用 ES6 模块导入/导出,但在本文中遇到了这个令人困惑的声明。

它指出:

ES6 的强大功能import与方法export相结合require(),让我们可以自由地将所有客户端代码组织到模块中,同时使用新版本 JavaScript 的所有功能编写代码。

这使它听起来像 ES6 的系统并require()服务于两个不同的目的,从而使这种babel/browserify方法成为最好的方法。我的理解是他们都做同样的事情,只是有点不同。谁能帮忙解释一下?

4

1 回答 1

9

这种说法是矛盾的。如果您进入 ES6/ES7,您将不想使用CommonJS样式require,但您总是希望使用import.

其实 ES6/ES7 有一种程序化的方式导入模块:System.import(...),但是loader 规范还在讨论中……

在它获得推荐状态之前,有一个 polyfill(而且不止于此......):SystemJS

从现在开始,我将避免使用任何其他模块加载语法,因为您的代码将在几年后在标准 Web 浏览器中完美执行,只需少量修改。

OP在一些评论中问...

当我们拥有 ES6 导入/导出模块加载功能时,为什么 JS 模块需要来自 ES6 的 System.import(...)?他们不是在执行相同的任务吗?

import语句只能位于代码文件的顶部。有时您可以根据执行某种逻辑知道要加载哪些文件,而import语法不支持条件。

例如,假设您有一个需要plugins的应用程序,并且某些选项有一个名为loadPluginswhich can be trueor的标志false。因此,如果应用程序想要加载它们,您将需要加载它们:

if(options.loadPlugins) {
   Promise.all(
      options.plugins.map(plugin => System.import(plugin.path))
   ).then(() => {
      // Do stuff when all plugins have been already loaded!
   });
}
于 2016-08-20T13:14:55.493 回答