【发布时间】:2017-07-08 01:51:05
【问题描述】:
我想要异步下载/执行这些脚本以防止页面呈现阻塞:
Bootstrap 依赖于 jQuery,因此它们必须按此顺序执行。这就是我使用defer 的原因,但我的问题也适用于async。
如何异步回退到我自己托管的 jQuery 或 Bootstrap 版本,或任何 CDN 托管的脚本?
我见过this related question on Stackoverflow,但这些解决方案不起作用,因为:
- 依赖
document.write,不能用于async/defer脚本;或: - 它不会立即执行回退脚本,导致无法加载 jQuery 并且其他依赖于 jQuery 的脚本会在 jQuery 回退之前加载。
我尝试了以下方法,但这也导致了我上面描述的问题 #2:
<script src="failing external CDN script" defer onerror="
var script = document.createElement('script');
script.async = false;
script.src = 'my own hosted version the script';
document.body.appendChild(script);
"></script>
【问题讨论】:
-
“我有这些脚本,我想异步下载/执行以防止页面渲染阻塞:” 为什么不把
script标签放在页面末尾,就在结束</body>标记之前?它们不会在那里渲染阻塞,您可以毫无困难地进行回退。 -
我 99% 确定第一个链接是完全错误的;当一个脚本被下载和它何时被执行不需要被链接(除了后者不能在前者之前发生);浏览器会提前扫描以查找要下载的内容。我还发现第二个说法非常可疑。任何官方的谷歌文档都这么说?我很高兴从 PageInsights 获得 100% 的收益,而没有看到
defer(没有双关语)。 -
@T.J.Crowder 如果您为 Bootstrap's example 运行 PageSpeed,您会看到它抱怨在关闭
</body>标记之前有一个阻塞脚本。 -
我不会感到惊讶。 :-) 但也请注意,它将关于渲染阻塞的 CSS 和 JS 警告混为一谈,并且通常将 CSS 放在标题中(触发警告,但详细信息会告诉您它是 CSS 还是 JS)。但无论如何,我的观点是,从根本上说 script-before-end-body-tag 不是问题。
标签: javascript html cdn html-rendering