ASP.NET MVC 4 BundleTable的捆綁技術

在ASP.NET MVC 4中可以使用BundleTable捆綁多個css文件和js文件,以提高網絡加載速度和頁面解析速度。更爲重要的是通過捆綁可以解決IE瀏覽器的31個CSS文件連接的限制。IE瀏覽器有這樣一個限制,就是一個頁面加載的CSS文件的數量不能超過31個。不太清楚微軟是怎麼想的,總之如果一個頁面中的CSS文件引用超過31個就有可能會出現問題。在做ASP.Net項目時很多時候會使用一些開源的javascript控件。無形中增加了css和javascript文件的引用。如果手工將這些css文件合併將給將來版本升級造成很大的麻煩。於是,我們只好小心翼翼的處理這些css文件在頁面中的引用。

現在我們終於有一個以相對比較完美的解決方案來解決css文件和jiavascirpt文件給我們帶來的麻煩,BundleTable捆綁技術很好的解決了這個問題。

什麼是ASP.NET捆綁技術?

ASP.NET捆綁是ASP.NET 4.5的新功能,是System.Web.Optimization命名空間下的類實現。它提供了一些ASP.NET運行性能方面的優化,比如,一個頁面可能有很多CSS/JS,通應用BundleTable類,可以幫我們將文件合併壓縮代碼優化成一個最理想的文件,然後輸出到客戶端,從而提高網絡下載速度和頁面的運行速度。

在MVC4.0 中,默認使用了捆綁技術,啓用捆綁技術的方法就是在Global.asax中“BundleTable.Bundles.RegisterTemplateBundles();”,這行代碼就是啓用了模板捆綁,意思是將MVC4.0項目模板中自帶的CSS和javascript文件進行捆綁。然而這句話並不是我們所需要的全部,因爲,在一個MVC項目中除了模版自帶的CSS和javascript文件之外,我們還要加入其他的更多的css和javascript文件。於是,微軟又給我們提供了另一個方法:BundleTable.Bundles.EnableDefaultBundles();這個方法可以將項目中所有的css和javascript文件合併壓縮。這時有一個問題出現了,把所有的css和javascript文件都捆綁是不是太浪費了。因爲並不是每個頁面都要用到所喲的css和javascript。所以這個方法並不是很好,除非項目很小,css和javascript文件很少的情況下可以使用。那麼,有沒有個好的方法來完成這個工作呢。這就是下面要介紹的方法。起個名字就叫“按需分配”吧。

我們可以將CSS和javascript分類壓縮捆綁。

在這個例子中將加入MVCControlToolkit的TreeView所需要使用的css和javascript文件。

在Global.asax.cs文件的Application_Start方法中加入下面代碼:

            //創建Bundle捆綁實例,指定爲CssMinify捆綁Css文件。

            Bundle bundle = new Bundle("~/Content/TreeView.css", new CssMinify());

            //使用AddDirectory方法加入要捆綁的css文件,在這個方法中可以使用通配符捆綁目錄下多個文件。也可以使用AddFile捆綁單個文件。
            bundle.AddDirectory("~/Content", "jquery.treeview.css", false, true);
            //bundle.AddFile("~/Content/jquery.treeview.css");

            //讓後將Bundle實例加入BundleTable中。就完成了一個捆綁。下面的javascript捆綁與css捆綁一樣,只是在創建Bundle實例是需要指定JsMinify。
            BundleTable.Bundles.Add(bundle);
            bundle = new Bundle("~/Scripts/TreeView.js", new JsMinify());
            bundle.AddDirectory("~/Scripts", "MVCControlToolkit.Controls-2.0.0.min.js", false, true);
            bundle.AddDirectory("~/Scripts", "MVCControlToolkit.Controls.Core-2.0.0.min.js ", false, true);
            bundle.AddDirectory("~/Scripts", "jquery.treeview.all-2.0.0.min.js", false, true);
            bundle.AddDirectory("~/Scripts", "globalize.min.js", false, true);
            BundleTable.Bundles.Add(bundle);

在Application_Start設置好捆綁之後,需要在相應的頁面中實施捆綁。

在.cshtml文件中加入下面代碼:

    <link href="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Content/TreeView.css")" rel="stylesheet" type="text/css" />
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Scripts/TreeView.js")"></script>
這樣,在頁面中就可以使用css和javascript了。

需要注意的是在Application_Start創建捆綁時new Bundle("~/Content/TreeView.css", new CssMinify())的第一個虛擬路徑參數的指定,雖然這個參數可以是任意路徑。但是最好還是用真實的物理路徑然後加一個標識名,比如new Bundle("~/Content/TreeView.css", new CssMinify()),就是物理路徑“~/Content" + 標識名”TreeView.css“,之所以要這麼做是因爲,如果css中定義了背景圖像,而背景圖像的引用一般是通過相對路徑引用的,如果創建捆綁時指定的虛擬路徑不是css文件所在的虛擬路徑,那麼,css中的引用的背景圖像將無法被找到。下圖客戶端捆綁後的文件的URL,如果Content路徑換做別的路徑,css類將無法找到其引用圖像的位置。

上圖以實際虛擬路徑作爲捆綁的虛擬路徑

上圖以任意虛構虛擬路徑作爲捆綁的虛擬路徑

javascript捆綁也是這個道理,如果javascript文件中引用了另一個javascript文件,也有可能出現類似的問題。

也許將所有與css相關的圖片,與javascript相關的所有javascript文件統統捆綁就不會出現上述問題,沒試過不太清楚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章