简单的JavaScript ES6与require()导入

3
我准备使用babel来使用ES6模块的导入/导出功能,但在这篇文章中看到了这句令人困惑的话。
它说:
ES6的importexportrequire()方法相结合,使我们能够将所有客户端代码组织成模块,并同时使用新版本JavaScript的全部功能。
这让人感觉ES6的系统和require()有两个不同的用途,因此采用这种babel/browserify方法是最好的选择。我的理解是它们都做同样的事情,只是稍微不同。有人能帮忙解释一下吗?
1个回答

9
这个声明是自相矛盾的。如果你接触过ES6/ES7,就不会想使用CommonJS风格的require,而是总是想使用import异步加载模块。实际上,ES6/ES7有一种编程方式来导入模块:System.import(...),但是加载器规范仍在讨论中...在它获得推荐状态之前,有一个polyfill(以及更多...):SystemJS。从现在开始,我会避免使用任何其他模块加载语法,因为几年后你的代码将可以在标准Web浏览器中完美执行,只需进行少量修改。
OP在某个评论中问道...
为什么ES6的System.import(...)需要js模块时,我们还需要ES6的import/export模块加载功能?它们不是执行同样的任务吗?
"

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

例如,假设您有一个需要插件的应用程序,并且某些选项具有名为loadPlugins的标志,可以是truefalse。因此,如果应用程序需要它们加载,您将希望加载它们:

"
if(options.loadPlugins) {
   Promise.all(
      options.plugins.map(plugin => System.import(plugin.path))
   ).then(() => {
      // Do stuff when all plugins have been already loaded!
   });
}

@qarthandso 我会在我的回答中更新并回答这个问题 ;) - Matías Fidemraizer
啊!我明白了。谢谢你。你是在使用特定插件的代码吗?还是Promise是 JavaScript 的关键字?虽然我不太理解这个代码,但现在我已经明白 importSystem.import 的概念了! - qarthandso
@qarthandso,由于您将针对每个插件路径调用System.import,因此您将获得许多承诺,您需要使用Promise.all,它接受一个承诺数组作为参数,并创建一个新的承诺,将所有承诺组合成一个。也就是说,只有当所有组合的承诺达到完成状态时,我才能执行某些操作! - Matías Fidemraizer
@qarthandso 请查看此链接 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise - Matías Fidemraizer
1
@qarthandso 不用谢!现在你有理由利用你的空闲时间了。 - Matías Fidemraizer
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接