PC瀏覽器前端優化策略
pc端優化的策略很多,如Slow(YSlow時Yahoo發布的一款Firefox插件,現Chrome也可以安裝,可以對網站的頁面性能進行分析,提出對該頁面性能優化的建議。)或者Chrome自帶的Audits等,總結起來包括網絡加載類,也買你渲染類,CSS優化類,javaScript執行類、緩存類、圖片類、架構協議類等幾類。
網絡加載類
-
減少HTTP資源請求次數。
在前端也頁面中,通常建議盡可能合并靜態資源圖片、JavaScript或者CSS代碼,減少頁面請求數和資源請求消耗,這樣可以縮短頁面手冊訪問用戶等待時間。通過構建工具合并雪碧圖、CSS、javaScript文件都是為了減少HTTP資源的請求次數。另外也要盡量避免重復的資源,防止增加多余的請求。 -
減小HTTP請求大小
除了減少HTTP請求的次數,也要盡量減少每個HTTP請求的大小。如減少沒必要的圖片、JavaScript、CSS及HTML代碼,對文件進行壓縮優化,或者使用gzip壓縮傳輸內容等都和以來減小為念大小,縮短傳輸等待時延。使用構建工具來壓縮靜態圖片資源以及移除代碼中的注釋并壓縮,目的都是問了減少HTTP請求的大小。 - 將CSS或者JavaScript放到外部文件中,避免使用<style>或則和<script>標簽直接引入
在 HTML 文件中引用外部資源可以有效利用瀏覽器的靜態資源緩存,但有時候在移動端頁面 CSS 或 JavaScript 比較簡單的情況下為了減少請求,也會將 CSS 或 JavaScript 直接寫到 HTML 里面,具體要根據 CSS 或 JavaScript 文件的大小和業務的場景來分析。如果 CSS 或 JavaScript 文件內容較多,業務邏輯較復雜,建議放到外部文件引入。
避免頁面中空的href和src
當頁面中的href屬性位空,或者<script>、<img>、<iframe>標簽的src屬性為空時,瀏覽器在渲染過程中仍會將href屬性或者src屬性中的內容進行加載,直至加載失敗,這樣就阻塞了頁面中其他資源的下載進程,而且最終加載到的內容是無效的,因此要盡量避免。-
為HTML制定Cache-Control或者Expires
為HTML內容設置Cache-Control 或者Expires頭部有效時,瀏覽器直接從緩存中讀取內容,不向服務器發送請求。- cache-control:指定請求和響應遵循的緩存機制
- 取值:
- no-cache: 先發送請求,與廢棄確認該資源是否被更改,如果未被更改,則使用緩存。
- no-store :不允許緩存,每次都要區服務器上,下載完整的響應。(安全措施)
- public :緩存所有響應,但并非必須。因為max-age也可以做到相同的效果。
- private: 只為單個用戶緩存,因此不允許熱河中繼進行緩存。(比如CDN就不允許緩存private的響應)
- max-age: 表示當前請求開始,該響應在多久內能被緩存和重用,而不去服務器重新請求。列如:max-age = 60表示響應何以在緩存和重用60秒。
express : 網頁到期時間
用于設定網頁的到期時間,過期后必須到服務器上重新傳輸。
<meta http-equiv="Cache-Control" content="max-age=7200">
<meta http-equiv="Expires" content="Mon,20Jul201623:00:00GMT">
// 注意時間格式:必須使用GMT的時間格式
-
合理設置Etag和last-Modified
和理設置Etag和last-Modified使用瀏覽器緩存,對于未修改的文件,靜態資源服務器會向瀏覽器端返回304,讓瀏覽器從緩存文件中讀取文件。減少web資源下載的帶寬消耗并降低服務器負載。
<meta http-equiv="last-modified" content="Sun,05 Nov 2017 13:45:57 GMT">
詳情請查看meta標簽屬性匯總
減少頁面重定向
頁面每次重定向都會延長頁面內容的等待延時,一次重定向大約需要200ms不等的時間開銷(無緩存),為了保證用戶盡快看到也買你內容,要盡量避免頁面重定向。使用靜態資源分域存放來增加下載并行數
瀏覽器在同一時刻相同一域名請求文件的并行下載數是有限的,因此可以利用多個域名的主機來存放不同的靜態資源,增大頁面加載時資源的并行下載數,縮短也買你資源加載的時間。通常根據多個域名來分別存儲JavaScript、CSS、和圖片文件。
<link rel="stylesheet" >
...
<script src="http://cdn2.domain.com/path/main.js"></script>
-
使用cnd來存儲文件
如果條件允許,可以利用cnd網絡加快同一個地理區域內重復靜態資源文件的響應下載速度,縮短資源請求時間。 - 使用CDN Combo下載傳輸內容
CDN Combo 是在cdn服務器端將多個文件打包成一個文件的形式來返回的技術,這樣可以實現HTTP連接傳輸的一次性復用性,減少瀏覽器的htttp請求數,加快資源下載速度。列如同一個域名CDN服務器上a.js, b.js, c.js就可以按如下方式在一個請求中下載。
<script src="http://cdn.domain.com/path/a.js,b,jsc,js">
11.使用可緩存的AJAX對于返回內容相同的請求,沒必要每次都直接從服務器拉去,合理使用AJAX緩存能加快AJAX響應速度并減輕服務器壓力。
$.ajax({
url : url,
type : 'get',
cache : true, //推薦使用緩存
data : {},
success (){//...},
error (){//...}
});
- 使用GET來完成AJAX請求。
使用XMLhttpRequest時,瀏覽器中的POST方法會發起兩次TCP數據包傳輸,首先發送頭文件,然后發送HTTP正文數據。而使用GET時只發送頭部問價,所以在拉去服務端數據是,使用GET請求效率更高。
$.ajax({
url : url,
type : 'get', //推薦使用get完成請求
data : {},
success (){//...},
error(){//...}
});
減少Cookie的大小并進行Cookie隔離
HTTP請求通常默認會帶上瀏覽器端的Cookie一起發送給服務器,所以在非必要情況下,要盡量減少Cookie來減小HTTP請求的大小。對于靜態資源,盡量使用不同的域名來存放,因為Cookie默認是不能跨域的,這樣就做到了不同域名下靜態資源請求的Cookie隔離。縮小favicon.ico并緩存,因為一般一個web應用的favicon.ico是很少改變的。
推薦使用異步Javascript資源。
異步的javascript資源不會阻塞文檔解析,所以允許在瀏覽器中優先渲染頁面,延后加載腳本執行。列如Javascript的引用可以如下設置。也可以使用模塊化加載機制來實現。
<script src ="main .js" defer> </script>
<script src="main.js" async></script>
使用async時加載和渲染后續文檔的過程和main.js的加載時與執行是并行的。使用defer時,加載后續文檔元素的過程和main.js的加載時并行的,但是main.js的執行要在頁面所有元素解析完成以后才能開始執行。
消除阻塞渲染的css及javascript
對于頁面中加載時間過長的CSS或JavaScript文件,需要進行合理拆分或者延后加載,保證關鍵路徑的資源能快速加載完成。避免使用CSS impor 引用加載CSS
CSS中的@import可從一個樣式文件中引入樣式,但因該避免這種做法,英文這樣會增加CSS資源的加載的關鍵路徑長度,帶有@import的CSS樣式需要在CSS文件串行解析到@import時才會加載另外的CSS文件,大大延后css渲染完成的時間。
<!--不推薦-->
<style>
@import "path/main.css"
</style>
<!--推薦如下寫法-->
<link rel= "styleSheet"
頁面渲染類
-
把css資源引用放到HTML文件頂部。
一般推薦獎所有CSS資源今早指定在文檔的<head>中,這樣瀏覽器可以優先下載css并今早完成頁面渲染。 - javascript資源引用放到HTML文件底部。
javascrit資源引用放到HTML文檔底部可以方式javascript的加載和解析執行對頁面渲染造成阻塞。由于JavaScript資源默認是解析阻塞,除非被標記為異步或者通過其他的異步方式加載,否則會阻塞HTML DOM解析和CSS渲染的過程。 -
盡量預先設定圖片大小。
在加載大量圖片元素是,盡量預先設定圖片尺寸大小,否則在圖片加載過程中,跟心圖片的排版信息,會產生大量的重排。 -
不要在HTML中直接縮放圖片
在HTML中直接縮放圖片會導致頁面內容的重排和重繪,此時可能會使頁面的其他操作產生卡頓,因此要盡量減少頁面中直接進行圖片的縮放。 -
減少DOM元素的數量和深度
HTML中標簽元素越多,標簽層級越深,瀏覽器解析DOM并繪制到瀏覽器中所花的時間就越長,所以應盡可能保持DOM元素的簡潔和層級較少。
<!--不推薦-->
<div>
<span>
<a href="javascript:void(0);">
<img src="./path/photo.jpg" alt="圖片">
</a>
</span>
</div>
<!--推薦-->
<img src="./path/photo.jpg" alt="圖片" >
-
盡量避免在選擇器末尾添加通配符
CSS解析匹配到渲染樹的過程是從右到左的逆向匹配,在選擇器末尾添加通配符至少會增加一倍多的計算量。 -
減少使用關系類型樣式表的寫法
直接使用唯一類名即可最大褻瀆的提升渲染引擎繪制渲染樹等效率。 -
盡量減少使用js動畫
JS直接操作DOM極容易引起頁面的重排 -
CSS動畫使用translate、scale代替top、height
盡量使用css3的translate、scale屬性代替top、left和height、width,避免大量的重排計算。 -
盡量避免使用<table>、<iframe>
<table>內容的渲染是將table的DOM渲染樹全部生成完成并一次性繪制到頁面上的,所以在長表格渲染時很消耗性能,應該盡量避免使用他,可以考慮使用列表元素<ul>代替。盡量使用異步的方式添加iframe,英文iframe內資源的下載進程會阻塞父頁面靜態資源的下載與CSS及DOM的解析。 -
避免運行耗時的javascript
長時間運行的Javascript會阻塞瀏覽器構建DOM樹,DOM渲染樹、渲染頁面。所以,任何與頁面初次渲染無關的邏輯功能都應該延遲加載執行,這個Javascript資源的異步加載思路是一致的。 - 避免使用CSS表達式,或者CSS濾鏡
.opacity{
filter : progid : DXImageTransform.Microsoft.Alpha( opacity = 50 );
}
移動瀏覽器前端優化策略:
-
首屏數據提前請求,避免JavaScript文件加載后才請求數據
為了進一步提升頁面加載速度,可以考慮將頁面的數據請求盡可能提前,避免在javascript加載完成后才去請求數據。通常數據請求是頁面內容渲染中關鍵路徑最長的部分,而且不能并行,所以如果能將數據請求提前,可以極大程度上縮短頁面內容的渲染完成時間。 -
首屏加載按需加載,非首內容滾屏加載,保證首屏內容最小化。
由于移動端網絡速度相對較慢,網絡資源有限,因此為了盡快完成頁面內容的加載,需要保證首屏加載資源最小,非首屏內容異步方式加載。一遍推薦移動頁面首屏數據延時最長不超過3ms。目前中國聯通3G的網絡速度為338KB/s(2.71MS/s),所以推薦首屏資源所有最大不超過1MB。 -
模塊化資源并行下載
在移動端加載資源中保證JavaScript資源并行加載,主要指的是模塊化Javascript資源的異步加載,列如AMD的異步模塊,使用并行的加載方式能夠縮短多個文件資源的加載時間。 -
inline首屏必備的CSS和JavaScript
通常為了在HTML加載完畢時能夠使瀏覽器中有基本的樣式。需要將頁面渲染是必備的CSS和JavaScript通過<script>或者<style>內聯到頁面中,避免頁面HTML載入完成到頁面內容展示這段過程中頁面出現空白。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>樣例</title>
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<style>
/*必備的首屏CSS*/
html,body{
margin:0;
padding:0;
background-color:#ccc;
}
</style>
</head>
<body>
</body>
</html>
后續內容
HTTP壓縮:
現代瀏覽器進行htttp請求時,普遍支持gzip壓縮。在發出請求時,會在htttp頭部顯示Accept-Enconding: gzip,deflate (在請求頭中設置) 即就是告訴服務器可以接受這兩種雅俗格式。于是服務器就把請求的資源文件壓縮,并設置Content-Encoding:gzip (在響應頭中設置),瀏覽器看到著個頭部設置,自動解壓縮。這種壓縮可以減少至少60%的體積。CDN資源庫對返回的腳本進行了壓縮傳輸,所以在開發中有些資源可以通過CDN靜態資源庫來引用。