在 ASP.NET MVC 包中使用 CDN
Posted
技术标签:
【中文标题】在 ASP.NET MVC 包中使用 CDN【英文标题】:Using CDN in ASP.NET MVC bundles 【发布时间】:2014-06-10 00:56:27 【问题描述】:我读了关于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.
是否可以使用version
格式的 CDN 引用,例如“本地”引用?
在捆绑包中包含已经缩小的脚本版本有什么意义,例如 jquery-1.7.1.min.js?如果它不存在怎么办?如果.min
文件存在和/或分别生成它,它不应该搜索吗?
【问题讨论】:
【参考方案1】: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(string, string) 和对于 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
【讨论】:
但是如果您在 CDN 上有很多文件,这不会强制您为每个文件创建一个捆绑包(因为您无法在 .include 中指定 CDN),从而消除了捆绑?【参考方案2】:据我所知,你不能。但是您可以保留一个 cdns 表并在加载包时填充。当您希望使用的新版本出现时,在数据库中添加/替换条目。
//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"));
我同意最小部分。对于问题的不存在部分,向下滚动并阅读“使用 CDN”。有一个例子来说明如何检查。你基本上需要有一个本地副本作为备份,我想你可以引用另一个 cdn。
【讨论】:
谢谢。标记。但是对于第一个问题,我具体询问 CDN 的使用,而不是“一般”的(本地,发生)。在示例中有。我认为对于 cdn 它不会搜索最小版本,这就是我们在示例中直接使用它的原因。 我的错,误读了。无法使用版本控制,因为它是驻留在您的应用之外的文件。另一种方法是在您的数据库中有一个表,您可以连续维护最新版本,从而动态创建您的包。这样您就可以更改 CDN 而无需推送您的应用程序。【参考方案3】:是否可以使用 CDN 引用的 version 格式, 喜欢“本地”的吗?
version 占位符主要是为了节省键入显式数字的时间,以便构建可以在本地磁盘上查找文件。由于无法在远程服务器上进行相同的搜索,因此您需要明确指定准确的 URL。
在捆绑包中包含已经缩小的有什么意义 脚本的版本,例如 jquery-1.7.1.min.js?如果没有怎么办 存在吗?
使用这种捆绑语法的主要好处是有条件地在最终 HTML 中的脚本和样式标签的不同 URL 之间切换。
当请求的文件不存在时,捆绑过程将跳过它。
是否应该不搜索 .min 文件是否存在和/或生成它 分别? 是的,它在捆绑之前应用缩小,如您所见:
【讨论】:
以上是关于在 ASP.NET MVC 包中使用 CDN的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 4 ScriptBundle 返回空