網頁性能優化


網頁性能優化

頁面優化

頁面優化可以提升頁面的訪問速度從而提高用戶體驗,優化的頁面可以更好的提升 SEO 的效果同時也可以提高代碼的可讀性和維護性。

網頁的生成過程,大致可以分成五步。

  1. HTML代碼轉化成DOM
  2. CSS代碼轉化成CSSOM(CSS Object Model)
  3. 結合DOM和CSSOM,生成一棵渲染樹(包含每個節點的視覺信息)
  4. 生成布局(layout),即將所有渲染樹的所有節點進行平面合成
  5. 將布局繪制(paint)在屏幕上

這五步里面,第一步到第三步都非常快,耗時的是第四步和第五步。

"生成布局"(flow)和"繪制"(paint)這兩步,合稱為"渲染"(render)。

重排和重繪

網頁生成的時候,至少會渲染一次。用戶訪問的過程中,還會不斷重新渲染。
以下三種情況,會導致網頁重新渲染。

  1. 修改DOM
  2. 修改樣式表
  3. 用戶事件(比如鼠標懸停、頁面滾動、輸入框鍵入文字、改變窗口大小等等)

重新渲染,就需要重新生成布局和重新繪制。前者叫做"重排"(reflow),后者叫做"重繪"(repaint)。

需要注意的是,"重繪"不一定需要"重排",比如改變某個網頁元素的顏色,就只會觸發"重繪",不會觸發"重排",因為布局沒有改變。但是,"重排"必然導致"重繪",比如改變一個網頁元素的位置,就會同時觸發"重排"和"重繪",因為布局改變了。

對於性能的影響

重排和重繪會不斷觸發,這是不可避免的。但是,它們非常耗費資源,是導致網頁性能低下的根本原因。

提高網頁性能,就是要降低"重排"和"重繪"的頻率和成本,盡量少觸發重新渲染。

前面提到,DOM變動和樣式變動,都會觸發重新渲染。但是,瀏覽器已經很智能了,會盡量把所有的變動集中在一起,排成一個隊列,然后一次性執行,盡量避免多次重新渲染。

一般的規則是:

  1. 樣式表越簡單,重排和重繪就越快。
  2. 重排和重繪的DOM元素層級越高,成本就越高。
  3. table元素的重排和重繪成本,要高於div元素

提高性能的九個技巧

有一些技巧,可以降低瀏覽器重新渲染的頻率和成本。

第一條 DOM 的多個讀操作(或多個寫操作),應該放在一起。不要兩個讀操作之間,加入一個寫操作。

    // bad
    div.style.left = div.offsetLeft + 10 + "px";
    div.style.top = div.offsetTop + 10 + "px";
    
    // good
    var left = div.offsetLeft;
    var top  = div.offsetTop;
    div.style.left = left + 10 + "px";
    div.style.top = top + 10 + "px";

第二條 如果某個樣式是通過重排得到的,那么最好緩存結果。避免下一次用到的時候,瀏覽器又要重排。

    // bad
    var left = 10;
    var top = 10;
    el.style.left = left + "px";
    el.style.top  = top  + "px";
    
    // good 
    el.className += " theclassname";
    
    // good
    el.style.cssText += "; left: " + left + "px; top: " + top + "px;";

第三條 不要一條條地改變樣式,而要通過改變class,或者csstext屬性,一次性地改變樣式。

第四條 盡量使用離線DOM,而不是真實的網面DOM,來改變元素樣式。比如,操作Document Fragment對象,完成后再把這個對象加入DOM。再比如,使用 cloneNode() 方法,在克隆的節點上進行操作,然后再用克隆的節點替換原始節點。

第五條 先將元素設為display: none(需要1次重排和重繪),然后對這個節點進行100次操作,最后再恢復顯示(需要1次重排和重繪)。這樣一來,你就用兩次重新渲染,取代了可能高達100次的重新渲染。

第六條 position屬性為absolute或fixed的元素,重排的開銷會比較小,因為不用考慮它對其他元素的影響。

第七條 只在必要的時候,才將元素的display屬性為可見,因為不可見的元素不影響重排和重繪。另外,visibility : hidden的元素只對重繪有影響,不影響重排。

第八條 使用虛擬DOM的腳本庫,比如React等。

第九條 使用 window.requestAnimationFrame()、window.requestIdleCallback() 這兩個方法調節重新渲染

一些問題

一、 如何對網站的的資源和文件進行優化
  1. 文件的合並(減少http的請求)
  2. 文件的壓縮(減少文件的體積)
  3. 使用cdn托管資源
  4. 使用緩存
  5. gizp壓縮js和css文件
  6. mete標簽的優化。Heading標簽的優化和alt優化
  7. 反向鏈接,網站外鏈優化
二 、說出三種減少頁面加載的方法(加載時間感知的時間或實際加載時間)
  1. CSS Sprites
  2. Js css源碼的壓縮。圖片大小控制合適
  3. 網頁gizp
  4. cdn托管
  5. Data緩存
  6. 圖片服務器

三 、網頁加載速度的優化

  1. 減少請求
  2. 整合資源
  3. 使用瀏覽器緩存和本地緩存
  4. 首次使用的時候在HTML中嵌入資源
  5. 使用HTML5服務端發送事件
  6. 消除重定向
  7. 減少資源負載
  8. 壓縮文本和圖像
  9. 代碼簡化
  10. 使用html5和css3來簡化頁面
  11. 延遲讀取和執行的腳本
  12. 使用ajax來增強進程
  13. 根據網絡狀況進行適配處理
  14. 對於多線程來說盡量使用html5的web worker特性
  15. 將click事件替換成touch事件
  16. 支持spdy協議

四、為什么利用多個域名來提供網站資源會更有效?

  1. 突破瀏覽器的並發限制
  2. 節約cookie帶寬
  3. cdn緩存更方便
  4. 防止不必要的安全問題(尤其是cookie隔離尤為重要)
  5. 節約主機域名鏈接數,優化頁面響應速度

五、前端性能如何調優

  1. 減少http的請求數
  2. 使用內容分布式網絡(cdn)
  3. 給頭部添加一個失效期或者cache-control
  4. Gzip壓縮組件
  5. 把樣式表放在前面
  6. 把腳本放在最后
  7. 不使用css表達式
  8. 使用外部的Javascript和css
  9. 減少dns的查詢
  10. 減小javaScript和css

六、怎樣解決請求過多問題

  1. 合並js和css文件
  2. 合並圖片css sprite
  3. 使用image maps
  4. Data嵌入圖片
  5. 使用cdn減少HTTP請求頭

七、百度移動端首頁秒開是怎樣做到的?

  1. 靜態文件的放置
  2. 緩存
  3. 外鏈
  4. 緩存dom
  5. 使用iconfont
  6. 卡片的異步加載與緩存
  7. 不在首屏的就要 異步化
  8. 少量靜態文件的域名


免責聲明!

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



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