3

在MVC4的Web.Optimization綁定/最小化中,是否可以在一個站點上註冊一個包(我們的靜態無Cookie域),然後在另一個站點(我們的Web應用程序域)上使用該包?MVC4綁定來自不同域的JavaScript或css文件?

如static.myapp.com與

public static void RegisterBundles(BundleCollection bundles) 
{ 
    bundles.Add(new ScriptBundle("~/Scripts/static") 
       .Include("~/Scripts/*.js")); 
} 

一個BundleConfig.cs可以在捆綁在一個視圖中使用的web應用程序的域,例如www.myapp.com有這的Site.Master

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

這可以通過MVC4捆綁來完成嗎?從無cookie的靜態域提供靜態文件是一項衆所周知的性能改進。

回答

2

打包在ASP.net中MVC允許您通過在運行時而不是在設計時替換佔位符Scripts.Render()來優化腳本和樣式表的部署。當頁面被解析並推送到客戶端時,註冊到調用服務器的包被解析到輸出緩衝區中。因此,提供內容的應用必須運行捆綁服務。如果未運行捆綁的網絡應用程序遇到Scripts.Render()元素,則會輸出null或拋出異常。

你可以,但是,使用CDN引用您的RegisterBundles方法,如:

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

在上面的代碼,jQuery將來自CDN請求,而在釋放模式和jQuery的調試版本會在調試模式下本地獲取。在使用CDN時,如果CDN請求失敗,您應該有一個回退機制。

編輯

你可以使用ASP.Net MVC作爲一個CDN從static.myapp.com像

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

謝謝,是的,我可以嘗試。但捆綁將從myapp.com域渲染,我將失去從static.myapp.com(併發加載和無Cookie加載)渲染文件的好處。所以我在尋找的是一個方法,其中包在靜態網站上註冊並創建,但在myapp網站上引用。靜態網站和myapp網站都是mvc4,所以兩者都可以運行打包程序,我只是想解決如何跨網站做到這一點 –

+0

我正在更新我的答案,提供瞭如何將您的靜態網站用作CDN – Claies

0

所以,我只是碰到了這個要求,我解決了它整潔在頁面中有效地類似於此;

<% 
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。

0

是的,看到我的答案在這裏:How to make bundles unminify and list individual files when using a cookieless static content server?

您不僅可以參考不同的領域,但如果你使用像我提供了一個自定義的VirtualPathProvider,你也可以保留單獨的同時列出文件的能力在DEBUG模式下。

除了在瀏覽器中更易於調試外,每次在開發時(僅在添加或刪除文件時)更改JS或CSS更改時,也不必重新構建套件。

相關問題