在ASP.NET MVC包中使用CDN

时间:2014-04-24 15:58:45

标签: c# jquery .net asp.net-mvc asp.net-mvc-4

我阅读了关于bundling and monification的文章,特别是关于使用CDN的文章,但有些事情我不清楚。

举例:

public static void RegisterBundles(BundleCollection bundles)
{
    //bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    //            "~/Scripts/jquery-{version}.js"));

    bundles.UseCdn = true;   //enable CDN support

    //add link to jquery on the CDN
    var jqueryCdnPath = 
        "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js";

    bundles.Add(new ScriptBundle("~/bundles/jquery",
                jqueryCdnPath).Include(
                "~/Scripts/jquery-{version}.js"));

    // Code removed for clarity.
}
  1. 是否有可能使用{version}格式的CDN引用,例如" local"的?

  2. 在捆绑包中包含已经缩小版本的脚本有什么意义,例如 jquery-1.7.1.min.js ?如果它不存在怎么办?它是否应该搜索.min文件是否存在和/或分别生成它?

3 个答案:

答案 0 :(得分:6)

using System.Web;
using System.Web.Optimization;

namespace MvcApp
{
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery", "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js").Include("~/Scripts/jquery-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/bootstrap","https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js").Include("~/Scripts/bootstrap.js"));

            bundles.Add(new StyleBundle("~/Content/css", "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css").Include("~/Content/bootstrap.css"));

            BundleTable.EnableOptimizations = true;
            bundles.UseCdn = true;
        }
    }
}

很多开发人员都没有意识到,ScriptBundle和StyleBundle的类构造函数有一个重载,它带有两个字符串参数,例如ScriptBundle,它将是ScriptBundle(字符串,字符串)和StyleBundle它将是StyleBundle(字符串,字符串)。第一个参数是虚拟路径,第二个参数是cdnPath。

我们可能会问自己,如果它需要两个参数,MVC如何知道使用哪一个?好吧,仅当BundleTable.EnableOptimizations属性设置为true时才使用cdn位置。

将EnableOptimization属性设置为true会告诉MVC使用文件的缩小版本而不是常规版本。

当此属性设置为true且cdn路径存在时,MVC将使用cdn路径而不是本地虚拟路径。
还有一个属性你需要设置为true,那就是bundles.UseCdn。
这告诉MVC使用cdn位置而不是本地版本。如果BundleTable.EnableOptimization设置为false,则本地版本将自动用作回退,因为cdn版本是缩小版本

阅读此博客,明确了您的想法:

http://www.techjunkieblog.com/2015/06/aspnet-mvc-5-configure-bundleconfig.html

答案 1 :(得分:0)

  1. 你不能我所知。但是你可以保存一张cdns表并在加载bundle时填充。当您希望使用新版本时,请在数据库中添加/替换条目。

        //get from db
        List<string> cdns = new List<string>();
        foreach (string cdn in cdns)
        {
            bundles.Add(new ScriptBundle("~/bundles/jquery",cdn).Include("~/Scripts/jquery-{version}.js"));
        }
    
  2. 我同意最小的部分。对于问题不存在的部分,请向下滚动并阅读“使用CDN”。有一个例子来说明如何检查。你基本上需要有一个本地副本作为备份,你可以引用另一个我认为的cdn。

答案 2 :(得分:0)

  

是否有可能使用{version}格式的CDN引用,   喜欢“本地”的?

{version}占位符主要用于节省键入显式数字的时间,以便构建可以在本地磁盘上查找文件。由于无法在远程服务器上执行相同的搜索,因此您需要明确指定确切的URL。

  

包括已经缩小的捆绑包有什么意义   脚本的版本,如jquery-1.7.1.min.js?如果不是这样的话   存在?

使用此捆绑语法的主要好处是在最终HTML中有条件地在脚本和样式标记的不同URL之间切换。

当请求的文件不存在时,捆绑过程将跳过它。

  

是否应该搜索.min文件是否存在和/或生成它   分别?   是的,它可以在捆绑之前应用缩小,如您所见:   enter image description here