在MVC4的Web.Optimization捆绑/最小化中,是否可以在一个站点(我们的静态无cookie域)上注册一个bundle,然后在另一个站点(我们的webapp域)上使用该bundle?
例如,static.myapp.com有一个带
的BundleConfig.cspublic static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/Scripts/static")
.Include("~/Scripts/*.js"));
}
该捆绑包是否可以在webapp域的视图中使用,例如www.myapp.com在Site.Master中具有此功能
<%= Scripts.Render("static.myapp.com/Scripts/static") %>
这可以通过MVC4捆绑完成吗?从无cookie静态域提供静态文件是众所周知的性能改进。
答案 0 :(得分:2)
在ASP.net中捆绑MVC允许您通过在运行时而不是在设计时替换占位符Scripts.Render()
来优化脚本和样式表的部署。解析页面并将其推送到客户端时,注册到调用服务器的bundle将被解析为输出缓冲区。因此,为内容提供服务的应用必须运行捆绑服务。如果未运行捆绑的Web应用程序遇到Scripts.Render()
元素,则会输出null
或抛出异常。
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"));
在上面的代码中,将在发布模式下从CDN请求jQuery,并且将在调试模式下本地获取jQuery的调试版本。使用CDN时,如果CDN请求失败,您应该有一个回退机制。
修改
您可以使用ASP.Net MVC作为来自static.myapp.com的CDN,如
routes.MapRoute(
"CDN",
"cdn",
new { controller = "Webpage", action = "Fetch" }
);
[OutputCache(Duration=300, Location=OutputCacheLocation.Any)]
public ActionResult Fetch()
{
return new FileStreamResult(
GetScriptBundle(Request.QueryString["url"]),
"text/javascript");
}
答案 1 :(得分:0)
所以我刚刚遇到这个要求,我在页面中整齐地解决了它,与此类似;
<%
string jsStore = Context.IsDebuggingEnabled ? "~" : "static.mydomain.com";
string scriptTagFormat = Scripts.DefaultTagFormat.Replace("{0}", Url.Content(jsStore).TrimEnd('/') + "{0}");
%>
和
<%=Scripts.RenderFormat(scriptTagFormat, "~/bundles/allMyJS")%>
当然您也可以在DefaultTagFormat
中使用RegisterBundles()
,但这提供了更大的灵活性,因为;
jsStore
。jsStore
以匹配不同的{SERVER_NAME}
主机。你也可以像这样使用静态标签;
<script src='@Url.Content(jsStore + "/scripts/etc/lt-ie10.min.js")'></script>
CSS可以使用相同的方法。
答案 2 :(得分:0)
是的,请在此处查看我的回答:How to make bundles unminify and list individual files when using a cookieless static content server?
您不仅可以引用不同的域,而且如果您使用我提供的自定义VirtualPathProvider,您还可以在DEBUG模式下单独列出文件。
除了在浏览器中更容易调试之外,每次在开发时(仅在添加或删除文件时)进行JS或CSS更改时,您也不必重建以更新软件包。