异步加载脚本时如何编写 CDN 回退表达式

本文关键字:CDN 回退 表达式 何编写 加载 脚本 异步 | 更新日期: 2023-09-27 17:56:54

我正在按如下方式设置我的jQuery捆绑包:

var bundle = new ScriptBundle("~/bundles/jquery", "//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js");
// Path to the version of the file on your server (in case the CDN fails)
bundle.Include("~/scripts/jquery-{version}.js");
// JS expression to run, to test if CDN delivered the file or not
bundle.CdnFallbackExpression = "window.$";
bundles.Add(bundle);

为了提高我的Google PageSpeed Insights分数,我选择异步加载脚本:

@Scripts.RenderFormat(@"<script src=""{0}"" async></script>", "~/bundles/jquery")

但是现在,它似乎总是使 CDN 回退表达式失败,并最终加载脚本两次; 一次来自我的回退捆绑包,一次来自 CDN 当异步调用完成时。 我假设是因为当它运行回退测试时,对 CDN 的异步调用尚未完成。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js" async=""></script>
<script>(window.$)||document.write('<script src="/bundles/jquery"><'/script>');</script>
<script src="/bundles/jquery"></script>

有没有更智能的方法来编写我的回退表达式?

有没有更好的解决方案?

我会将 jQuery 加载到更接近底部的位置,但随后它会破坏任何依赖于它的内联调用。

异步加载脚本时如何编写 CDN 回退表达式

<script id="srequire" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.jsWRONG" async="async"></script>
<script type="text/javascript">
    function sOnerror() {
        console.log("sOnerror");
        //if (typeof window.jQuery === 'undefined') {
            var scr = document.createElement("script");
            scr.src = "/bundles/jquery";
            scr.async = true;
            document.body.appendChild(scr);
       //}
    }
    var element = document.getElementById("srequire");
    console.log("element", element);
    if (element.addEventListener) {
        //element.addEventListener("load", onsuccess, false);
        element.addEventListener("error", sOnerror, false);
    } else if (element.attachEvent) {
        //element.attachEvent("onload", onsuccess);
        element.attachEvent("onerror", sOnerror);
    } else {
        //element.onload = onsuccess;
        element.onerror = sOnerror;
    }
</script>

为了让您测试它,我在 js 名称中输入了 WRONG 以检查脚本是否有效我在 ff chrome ie opra 和边缘上检查了它您可以使用 requireJS,但有时也会从 CDN 失败这就是我使用这个脚本的原因很高兴分享希望它有帮助

"如果加载导致错误(例如 DNS 错误或 HTTP 404 错误)执行脚本块必须只包括在元素上触发一个名为 error 的简单事件。

来源 w3.org