异步加载脚本时如何编写 CDN 回退表达式?
How do i write a CDN fallback expression when loading a script asynchronously?
我正在按如下方式设置我的 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 加载到靠近底部的位置,但随后它会中断任何依赖于它的内联调用。
<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 上检查过,即 opra 和 edge
你可以使用 requirejs 但有时也会从 cdn 失败
这就是为什么我使用这个脚本
很高兴分享希望它有帮助
"如果加载导致错误(例如 DNS 错误或 HTTP 404 错误)
执行脚本块必须仅包括在元素处触发一个名为 error 的简单事件。"
我正在按如下方式设置我的 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 加载到靠近底部的位置,但随后它会中断任何依赖于它的内联调用。
<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 上检查过,即 opra 和 edge 你可以使用 requirejs 但有时也会从 cdn 失败 这就是为什么我使用这个脚本 很高兴分享希望它有帮助
"如果加载导致错误(例如 DNS 错误或 HTTP 404 错误) 执行脚本块必须仅包括在元素处触发一个名为 error 的简单事件。"