簡體   English   中英

MVC4捆綁來自其他域的javascript或CSS文件?

[英]MVC4 bundling javascript or css files from a different domain?

在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"));
}

可以在Web應用程序域的視圖中使用該捆綁包嗎,例如www.myapp.com在Site.Master中具有此捆綁包

<%= Scripts.Render("static.myapp.com/Scripts/static") %>

MVC4捆綁可以做到嗎? 從無cookie的靜態域提供靜態文件是一項眾所周知的性能改進。

通過ASP.net MVC中的捆綁包,您可以通過在運行時而非設計時替換占位符Scripts.Render()來優化腳本和樣式表的部署。 當頁面被解析並推送到客戶端時,注冊到調用服務器的包將被解析到輸出緩沖區中。 因此,提供內容的應用程序必須正在運行捆綁程序服務。 如果未運行捆綁的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");
}

因此,我碰到了這一要求,並且在頁面中巧妙地解決了這一問題,與之類似;

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

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

當然,您也可以在RegisterBundles()使用DefaultTagFormat ,但這提供了更大的靈活性,因為;

  1. 您可以從用於不同環境的備用web.configs中讀取jsStore
  2. 如果您有開發人員,測試網站等,則可以在運行時修改jsStore以匹配不同的{SERVER_NAME}主機。
  3. 您也可以將其與諸如此類的靜態標簽一起使用;

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

CSS可以使用相同的方法。

是的,請在這里查看我的答案: 使用無cookie靜態內容服務器時,如何使捆綁包最小化並列出單個文件?

您不僅可以引用其他域,而且還可以像我提供的那樣使用自定義的VirtualPathProvider,還可以保持在調試模式下單獨列出文件的功能。

除了更容易在瀏覽器中調試之外,開發時每次更改JS或CSS時(僅在添加或刪除文件時),您都無需重新構建即可更新包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM