ASP.net MVC 5 Bundling and Minification
前言
ASP.net MVC 5 的 Bundling and Minification
網路上一堆教學文章:MSDN文件 Bundling and Minification
我想應該不用多做說明
本文要講的是bundle CSS檔案後,如何解決CSS檔裡的Url相對路徑錯誤問題並且最小化bundle後的CSS檔
正文開始
假設我有以下的CSS代碼,注意background-image使用相對路徑
div.a{
    height:500px;
    background-size:cover;
    background-position:center center;
    background-image:url(../img/1.jpg);
}
但是我的bundle寫法卻是↓ ,這樣我在_Layout.cshtml使用 @Styles.Render("~/bundle/css") 的話,因為CSS檔案仍然為相對路徑,肯定抓不到background-image
 public static void RegisterBundles(BundleCollection bundles)
        {
            var styleBundle = new StyleBundle("~/bundle/css")
                         .Include("~/Content/css/MyStyle1.css")
                         .Include("~/Content/css/MyStyle2.css"); 
            bundles.Add(styleBundle);
 
        }
一個網站開發完成有可能佈上IIS的站台或是站台底下的子應用程式
為了解決URL錯誤問題,可以使用 BundleTransformer.Core.Transformers 的 StyleTransformer類別,它會把CSS裡的相對路徑轉成正確的Server Root或WebSite Root
雖然這樣解決了CSS代碼裡的URL路徑錯誤問題,但又會衍伸另一個問題↓

查了一下官網,竟然叫人去安裝別的工具來壓縮XD

要額外安裝工具來壓縮實在太不方便,後來在我鍥而不捨追查下,其實只要再寫上一行程式碼加入CssMinify物件就解決了
以下是App_Start目錄裡BundleConfig.cs的完整代碼
using System.Web.Optimization;
//要先透過Nuget加入此套件
using BundleTransformer.Core.Transformers;
namespace WebApplication_ImageLazy.App_Start
{
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            var styleBundle = new StyleBundle("~/bundle/css")
                         .Include("~/Content/css/MyStyle1.css")
                         .Include("~/Content/css/MyStyle2.css");
            styleBundle.Transforms.Add(new StyleTransformer());//修正CSS檔裡的URL錯誤問題
            /***再呼叫這行執行檔案最小化***/
            styleBundle.Transforms.Add(new CssMinify());
            
            bundles.Add(styleBundle); 
        }
    }
}
其他程式碼照舊
Web.config
<system.web>
 <!--debug="false",程式才會bundle-->
    <compilation debug="false" targetFramework="4.8" /> 
 </system.web>
Global.asax.cs
using System.Web.Optimization;
using System.Web.Routing;
using WebApplication_ImageLazy.App_Start;
namespace WebApplication_ImageLazy
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        { 
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}
_Layout.cshtml ↓
@using System.Web.Optimization
  
<!DOCTYPE html> 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <!--↓叫用bundle後的CSS-->
    @Styles.Render("~/bundle/css")
</head>
<body>
    <div class="a"></div>
    <div class="b"></div>
</body>
</html>
程式執行結果


最後提醒
使用 ASP.net MVC 的 Bundle & Minify 功能,記得程式上線到PRD時,也要跟著修改Web.config檔