【问题标题】:CDN Fallback for Dependant Scripts依赖脚本的 CDN 回退
【发布时间】:2015-09-22 17:53:15
【问题描述】:

如果我使用以下脚本:

  • jQuery
  • jQuery 验证
  • jQuery 验证不显眼
  • 引导程序

Bootstrap 和 jQuery Validation 需要 jQuery 和 jQuery Validation Unobtrusive 需要 jQuery Validation,所以我们有相互依赖的脚本。我见过的后备脚本都是这样的:

(window.jQuery || document.write('<script src="/bundles/jquery"><\/script>'));
($.validator || document.write('<script src="/bundles/jqueryval"><\/script>'));
($.validator.unobtrusive || document.write('<script src="/bundles/jqueryvalunobtrusive"><\/script>'));
($.fn.modal || document.write('<script src="/bundles/bootstrap"><\/script>'));

问题是,如果我使用 ajax.aspnetcdn.com CDN 并且它失败了,那么第一行将导致 jQuery 被本地加载,但接下来的三行代码将在此之前执行并且错误,因为 $ 未定义.

是否有处理这些类型的相互依赖的后备脚本的标准方法?我环顾四周,找不到处理这种情况的资源。

更新

我尽我所能回答了这个问题,但我仍在寻找人们如何处理这个问题的答案。

【问题讨论】:

    标签: javascript jquery twitter-bootstrap cdn


    【解决方案1】:

    依赖另一个第三方脚本似乎有点矫枉过正,但我​​发现Fallback.jsYepNope.js 可能能够处理这种情况。我不确定 CDN 正常工作的日常场景对性能的影响。更多信息here

    我也尝试过编写自己的实现:

    JavaScript 回退

    (function (document, fallbacks) {
    
        var check = function (fallbacks, i) {
            if (i < fallbacks.length) {
                var fallback = fallbacks[i];
                if (fallback.test()) {
                    check(fallbacks, i + 1);
                }
                else {
                    var script = document.createElement("script");
                    script.onload = function () {
                        check(fallbacks, i + 1);
                    };
                    script.src = fallback.src;
                    document.getElementsByTagName("body")[0].appendChild(script);
                }
            }
        }
        check(fallbacks, 0);
    
    })(document, [
        { test: function () { return window.Modernizr; }, src: "/js/modernizr.js" },
        { test: function () { return window.jQuery; }, src: "/js/jquery.js" },
        { test: function () { return $.validator; }, src: "/js/jquery-validate.js" },
        { test: function () { return $.validator.unobtrusive; }, src: "/js/jquery-validate-unobtrusive.js" },
        { test: function () { return $.fn.modal; }, src: "/js/bootstrap.js" },
        { test: function () { return window.Hammer && window.Hammer.VERSION; }, src: "/js/hammer.js" },
        { test: function () { return window.Zepto; }, src: "/js/bootstrap-touch-carousel.js" }
    ]);
    

    CSS 回退

    使用元标记的想法是从新的 ASP.NET 5 MVC 6 框架中“借来的”。

    (function (document, fallbacks) {
    
        var metas = document.getElementsByTagName("meta");
    
        for (var i = 0; i < fallbacks.length; ++i) {
            var fallback = fallbacks[i];
    
            for (j = 0; j < metas.length; ++j) {
                var meta = metas[j];
                if (meta.getAttribute("name") == fallback.metaName) {
                    if (!fallback.test(meta)) {
                        var link = document.createElement("link");
                        link.href = fallback.href;
                        link.rel = "stylesheet";
                        document.getElementsByTagName("head")[0].appendChild(link);
                    }
                    break;
                }
            }
    
        }
    
    })(document, [
        {
            // metaName - The name of the meta tag that the test is performed on. The meta tag must have a class from the
            //            relevant stylesheet on it so it is styled and a test can be performed against it. E.g. for 
            //            font awesome the <meta name="x-font-awesome-stylesheet-fallback-test" class="fa"> meta tag is
            //            added. The 'fa' class causes the font awesome style to be applied to it.
            metaName: "x-font-awesome-stylesheet-fallback-test",
            // test - The test to perform against the meta tag. Checks to see if the Font awesome styles loaded 
            //        successfully by checking that the font-family of the meta tag is 'FontAwesome'.
            test: function (meta) { return meta.style.fontFamily === "FontAwesome"; },
            // href - The URL to the fallback stylesheet.
            href: "/css/font-awesome.css"
        }
    ]);
    

    【讨论】:

      猜你喜欢
      • 2012-09-15
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2019-12-25
      相关资源
      最近更新 更多