es6模块如何加载工作

时间:2014-07-03 00:14:51

标签: javascript module ecmascript-6

我一直reading about es6 module loaders我不太明白它是如何运作的,我希望有人可以启发我。

在上面的实际工作流程链接中,他们有一个这样的例子

System.import('app/app').then(function(app) {
  // app is now the Module object with exports as getters
});

没问题 - 我明白了。但后来我看到这样的东西

var $ = require('jquery');

真的很困惑。如果在此调用时jquery尚未传输到浏览器会发生什么?线程是否旋转?浏览器是否在幕后解析您的脚本并将其改为像RequireJs那样的回调?它可以配置什么?是否有特定的限制?

有人可以给我一个破产吗?

1 个答案:

答案 0 :(得分:4)

ES6模块加载器将获取源,确定依赖关系,并在执行模块之前等待这些依赖项加载。因此,当require执行时,依赖关系已经在那里等待执行。

当通过ES6模块加载器加载CommonJS时,我们依赖于静态解析源中的require语句,并且仅在加载了源时才执行源。

通过这种方式,我们可以在动态加载的浏览器中支持CommonJS。循环引用的处理方式与在Node中处理它们的方式相同。

解析require的正则表达式实际上非常可靠和快速,同时考虑了注释和周围的标记。有关SystemJS使用的文件,请参阅https://github.com/systemjs/systemjs/blob/master/lib/extension-cjs.js#L10

此方法还有一个限制,即动态和条件CommonJS要求if (condition) require('some' + 'name')未正确检测到。尽管使CommonJS在浏览器中表现为完全异步的模块格式,但这是一个必要的成本。