MVC4捆绑来自不同域的javascript或css文件?

时间:2013-08-18 11:26:47

标签: c# asp.net-mvc-4 bundling-and-minification cookieless system.web.optimization

在MVC4的Web.Optimization捆绑/最小化中,是否可以在一个站点(我们的静态无cookie域)上注册一个bundle,然后在另一个站点(我们的webapp域)上使用该bundle?

例如,static.myapp.com有一个带

的BundleConfig.cs
public 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静态域提供静态文件是众所周知的性能改进。

3 个答案:

答案 0 :(得分:2)

在ASP.net中捆绑MVC允许您通过在运行时而不是在设计时替换占位符Scripts.Render()来优化脚本和样式表的部署。解析页面并将其推送到客户端时,注册到调用服务器的bundle将被解析为输出缓冲区。因此,为内容提供服务的应用必须运行捆绑服务。如果未运行捆绑的Web应用程序遇到Scripts.Render()元素,则会输出null或抛出异常。

但是,您可以在RegisterBundles方法中使用CDN引用,例如:

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(),但这提供了更大的灵活性,因为;

  1. 您可以从其他环境的备用web.configs中阅读jsStore
  2. 如果您有开发,测试网站等,您可以在运行时修改jsStore以匹配不同的{SERVER_NAME}主机。
  3. 你也可以像这样使用静态标签;

    <script src='@Url.Content(jsStore + "/scripts/etc/lt-ie10.min.js")'></script>
    
  4. CSS可以使用相同的方法。

答案 2 :(得分:0)

是的,请在此处查看我的回答:How to make bundles unminify and list individual files when using a cookieless static content server?

您不仅可以引用不同的域,而且如果您使用我提供的自定义VirtualPathProvider,您还可以在DEBUG模式下单独列出文件。

除了在浏览器中更容易调试之外,每次在开发时(仅在添加或删除文件时)进行JS或CSS更改时,您也不必重建以更新软件包。