中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

面向.Net程序員的前端優化

發布時間:2020-04-15 16:54:41 來源:網絡 閱讀:925 作者:熬夜的蟲子 欄目:編程語言

背景

  作為web開發人員大家大多了解一些網站的性能優化方法,其實大部分方法都不復雜,例如針對前端js和css的壓縮來減少請求大小,通過合并來減少請求次數。這里站在.Net后端程序員的角度來看一下如何最簡單快捷的處理這一類需求。

  全文分3節 combres,mvc4的Bundle,以及2者的對比和個人的意見觀點。


Combres

  Combres是一個.NET程序庫,能夠縮小,壓縮,合并,以及緩存的JavaScript和CSS資源,ASP.NET和ASP.NET MVC的Web應用程序。簡單地說,它可以幫助您的應用程序更好的頁面加載速度。

  源代碼存在 https://github.com/buunguyen/combres

  通過nuget添加combres非常簡單

  面向.Net程序員的前端優化

  加載完成后 .Net3.5的同學需要按照combres.readme的指導,首先刪除掉AppStart_Combres.cs然后在global.asax中添加Combres引用,然后在RegisterRoutes() 或者 Application_Start()添加方法RouteTable.Routes.AddCombresRoute("Combres")

  .Net4.0的同學可以忽略這一步,你們會在發現nuget包安裝程序(下面簡稱包管理)已經自動幫你們生成了這樣一段代碼

    public static class Combres {        public static void PreStart() {
            RouteTable.Routes.AddCombresRoute("Combres");
        }
    }

  下面最主要的就是就是配置combres.xml,至于webconfig的配置包管理已經幫大家設置完成。

  為了方便測試,我們建個白板頁面,然后添加最簡單的js文件和css文件。

  面向.Net程序員的前端優化

  那么下面來看測試效果,我們先建一個簡單的測試頁面。

    

@{

    ViewBag.Title = "Home Page";

}

<script src="~/Scripts/Demo/JScript1.js" type="text/javascript"></script> 

<script src="~/Scripts/Demo/JScript2.js" type="text/javascript"></script> 

<script src="~/Scripts/Demo/JScript3.js" type="text/javascript"></script> 

<link href="~/Content/Demo/StyleSheet1.css" rel="stylesheet" type="text/css" />

<link href="~/Content/Demo/StyleSheet2.css" rel="stylesheet" type="text/css"  />

<link href="~/Content/Demo/StyleSheet3.css" rel="stylesheet" type="text/css"  /> 


  打開fiddler查看頁面請求。

  面向.Net程序員的前端優化

  然后我們使用combres修改頁面代碼

  mvc: 

1 @using Combres.Mvc
2 @{
3     ViewBag.Title = "Home Page";
4 }
5 @Url.CombresLink("siteCss")6 @Url.CombresLink("siteJs")

  webform:

1 <%= WebExtensions.CombresLink("siteJs") %>  
2 <%= WebExtensions.CombresLink("siteCss") %>

  再來查看頁面請求

  面向.Net程序員的前端優化

  請求次數變為了2次,大小也被壓縮的非常低。

  Combres的實現原理不復雜,服務器端先加載配置緩存起來,根據配置節點生成hash值,具體實現如下 

 1         public string Generate(ResourceSet rs) 
 2         { 
 3             if (Log.IsDebugEnabled) 
 4                 Log.Debug("Computing hash for set " + rs.Name + ".  Current hash: " + rs.Hash); 
 5  
 6             var contributingFactors = new List<object> {rs.DebugEnabled}; 
 7             rs.Filters.ToList().ForEach(contributingFactors.Add); 
 8             rs.CacheVaryProviders.ToList().ForEach(contributingFactors.Add); 
 9             rs.Resources.ToList().ForEach(r =>
 10                                   {
 11                                       contributingFactors.Add(r.ReadFromCache(true)); 12                                       contributingFactors.Add(r.ForwardCookie);
 13                                       contributingFactors.Add(r.Mode);
 14                                       contributingFactors.Add(r.Minifier);
 15                                   });
 16             var hash = contributingFactors.Select(f => f.GetHashCode())17                                           .Aggregate(
 17, (accum, element) => 31 * accum + element)
 18                                           .ToString();
 19 
 20             if (Log.IsDebugEnabled)
 21                 Log.Debug("New hash: " + hash);
 22             return hash;
 23         }

  得出來的值就是我們上面看到的combres.xsd/setname/hashvalue中的hashvalue,當我們請求產生的時候會由一個CombresHandler根據hashvalue來獲取對應的資源并且進行合并壓縮。

  處理流程首先判斷你的瀏覽器是否支持壓縮,通過Context.Request.Headers["Accept-Encoding"]。

  如果判斷為接受combres會對資源進行2層壓縮,我們這里簡單稱只為minifier和gzip。

  如果瀏覽器不支持壓縮那么gzip這一層會被忽略,minifier的壓縮方法使用YuiJSMinifier和YuiCssMinifier,方法依賴雅虎的開源組件Yahoo.Yui.Compressor

  面向.Net程序員的前端優化

  handler會為新的請求生成一個cachekey:&ldquo;Combres/Combres.RequestProcessor/siteJs/1342767128/gzip&rdquo;

  和etag key&ldquo;Combres/Combres.RequestProcessor/siteJs/1342767128/gzip/@etag&rdquo;(實際上真正存于Context.Response.Cache的ETag是"1342767128")

  分別對應服務器端緩存和瀏覽器緩存,當下次請求已經發現有key存在,便從緩存中直接獲取資源或者直接304。

  根據結果圖來看,combres確實是一款很不錯的工具。


 MVC4的Bundle

  MVC4以后自帶了Bundling和Minification。操作也很簡單,新建一個mvc4項目。在App_Start文件夾下找到BundleConfig.cs。

  添加如下代碼:

 1         public static void RegisterBundles(BundleCollection bundles) 
 2         { 
 3  
 4             bundles.Add(new ScriptBundle("~/bundles/jquerydemo").Include( 
 5                 "~/Scripts/Demo/JScript1.js", 
 6                 "~/Scripts/Demo/JScript2.js", 
 7                 "~/Scripts/Demo/JScript3.js")); 
 8  
 9             bundles.Add(new StyleBundle("~/Content/cssdemo").Include(
 10                 "~/Content/Demo/StyleSheet1.css",
 11                 "~/Content/Demo/StyleSheet2.css",
 12                 "~/Content/Demo/StyleSheet3.css"));
 13         }

  頁面端添加:

1 @Styles.Render("~/Content/cssdemo")2 @Scripts.Render("~/bundles/jquerydemo")

  然后記住在BundleConfig.cs添加BundleTable.EnableOptimizations = true;不然MVC4不會啟用壓縮,減少請求數量和帶寬。

  我們來看一下效果圖:

  面向.Net程序員的前端優化

  請求次數減少,也有壓縮。但是比起combres效率要差了一些。但是這樣未必就是說combres要更好。


 對比

  2者相比較而已combres的效率要高一些,但是mvc4作為原生自帶的功能,對于版本管理比較苛刻的系統還是具有優勢,并且對于大型項目還要涉及到cdn問題。

  目前combres是不支持cdn的,雖然作者給出了相關的話題,但是作者本人最后還有給出了不是令人滿意的答復。

  面向.Net程序員的前端優化

  相對MVC4的Bundle是支持cdn的,只需要在對應節點添加 bundles.UseCdn = true即可。

  所以根據各自項目不同的場景,酌情處理吧。

  個人推薦靜態資源的壓縮和合并盡量在前端就做掉,例如grunt。這樣不管是cdn還是部署發布都更合理沒有必要再浪費后端的處理資源。


本篇先到此,希望對大家有幫助!

 

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

商城县| 鄱阳县| 太康县| 沾化县| 罗山县| 黄大仙区| 汉阴县| 波密县| 泰安市| 闵行区| 和静县| 贵德县| 洛川县| 泗洪县| 宁津县| 娄底市| 麻城市| 万山特区| 共和县| 托克逊县| 宁城县| 满洲里市| 丰镇市| 社会| 丹凤县| 正阳县| 湖南省| 太仓市| 虎林市| 且末县| 怀化市| 普陀区| 民勤县| 衡南县| 新河县| 城市| 潜山县| 宾川县| 赣州市| 文化| 古丈县|