es6模块如何加载工作

Geo*_*uer 5 javascript module ecmascript-6

我一直在阅读 有关 ES6模块装载机,我只是不太明白它是如何工作的,我希望有人能赐教.

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

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

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

var $ = require('jquery');
Run Code Online (Sandbox Code Playgroud)

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

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

guy*_*ord 5

ES6 模块加载器将获取源代码,确定依赖项,并等待这些依赖项加载完毕后再执行模块。所以当 require 执行时,依赖已经在那里等待执行了。

当通过 ES6 模块加载器加载 CommonJS 时,我们依赖于从源代码中静态解析出 require 语句,并且只有在加载这些 require 后才执行源代码。

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

解析出 require 的正则表达式实际上非常可靠和快速,同时考虑了注释和周围的标记。见https://github.com/systemjs/systemjs/blob/master/lib/extension-cjs.js#L10SystemJS 使用的一个,。

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

  • ES6 模块加载器有两种解释模块的方式: 1. ES6 模块 2. 遗留模块格式 我们可以通过一个名为“实例化”的钩子将遗留模块格式构建到 ES6 模块加载器中。你是对的 - ES6 模块加载也有自己的循环引用风格,这与 CommonJS 不同。当将 CommonJS 支持写入加载器时,这可以允许完整的 CommonJS 风格的循环引用支持。在规范方面,模块加载器类行为本身在 ES6 规范中,单独的规范是确切的环境钩子。 (2认同)