提问者:小点点

推迟而不是实际推迟


起初,我把我所有的javascript都放在头上,但后来我注意到页面加载时间非常慢——这并不奇怪。因此,我将所有脚本移到了底部,以消除DOM渲染阻塞效果。

在Google的PageInsights页面上,他们说这不再是最佳实践,他们建议将脚本放在头部并添加异步加载

https://developers.google.com/speed/docs/insights/BlockingJS

根据我的理解,我遇到的问题是,如果使用异步,那么脚本将在加载完成后立即执行,因此您可能会遇到依赖性问题——这正是jQuery和依赖它的脚本所发生的情况。

https://calendar.perfplanet.com/2016/prefer-defer-over-async/

我发现有一个类似于async的defer属性,但它将执行推迟到加载。如果是这样的话,为什么我仍然遇到这些依赖性错误?

它不是每次都发生。碰巧,有时依赖于jQuery的脚本加载速度比jQuery本身快,如下所示。

我的问题是,我应该做些什么来确保所有东西都是异步加载的,但在加载完成之前不会执行?

希望这是一个简单的修复程序,没有大量花哨的javascript。


共2个答案

匿名用户

请注意,异步脚本不能保证按指定顺序执行,因此不应使用文档。写依赖于执行顺序或需要访问或修改页面的DOM或CSSOM的脚本可能需要重写以考虑这些约束。

简单建议:只需将脚本放在底部,或者只使用async标记,除非它们没有任何依赖项。

任何依赖于JQuery的东西都依赖于首先执行(加载)的JQuery。

此外,最佳实践可能是对捆绑包文件进行分块,微组织加载序列,并根据需要使用带有缓存buster的CDN(如果不使用版本控制),但这听起来像是过度优化。

或者,如果我没有看错您的代码,您需要延迟ajax。古格里皮斯。com/ajax/libs/jquery/3.1。0/jquery。min.js脚本行。

匿名用户

您仍在使用async下载jquery脚本,请将其更改为“延迟”。

您可能已经知道的有关async和defer的一些额外细节:

异步:在浏览器渲染时下载脚本,然后在该脚本下载完成并执行后停止渲染,然后继续渲染。

延迟:在浏览器渲染时下载脚本,然后等待DOM完成渲染,然后以正确的顺序执行脚本(仅当还具有src属性时)。

来自MDN:

“延迟此布尔属性设置为向浏览器指示脚本将在文档解析后,但在触发DOMContentLoaded之前执行。如果src属性不存在(即对于内联脚本),则不得使用此属性,在这种情况下,它将无效。”。

为了实现类似的效果,动态插入脚本使用async=false代替。具有延迟属性的脚本将按照它们在文档中出现的顺序执行。"