印前

向Web平台添加JavaScript模块

印前 · 2016-12-16翻译 · 488阅读 原文链接

长期以来,我们一直致力于研究WHATWG标准新特性。我们也一直在试图做件有意义的事情,就是告诉我们的博客读者更多这些新特性。现已经发生了一堆积压已久却令人着实兴奋的事,而我也被提名开始向你讲述关于"<script type="module">"的故事。

JavaScript 模块已有很长历史。它们最初定于2015年年初完成(将其纳入JavaScript规范"ES2015"版本的一部分),但随着截止日期临近,才发现模块的语法虽然已经准备就绪,但模块如何加载的语义仍然悬而未决。这是个难题,因为它涉及JavaScript引擎和它的宿主环境(可能是web浏览器,也可能是Node.js等其他宿主环境)的广泛集成。

最后达成妥协的解决方案是让JavaScript规范指定模块语法,然而却没有任何方法能让它真正运行。需要借助HostResolveImportedModule,宿主环境才能通过执行这些模块并加载模块的依赖关系将模块声明符(在"import x from x" 中的"x")解析为模块实例。然而一年过去了,由于虽然明确规定了模块语法,却未规定其语义,JavaScript模块还没在各浏览器中实现。

在发起的如史诗般的whatwg/html#433的请求中,我们努力指定这些缺失的语义。这涉及到对脚本执行流程的重大改变,以更好地整合现代JavaScript规范。WHATWG社区不得不讨论一些细微的问题,例如如何获取跨源模块脚本,是否应该或怎样应用 async, defer, 和 charset这些属性。讨论的最终结果在HTML标准中大部分都可以看到,能明显看到的是 script元素 脚本处理模型部分。根据Edge团队的申请,我们还 添加了worker模块,在创建 workers部分中可以看到。(这也即将纳入service workers 规范)。最后,我们给出一些示例:a couple for <script type="module">one for module workers.

当然,只是指定特性还没完,还需要落实!目前四个主要的渲染引擎都在积极实现这一特性,如果该引擎是开源的话,你还可以参与修复BUG,如下面这些BUG:

我们还要做许多关于规范方面的工作,也一直在讨论如何添加更高级的动态模块加载API,有像一个promise返回self.importModule这样的易事,也有像将这些实验性的想法在whatwg/loader repository中做出了原型这样更复杂的事。

当你发现在HTML标准中允许添加JavaScript模块的时候,希望你能和我们一样激动不已。接下来我们会尽快告诉你更多关于 WHATWG 标准近期发生的重要变化。

在 GitHub上的标准开发定义WindowProxy,Window和Location对象

相关文章