gpt4 book ai didi

javascript - 如何在外部 CDN 脚本失败时异步回退? (异步/延迟)

转载 作者:行者123 更新时间:2023-11-30 15:30:32 28 4
gpt4 key购买 nike

我有这些脚本,我想异步下载/执行这些脚本以防止页面渲染阻塞:

<script src="jQuery CDN"延迟>></script>
<script src="Bootstrap CDN"延迟>></script>

Bootstrap 依赖于 jQuery,因此它们必须按此顺序执行。这就是我使用 defer 的原因,但我的问题也适用于 async

如何异步回退到我自己托管的 jQuery 或 Bootstrap 版本,或任何 CDN 托管的脚本?

我看过this related question on Stackoverflow ,但这些解决方案不起作用,因为:

  1. 它依赖于document.write,它不能用于async/defer脚本;或者:
  2. 它不会立即执行回退脚本,当无法加载 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>

最佳答案

I have these scripts that I want to download/execute asynchronously to prevent page render blocking

做到这一点的最简单方法就是将它们放在页面末尾,就在结束之前 </body>标签。它们不会在那里呈现 block ,您可以简单地进行回退:

<script src="jQuery CDN"></script>
<script>
if (typeof jQuery === "undefined") {
// ...add your local version instead...
}
</script>

您在评论中说过 PageSpeed 会提示 script </body> 之前的标签如果他们没有 defer .恕我直言,它并没有(请注意 code.jquery.com 的链接是故意断开的):

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="favicon.png">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-12">
Content here, turns green on click
</div>
</div>
</div>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<script src="https://code.jquery.com/jquery-2.2.4.mn.js"></script>
<script>
if (typeof jQuery === "undefined") {
document.write('<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"><\/script>');
}
</script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<script>
$(".col-md-12").on("click", function() {
$(this).css("color", "green");
});
</script>
</body>
</html>

从 PageSpeed 获得 100/100(如果您正确托管它——压缩等)。

现在,如果我有 CSS link在底部,我还会在顶部使用内联 CSS 来设置首屏内容的样式。 (但我可能不会打扰,我只是将 link 放在顶部并接受命中。我只将它放在该示例的底部,因为 PageSpeed 在其关于该主题的警告中将 JS 和 CSS 混为一谈,我想证明 script 就在 </body> 之前不会触发该错误...)


但是如果你想使用defer ,您必须收听 error您的问题中显示的事件。当然,这意味着您必须推迟添加依赖于 jQuery 的脚本,直到您拥有 load。来自原始脚本或其替换脚本,因为您无法插入到管道中。例如:

<script src="failing external CDN script" defer onerror="
var script = document.createElement('script');
script.async = false;
script.onload = addDependencies;
script.src = 'my own hosted version the script';
document.body.appendChild(script);
" onload="addDependencies()"></script>

...哪里addDependencies添加 script事物的标签取决于脚本。

关于javascript - 如何在外部 CDN 脚本失败时异步回退? (异步/延迟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42316521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com