1. 程式人生 > >網頁性能優化:防止JavaScript、CSS阻塞瀏覽器渲染頁面

網頁性能優化:防止JavaScript、CSS阻塞瀏覽器渲染頁面

css ava 導致 jquery blue plugin ref asc 前端性能

  網頁中引用的外部文件: JavaScritp、CSS 等常常會阻塞瀏覽器渲染頁面。假設在 <head> 中引用的某個 JavaScript 文件由於各種不給力需要2秒來加載,那麽瀏覽器渲染頁面的過程就會被阻塞2秒,直到該JS文件下載並執行完後才繼續。

  前端性能調優時必須排除任何潛在的渲染阻塞點,讓瀏覽器在最短時間內渲染出整體頁面。

1、JavaScript為何會阻塞?

<!doctype html>
<html>
  <head>
    <script type="text/javascript" src="page.js"></script>
  </head>
  <body>
    <h1>Hello World</h1>
  </body>
</html>

  上述代碼中,當瀏覽器解析 script 標簽時,由於瀏覽器並不知道 page.js 將會對頁面做什麽改變,所以瀏覽器需要停止渲染,下載並執行 page.js 後再繼續渲染後面的內容。如果 page.js 的下載過程中出現任何延遲,也將影響整個頁面的渲染。

2、優化方案:

(1)Inline JavaScript:

  如果頁面的初始渲染的確依賴於page.js,我們可以考慮使用內聯JavaScript。

<!doctype html>
<html>
  <head>
    <script type="text/javascript">
    /*
page.js的內容 */ </script> </head> <body> <h1>Hello World</h1> </body> </html>

(2)推遲加載:

  如果頁面的初始渲染並不依賴於page.js,我們可以考慮推遲加載page.js,讓其在頁面初始內容渲染完成後再加載。

<!doctype html>
<html>
  <head>
  </head>
  <body>
    <h1>Hello World</h1>
    <script type="
text/javascript" src="page.js"></script> </body> </html>

(3)異步加載

  HTML5允許我們給 script 標簽添加屬性: "async" 來告訴瀏覽器不必停下來等待該腳本執行,什麽時候下載完什麽時候執行該腳本就可以了。這樣的話瀏覽器會邊下載page.js邊渲染後面的內容。

<!doctype html>
<html>
  <head>
    <script type="text/javascript" src="page.js" async></script>
  </head>
  <body>
    <h1>Hello World</h1>
  </body>
</html>

  然而如果某個JS被其他JS所依賴,那麽就不能使用異步加載了。

<!doctype html>
<html>
  <head>
    <script type="text/javascript" src="jquery-1.11.3.min.js" async></script>
    <script type="text/javascript" src="jq-plugin.js" async></script>
  </head>
  <body>
    <h1>Hello World</h1>
  </body>
</html>

  由於使用異步加載後,JS不再順序執行。上例中 jq-plugin.js 依賴於jQuery,如果 jq-plugin.js 先下載完成,此時jQuery還沒下載完,那麽瀏覽器就會先執行 jq-plugin.js 導致出錯。當然這類問題可以通過引入依賴管理來解決,這是另外一個主題,就不展開討論了。

3、CSS為什麽會阻塞?

  由於CSS決定了DOM元素的樣式、布局,所以瀏覽器遇到CSS文件時會等待CSS文件加載並解析完後才繼續渲染頁面。

4、優化方案:

(1)Inline CSS

  我們可以將那些頁面首屏渲染需要用到的CSS代碼加入Inline CSS。

(2)推遲加載CSS

  對於那些首屏渲染不需要用到的CSS,我們可以依舊使用文件形式並在頁面內容渲染完成後再加載。

<!doctype html>
<html>
  <head>
    <style tpe="text/css">
    .blue {
        color: blue;
    }
    </style>
  </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
    <link href="other.css" rel="stylesheet" />
  </body>
</html>

5、結論

  在頁面加載時我們需要讓頁面內容盡快呈現給用戶,頁面初始渲染所需要的JS和CSS可以直接在 <head> 標簽中以代碼形式插入。

  所有的外部文件引用可以放在頁面內容之後,對於JS文件也可以采用異步加載。

網頁性能優化:防止JavaScript、CSS阻塞瀏覽器渲染頁面