4

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

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

4

3 回答 3

2

Scripts.Render()ASP.net MVC 中的捆绑允许您通过在运行时而不是在设计时替换占位符来优化脚本和样式表的部署。当页面被解析并推送到客户端时,注册到调用服务器的包被解析到输出缓冲区。因此,提供内容的应用程序必须运行捆绑器服务。如果未运行捆绑的 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");
}
于 2013-08-18T22:34:59.460 回答
0

所以我刚刚遇到了这个要求,我在页面中巧妙地解决了它,有效地类似于这个;

<%
string jsStore = Context.IsDebuggingEnabled ? "~" : "static.mydomain.com";
string scriptTagFormat = Scripts.DefaultTagFormat.Replace("{0}", Url.Content(jsStore).TrimEnd('/') + "{0}");
%>

<%=Scripts.RenderFormat(scriptTagFormat, "~/bundles/allMyJS")%>

当然你也可以使用DefaultTagFormatinRegisterBundles()但这提供了更大的灵活性,因为:

  1. 您可以jsStore从不同环境的备用 web.configs 中读取。
  2. 如果您有开发、测试站点等,您可以在运行时进行修改jsStore以匹配不同的{SERVER_NAME}主机。
  3. 您也可以将它与这样的静态标签一起使用;

    <script src='@Url.Content(jsStore + "/scripts/etc/lt-ie10.min.js")'></script>
    

相同的方法可用于 CSS。

于 2014-10-02T14:53:05.023 回答
0

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

您不仅可以引用不同的域,而且如果您使用像我提供的那样的自定义 VirtualPathProvider,您还可以在调试模式下保持单独列出文件的能力。

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

于 2015-10-14T20:09:03.410 回答