【问题标题】:How to manage multiple Cdn files and their CdnFallBackExpression?如何管理多个 Cdn 文件及其 CdnFallBackExpression?
【发布时间】:2015-04-01 20:55:29
【问题描述】:

如果我想通过 bundleconfig.vb 文件管理我的 Cdn 文件并从 Cdn 加载 Kendo-ui,我需要创建 2 个这样的包:

    Dim kendoWebBundle = New ScriptBundle("~/bundles/kendo", kendoCndWeb).Include("~/Scripts/kendo/kendo.web.min.js")
    kendoWebBundle.CdnFallbackExpression = "typeof kendo"
    bundles.Add(kendoWebBundle)

    Dim kendoAspBundle = New ScriptBundle("~/bundles/kendoMvc", kendoCndAsp).Include("~/Scripts/kendo/kendo.aspnetmvc.min.js")
    kendoAspBundle.CdnFallbackExpression = "typeof kendo"
    bundles.Add(kendoAspBundle)

但是,我的第二个后备表达式不起作用,因为 kendo 将被定义:

输出:

<script src="//cdn.kendostatic.com/2014.2.716/js/kendo.web.min.js"></script>
<script>(typeof kendo)||document.write('<script src="/Gabarit.Web/bundles/kendo"><\/script>');</script>

<script src="//cdn.kendostatic.com/2014.2.716/js/kendo.aspnetmvc.min.js"></script>
<script>(typeof kendo)||document.write('<script src="/Gabarit.Web/bundles/kendoMvc"><\/script>');</script>

是否有一些kendo.aspnetmvc fallback 表达式或者我需要一起管理我的 Cdnfallback(bundleconfig 中没有 fallbackExpression,手动验证 kendo 类型,如果未定义,则在本地加载所有 kendo 文件)?

如果我选择第二个选项,如果我的 CDN 发送 kendo.web.min.js 而不是 kendo.aspnetmvc.min.js,会发生什么?我觉得剑道会被定义,不会发生本地回退......

【问题讨论】:

    标签: .net asp.net-mvc kendo-ui bundle cdn


    【解决方案1】:

    使用本地脚本后备从 CDN 引用 Kendo UI

    这是Telerik suggests 你应该做的。

    只需测试单个脚本,如果失败,则在本地加载所有内容。所以不要测试 kendo.all.min.js,然后再测试 kendo.aspnetmvc.min.js,如果 CDN 有问题,你可能没有得到任何问题。

    <script src="http://cdn.kendostatic.com/2014.1.318/js/kendo.all.min.js"></script>
    <script>
        if (typeof kendo == "undefined") {
            // checking for loaded CSS files is cumbersome,
            // that's why we assume that if the scripts have failed, so have the stylesheets
    
            // fallback to local Kendo UI stylesheets
            document.write(decodeURIComponent('%3Clink rel="stylesheet" href="/path/to/local/kendo.common.min.css" %3C/%3E'));
            document.write(decodeURIComponent('%3Clink rel="stylesheet" href="/path/to/local/kendo.blueopal.min.css" %3C/%3E'));
    
            // fallback to local Kendo UI scripts
            document.write(decodeURIComponent('%3Cscript src="/path/to/local/kendo.all.min.js" %3E%3C/script%3E'));
            // also add kendo.aspnetmvc.min.js or kendo.timezones.min.js, if needed
        }
    </script>
    

    ASP.NET Web 优化框架

    就像你现在所做的一样,对下面的 C# 感到抱歉。只需将您的 Kendo UI 脚本放在单独的包中并指定 typeof kendo == undefined 后备表达式。

    以同样的方式测试 CSS,如果 CDN 不提供脚本,那么您的 CSS 也不存在。

    从 NuGet 获取 Microsoft.AspNet.Web.Optimization 包。 现在,在您的 BundleConfig 中,您可以设置您的捆绑包,不仅包括 CdnPath,还包括 CdnFallbackExpression:

    public static void RegisterBundles(BundleCollection bundles)
    {        
        bundles.UseCdn = true;
        var kendo = new ScriptBundle("~/bundles/scripts/kendo", "http://cdn.kendostatic.com/2015.1.318/js/kendo.all.min.js").Include("~/Scripts/kendo/kendo.all.min.js");
        kendo.CdnFallbackExpression = "typeof kendo == undefined";
        bundles.Add(kendo);
    
        var kendoMvc = new ScriptBundle("~/bundles/scripts/kendoMvc", "http://cdn.kendostatic.com/2015.1.318/js/kendo.aspnetmvc.min.js").Include("~/Scripts/kendo/kendo.aspnetmvc.min.js");
        kendoMvc.CdnFallbackExpression = "typeof kendo == undefined";
        bundles.Add(kendoMvc);      
    
        BundleTable.EnableOptimizations = true;
    }
    

    【讨论】:

    • 但是您不能将 CDN 中的多个文件放在一个包中。 :/ (另外,如果我听从 Telerik 的建议,我就不能使用 CdnFallBackExpression。)
    • 为我之前半途而废的回答道歉。我现在已经在我自己的项目中进行了一些适当的测试,并得到了一个可行的解决方案(记得用你自己的路径更新它)。我不确定为什么回退对你不起作用?
    • 它“有效”,但查看我的输出(在问题中)并认为 cdn 已关闭。它将首先尝试从 cdn 加载 kendo.web 并失败。然后它将在本地加载。之后它将尝试从 cdn 加载 kendo.aspnetmvc 并失败。然后它不会在本地加载,因为后备表达式是相同的,也就是现在定义了“剑道”。
    • 只有在 CDN 宕机时才需要回退。如果你可以加载 kendo,all,那么 kendo.mvc 也会出现。 Telerik 在他们的帖子中也提到了这一点。无需检查每个文件。
    【解决方案2】:

    将后备表达式设置为“kendo”将导致使用本地资源。

    我修改了@Nicholas 代码以反映这一点:

    public static void RegisterBundles(BundleCollection bundles)
    {        
        bundles.UseCdn = true;
        var kendo = new ScriptBundle("~/bundles/scripts/kendo", "http://cdn.kendostatic.com/2015.1.318/js/kendo.all.min.js").Include("~/Scripts/kendo/kendo.all.min.js");
        kendo.CdnFallbackExpression = "kendo";
        bundles.Add(kendo);
    
        var kendoMvc = new ScriptBundle("~/bundles/scripts/kendoMvc", "http://cdn.kendostatic.com/2015.1.318/js/kendo.aspnetmvc.min.js").Include("~/Scripts/kendo/kendo.aspnetmvc.min.js");
        kendoMvc.CdnFallbackExpression = "kendo";
        bundles.Add(kendoMvc);      
    
        BundleTable.EnableOptimizations = true;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 1970-01-01
      • 2015-06-06
      • 2011-07-03
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 2023-03-23
      相关资源
      最近更新 更多