【发布时间】:2015-09-05 12:54:08
【问题描述】:
我一直致力于为我的一个项目的 HEAD 部分中使用的外部脚本添加 defer 属性。我查询了多个延迟脚本标签的执行顺序。
以下是我的观察,这将有助于我们更好地理解我的查询:
根据http://www.w3.org/TR/html5/scripting-1.html
defer 属性存在,然后在页面完成解析时执行脚本
defer 属性确实有效。但是,我对执行顺序持怀疑态度。在 FF 和 Chrome 上似乎有所不同。
根据我的项目:
<script defer="defer" src="{SERVER_PATH}/deps.js?1441452359"></script>
<script defer="defer" src="{SERVER_PATH}/script1.js?1440067073"></script>
<script defer="defer" src="{SERVER_PATH}/script2.js?1441451916"></script>
在这里,deps.js 是大约 120kb(gzipped)的巨大文件,而 script1-3 是 20-50kb(gzipped)的常规大小。
在 Firefox 上,延迟脚本的执行确实按出现的顺序开始,但不会以相同的顺序完成。而在 chrome 上,除非前一个脚本完成执行,否则下一个脚本的执行不会开始。看起来 Chrome 是有道理的。
为了测试执行顺序,我在每个脚本的第一行和最后一行插入了 console.log,例如在 deps.js 中
console.log("Execution Start: deps");
// minified deps script content.
console.log("Execution End: deps");
在 Firefox 上的控制台输出下方:
Execution Start: deps
Execution Start: script1
Execution Start: script2
// Script Error as script1 needs deps to render completely.
// Script Error as script2 needs deps to render completely.
Execution End: deps
在 Chrome 上的控制台输出下方:
Execution Start: deps
Execution End: deps
Execution Start: script1
Execution End: script1
Execution Start: script2
Execution End: script2
但是,FF 上的行为并不总是如上所示。有时它确实像 Chrome 一样工作。它看起来像是一个仅限 Firefox 的问题。或者,可能是因为 deps.js 文件太重且被缩小并且需要时间来渲染。
任何有类似经验的人可以帮助我吗?如果需要任何其他信息,请告诉我。
PS:其他解决方案,例如,移动页面底部的脚本不是我目前正在考虑的事情。
【问题讨论】:
-
当您延迟文件时,保证它们(如果在浏览器中正确实现)按照它们出现在元素上的顺序执行。我最喜欢的问题解释:growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
-
@NinoŠkopac 我同意你的看法。他们应该按顺序执行。但是 FF 有时似乎表现不同,执行开始顺序相同,但执行结束顺序不同。相同的实现在 Chrome 上运行良好。奇数。
-
你用的是最新版的FF吗?
-
我在 Android 上的 Firefox 42.0.1 中看到了这个问题,并发现了这个 Mozilla 错误报告:bugzilla.mozilla.org/show_bug.cgi?id=1212696。
-
看起来有点疯狂,因为假设同步执行,其他一些脚本不可能在已经开始的脚本结束之前开始执行。如果是这种情况,则意味着 FF 执行了一些无论如何都不应该发生的多线程。你能确认你的开始和结束日志安排在同一个事件循环中工作吗?
标签: javascript html