【问题标题】:<script type="module"> loading performance<script type="module"> 加载性能
【发布时间】:2016-05-12 19:17:08
【问题描述】:

我想&lt;script type="module"&gt; 的一个流行用例将是加载一个“主模块”,通过import 语句树解决项目的所有依赖项。但是,在 Web 上,这似乎会造成加载瓶颈,因为浏览器在解析它们的依赖项以找到 import 之前无法知道要下载哪些脚本。将此与在最初交付的 HTML 文件中的单独 &lt;script&gt; 元素中引用所有项目脚本的情况进行对比。脚本可以在解析 HTML 的同时和之后并行下载。

&lt;script type="module"&gt; 会造成加载瓶颈吗?一个页面上的多个&lt;script type="module"&gt;元素是否可以相互提供依赖关系,因此浏览器不一定需要下载和解析JavaScript来确定下一步要下载什么?

我想这将是 HTTP/2 PUSH_PROMISE 的一个用例?服务器需要静态分析 JavaScript 文件并提前确定它们的依赖关系。但是即使可以告诉浏览器提前下载模块,我想知道在解析 import 之前,推送的模块是否仍然不会执行。至少对于&lt;script&gt;,我知道他们会一有机会就执行。

【问题讨论】:

  • 我想 HTTP2 可以用来缓解大部分问题。但我很好奇这个问题的答案。
  • 目前没有浏览器支持 ES6 模块。你不觉得现在问这个问题有点太早了吗?
  • @Gothdo 恰恰相反,如果这个问题还没有得到解答,并且 ES6 模块解析是一种去优化,那就有点晚了;标准化、实施和采用工作将花费在我们已经拥有的技术上(至少在高性能生产场景中)。我希望这里已经投入了一些想法,并且原型证明&lt;script type="module"&gt; 匹配或优于&lt;script&gt;

标签: javascript html performance networking module


【解决方案1】:

&lt;script type="module"&gt; 加载模块的效率可能与&lt;script&gt; + 动态模块加载器一样有效。

多个&lt;script type="module"&gt;可以相互提供依赖。来源(via IRC):

我:如果我有一个&lt;script type="module" src="a.js"&gt;,其中“a.js”将export一个模块,我也有&lt;script type="module" src="b.js"&gt;,而“b.js”将import "./a.js";,将相同的实例以前&lt;script type="module" src="a.js"&gt;创建的模块可以用吗?

annevk:如果它们在同一个文档中,是的

这是因为重复导入是从每个窗口的“模块映射”中提取的(请参阅the spec):

如果 module map 包含带有键 url 的条目,则使用该条目的值异步完成此算法,并中止这些步骤。

通过创建多个&lt;script type="module"&gt; 元素,我们可以让浏览器在第一时间知道它需要下载的脚本,从而避免“依赖树瓶颈”。

“模块脚本”推迟模块的评估,直到它的所有依赖项都被获取;而“经典脚本”只是执行,因此动态模块加载器理论上可以更快。但是,如果该动态模块加载器也阻止了依赖项的执行,那么它的任务可能需要与import 一样长的时间才能完成。此外,对性能的真正威胁可能是网络。相比之下,评估可能是如此之快,以至于它是微不足道的。

【讨论】:

  • 为什么有人要自己回答他们提出的悬赏问题?我可以看到它被用来从第二个帐户转移积分,但这不是抢劫彼得支付彼得吗?
  • 一开始研究这个问题已经筋疲力尽,变得不耐烦(因此得到了赏金)并且仍然太渴望找到答案,所以我这样做了,并通过发表我的发现得到了一些结束。我在这里是为了知识,而不是积分。
  • 另见 developers.google.com/web/updates/2017/12/modulepreloadcaniuse.com/link-rel-modulepreload(仅限某些浏览器,截至 2020 年)以及第二个链接中“资源”下的链接(例如 spec
  • 轶事:我的(绝不优化)基于模块架构的项目加载速度比早期的非模块原型慢得多。我确信在页眉中添加链接会有所改善,但这似乎破坏了模块的一些有用性(因为我不必在页眉中复制有关依赖项的信息)。 耸耸肩我猜,每件事都需要权衡取舍。
猜你喜欢
  • 2022-09-30
  • 1970-01-01
  • 2018-07-18
  • 2011-06-14
  • 2017-06-17
  • 2011-05-13
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多