【網站性能指南】(四)前端性能-壓爆你的文件


【概述】

  在這一章,我們會聚焦在前端性能:

  • 外部的Css 和 Javascript
  • Css 和 Javascript 的 迷你化 與 合並
  • 圖片的最佳化
  • Css 圖片拼合器

 

【外部的CSS和Javascript】

  幾乎所有的CSS和Javascript 都應該放在外部文件

  • 減少頁面的尺寸
  • 允許重用
  • 允許使其過期 
  • 可讀性更高 

 把css 和 js 文件放到外部文件的確可以讓頁面看的更加清爽,同時減小了頁面本身的尺寸。

 在外部的文件可重用性更高,例如你可以在一個css文件中定義整體布局。並且讓每個頁面的元素都遵從它。

 在上一節中,我們提到了瀏覽器過期的重要性,所以在外部引用css和js文件也是非常重要的。

 最后是可讀性,有超過50%的人遇到過混亂的頁面。里邊夾雜着html、js、css 甚至還有c#code。這樣的代碼的可讀性和維護性都差到極點了。

【Css和Javascript的迷你化與合並】

  Css 和 javascript 的迷你化與合並是一種減少 httprequest 和傳輸數據量 的行之有效的方式。

  •   迷你化 
    • 移除白空格、注釋和多余的分號等
    • 同樣可以看到這樣的文件名中包含".min" (如果你經常使用jquery的插件,你會看到很多min文件)
    • 我們看一下jquery官網,開發版本大小是247KB,min版只有32KB。整整壓縮了88%。

  • 迷你化的工具合並
      • JSMin
      • Packer
      • YUI Compressor
      • CSS Min
      • Microsoft Ajax Minifier (特別推薦
    http://ajaxmin.codeplex.com/
       )
      • javascript 和 css
      • 命令行、dll和build 任務 
    • 合並文件以減少httprequest次數
    • msbuild
  • 策略實踐
    • 使用外部文件
    • 迷你化css和js文件
    • 把所有js文件合並成一個文件(jquery、jquery插件等)
    • 合並所有css文件成一個文件
    • 添加一個唯一的版本號到合並的文件中,日后我們可以控制瀏覽器緩存
    • 避免當我們在運行時迷你化和合並文件時發生的沖突
    • 引用新的合並過的文件 

         1.找到Visual studio Project File(.csporj)

         2.修改一個.cs文件,確保項目文件可以重新編譯(如果我們只是修改js和css文件,項目不會重新編譯)

         3.使用msbuild Extension Pack(http://msbuildextensionpackcodeplex.com)

         4.通過bin目錄下webform程序集得到版本號。

         5.使用Msbuild ajaxmodifier 去迷你化js和css文件。

         6.使用Msbuild 去合並迷你化之后的文件。

         7.注意文件以前的引用順序。保持以前的順序。

         8.使用debug symbol vaule去確定是否在release 模式,為新的release build 引用新的合並過的文件。

  •    結果

         主頁快了46%

  •    代碼:

           為了貼切描述這一過程,一下是proj文件的關鍵code。為了便於大家理解,我在本章的結尾放了一個完整的代碼示例。我們需要安裝msbuild 和 它的擴展 ajaxmodifier 

          

<!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.-->
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\MicrosoftAjax\ajaxmin.tasks" />
  <Import Project="$(MSBuildExtensionsPath)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks" />
  <Target Name="BeforeBuild">
    <ItemGroup>
      <GeneratedCSSJS Include="client/combined.*.css" />
      <GeneratedCSSJS Include="client/combined.*.js" />
    </ItemGroup>
    <Delete Files="@(GeneratedCSSJS)" />
  </Target>
  <Target Name="AfterBuild">
    <!--"Touch" a .cs file to force a rebuild so get a new version number even when only change .css or js files-->
    <Exec Command="ATTRIB -R code/forceRebuild.cs" />
    <Touch Files="code/forceRebuild.cs" />
    <Exec Command="ATTRIB +R code/forceRebuild.cs" />
    <MSBuild.ExtensionPack.Framework.Assembly TaskAction="GetInfo" NetAssembly="$(OutputPath)\MsBuildUsage.dll">
      <Output TaskParameter="OutputItems" ItemName="Info" />
    </MSBuild.ExtensionPack.Framework.Assembly>
    <Message Text="Version:%(Info.AssemblyVersion)" Importance="high" />
    <!--css file that need minimizing-->
    <ItemGroup>
      <CSSMin Include="content\Site.css" />
    </ItemGroup>
    <!--css file to combine-->
    <ItemGroup>
      <CSSCat Include="content\site.min.css" />
    </ItemGroup>
    <!--js file that need minimizing-->
    <ItemGroup>
      <JSMin Include="Scripts\jquery-1.5.1.js"/>
      <JSMin Include="Scripts\MicrosoftMvcAjax.js"/>
    </ItemGroup>
    <!--js file to combine-->
    <ItemGroup>
      <JSCat Include="Scripts\jquery-1.5.1.min.js"/>
      <JSCat Include="Scripts\MicrosoftMvcAjax.min.js"/>
     
    </ItemGroup>
    <!--Actual minimization and combine tasks-->
    <Message Text="minimization and combine js and css files..." Importance="high" />
    <AjaxMin JsSourceFiles="@(JSMin)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".min.js" CssSourceFiles="@(CssMin)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".min.css" />
    <Message Text="Concatinating js and css files..." Importance="high" />

    <ReadLinesFromFile File="%(JSCat.Identity)">
    
      <Output TaskParameter="Lines" ItemName="JSLines" />
    </ReadLinesFromFile>
    <WriteLinesToFile File="client/combined.%(Info.AssemblyVersion).min.js" Lines="@(JSLines)" OverWrite="true" />
    <ReadLinesFromFile File="%(CSSCat.Identity)">
      <Output TaskParameter="Lines" ItemName="CSSLines" />
    </ReadLinesFromFile>

    <WriteLinesToFile File="client/combined.%(Info.AssemblyVersion).min.css" Lines="@(CSSLines)" OverWrite="true" />
        
    <!--Include the combined files temporarily in project so publish moves them-->
    <ItemGroup>
      <Content Include="client/combined.%(Info.AssemblyVersion).min.js" />
      <Content Include="client/combined.%(Info.AssemblyVersion).min.css" />
    </ItemGroup>
  </Target>

 

    看看結果,我的proj里多了2個文件。我們在引用這兩個文件時候只需要拼接出版本號即可。

       

 

【圖片最佳化】

  我們平時接觸到的圖片大概分以下幾種:

  •    JPEG JPEG 圖片以 24 位顏色存儲單個光柵圖像。JPEG 是與平台無關的格式,支持最高級別的壓縮,不過,這種壓縮是有損耗的。
  •    PNG  流式網絡圖形格式(Portable Network Graphic Format,PNG)名稱來源於非官方的“PNG’s Not GIF”,其目的是企圖替代GIF和TIFF文件格式
  •    GIF  GIF 是用於壓縮具有單調顏色和清晰細節的圖像(如線狀圖、徽標或帶文字的插圖)的標准格式。

   如果我們不能確定用哪種格式的圖片,我們需要提供3種不同格式的相同圖片,並且比較它們的質量和圖片占用空間。

   在這里我主要講一下JEPG的壓縮。我的想法是縮小50%的占用空間,看看它的質量如何?

  【圖片優化器】

  •   Jpegtran 用特定的圖像格式從圖像文件中刪除不必要的元數據,無損
  •   PNGcrush PNG優化器
  •   Smushit http://www.smushit.com/ysmush.it/ (同Jpegtran,支持多種格式,雅虎提供)
  •   Paint.Net 按比例壓縮

下圖是我使用了 PaintNet 和Smushit優化過的圖片。原圖是右邊的,大小32K。PaintNet壓縮50%后為左上圖。下圖是使用Smushit去掉無用的元數據。大小30K。

 

【CSS 圖片拼合器】

 

  Css拼合器是一種合並圖片的工具。說它是一種,就是有很多工具可以實現這個功能。

  •   它的主要功能是可以把很多小圖片合並成一張圖片,這樣有效減少了httprequest的次數。
  •   使用小圖片時,只需要根據位置在那張圖片上定位。

  我們可以訪問:http://spritegen.website-performance.org/ 去使用它。

  【try it】

  1.    訪問 css 拼合器站點。
  2.    把需要拼接的圖片打包成zip格式。
  3.    上傳
  4.    勾選一些自定義的選項
  5.    生成

    我去人人網主頁選擇了3張圖片,使用壓縮工具把它們打包,並且上傳。

     

    點擊了最下邊生成拼合圖片之后。可以看到上方多了3行css 規則:

    

.sprite-rrdesk{ background-position: 0 0; width: 75px; height: 75px; } 
.sprite-rrgame{ background-position: 0 -125px; width: 75px; height: 75px; } 
.sprite-rrmusic{ background-position: 0 -250px; width: 75px; height: 75px; } 

 

    讓我們看看合並之后的圖片:

 

 

   

     在項目中使用的時候我們先引用css,在html里只需要這樣就可以啦:

 

<span class = "sprite-rrgame"> <span>

 

        

   msbuild demo的源代碼:

   http://files.cnblogs.com/techborther/MsBuildUsage.7z

  【msbuild 參考】  :http://msdn.microsoft.com/zh-cn/library/0k6kkbsd.aspx

        感謝閱讀,下一章更精彩:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM