標籤:必須 檔案 lin style 引入 需要 方案 class sync
網頁中引用的外部檔案: 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阻塞瀏覽器渲染頁面