新聞中心
圍繞前端的性能多如牛毛,涉及到方方面面,我們將圍繞 PC 瀏覽器和移動(dòng)端瀏覽器的優(yōu)化策略進(jìn)行羅列 注意,是羅列不是展開,遇到不會(huì)不懂的點(diǎn)還請站外擴(kuò)展

開車速度有點(diǎn)快,坐穩(wěn)了。
PC 瀏覽器前端優(yōu)化策略
PC 端優(yōu)化的策略很多,如 YSlow(YSlow 是 Yahoo 發(fā)布的一款 Firefox 插件,現(xiàn) Chrome 也可安裝,可以對(duì)網(wǎng)站的頁面性能進(jìn)行分析,提出對(duì)該頁面性能優(yōu)化的建議)原則,或者 Chrome 自帶的 Audits 等,總結(jié)起來主要包括網(wǎng)絡(luò)加載類、頁面渲染類、CSS 優(yōu)化類、JavaScript 執(zhí)行類、緩存類、圖片類、架構(gòu)協(xié)議類等幾類,下面逐一介紹。
網(wǎng)絡(luò)加載類
(1)減少 HTTP 資源請求次數(shù)
在前端頁面中,通常建議盡可能合并靜態(tài)資源圖片、JavaScript 或 CSS 代碼,減少頁面請求數(shù)和資源請求消耗,這樣可以縮短頁面首次訪問的用戶等待時(shí)間。通過構(gòu)建工具合并雪碧圖、CSS、JavaScript 文件等都是為了減少 HTTP 資源請求次數(shù)。另外也要盡量避免重復(fù)的資源,防止增加多余請求。
(2)減小 HTTP 請求大小
除了減少 HTTP 資源請求次數(shù),也要盡量減小每個(gè) HTTP 請求的大小。如減少?zèng)]必要的圖片、JavaScript、CSS 及 HTML 代碼,對(duì)文件進(jìn)行壓縮優(yōu)化,或者使用 gzip 壓縮傳輸內(nèi)容等都可以用來減小文件大小,縮短網(wǎng)絡(luò)傳輸?shù)却龝r(shí)延。前面我們使用構(gòu)建工具來壓縮靜態(tài)圖片資源以及移除代碼中的注釋并壓縮,目的都是為了減小 HTTP 請求的大小。
(3)將 CSS 或 JavaScript 放到外部文件中,避免使用 style或script或 標(biāo)簽直接引入
在 HTML 文件中引用外部資源可以有效利用瀏覽器的靜態(tài)資源緩存,但有時(shí)候在移動(dòng)端頁面 CSS 或 JavaScript 比較簡單的情況下為了減少請求,也會(huì)將 CSS 或 JavaScript 直接寫到 HTML 里面,具體要根據(jù) CSS 或 JavaScript 文件的大小和業(yè)務(wù)的場景來分析。如果 CSS 或 JavaScript 文件內(nèi)容較多,業(yè)務(wù)邏輯較復(fù)雜,建議放到外部文件引入。
(4)避免頁面中空的 href 和 src
當(dāng) 標(biāo)簽的 href 屬性為空,或
(9)使用靜態(tài)資源 CDN 來存儲(chǔ)文件
如果條件允許,可以利用 CDN 網(wǎng)絡(luò)加快同一個(gè)地理區(qū)域內(nèi)重復(fù)靜態(tài)資源文件的響應(yīng)下載速度,縮短資源請求時(shí)間。
(10)使用 CDN Combo 下載傳輸內(nèi)容
CDN Combo 是在 CDN 服務(wù)器端將多個(gè)文件請求打包成一個(gè)文件的形式來返回的技術(shù),這樣可以實(shí)現(xiàn) HTTP 連接傳輸?shù)囊淮涡詮?fù)用,減少瀏覽器的 HTTP 請求數(shù),加快資源下載速度。例如同一個(gè)域名 CDN 服務(wù)器上的 a.js,b.js,c.js 就可以按如下方式在一個(gè)請求中下載。
(11)使用可緩存的 AJAX
對(duì)于返回內(nèi)容相同的請求,沒必要每次都直接從服務(wù)端拉取,合理使用 AJAX 緩存能加快 AJAX 響應(yīng)速度并減輕服務(wù)器壓力。
$.ajax({
url : url,
type : 'get',
cache : true, //推薦使用緩存
data : {},
success (){//...},
error (){//...}
});
(12)使用 GET 來完成 AJAX 請求
使用 XMLHttpRequest 時(shí),瀏覽器中的 POST 方法會(huì)發(fā)起兩次 TCP 數(shù)據(jù)包傳輸,首先發(fā)送文件頭,然后發(fā)送 HTTP 正文數(shù)據(jù)。而使用 GET 時(shí)只發(fā)送頭部,所以在拉取服務(wù)端數(shù)據(jù)時(shí)使用 GET 請求效率更高。
$.ajax({
url : url,
type : 'get', //推薦使用get完成請求
data : {},
success (){//...},
error(){//...}
});
(13)減少 Cookie 的大小并進(jìn)行 Cookie 隔離
HTTP 請求通常默認(rèn)帶上瀏覽器端的 Cookie 一起發(fā)送給服務(wù)器,所以在非必要的情況下,要盡量減少 Cookie 來減小 HTTP 請求的大小。對(duì)于靜態(tài)資源,盡量使用不同的域名來存放,因?yàn)?Cookie 默認(rèn)是不能跨域的,這樣就做到了不同域名下靜態(tài)資源請求的 Cookie 隔離。
(14)縮小 favicon.ico 并緩存
有利于 favicon.ico 的重復(fù)加載,因?yàn)橐话阋粋€(gè) Web 應(yīng)用的 favicon.ico 是很少改變的。
(15)推薦使用異步 JavaScript 資源
異步的 JavaScript 資源不會(huì)阻塞文檔解析,所以允許在瀏覽器中優(yōu)先渲染頁面,延后加載腳本執(zhí)行。例如 JavaScript 的引用可以如下設(shè)置,也可以使用模塊化加載機(jī)制來實(shí)現(xiàn)。
使用 async 時(shí),加載和渲染后續(xù)文檔元素的過程和 main.js 的加載與執(zhí)行是并行的。使用 defer 時(shí),加載后續(xù)文檔元素的過程和 main.js 的加載是并行的,但是 main.js 的執(zhí)行要在頁面所有元素解析完成之后才開始執(zhí)行。
(16)消除阻塞渲染的 CSS 及 JavaScript
對(duì)于頁面中加載時(shí)間過長的 CSS 或 JavaScript 文件,需要進(jìn)行合理拆分或延后加載,保證關(guān)鍵路徑的資源能快速加載完成。
(17)避免使用 CSS import 引用加載 CSS
CSS 中的 @import 可以從另一個(gè)樣式文件中引入樣式,但應(yīng)該避免這種用法,因?yàn)檫@樣會(huì)增加 CSS 資源加載的關(guān)鍵路徑長度,帶有 @import 的 CSS 樣式需要在 CSS 文件串行解析到 @import 時(shí)才會(huì)加載另外的 CSS 文件,大大延后 CSS 渲染完成的時(shí)間。
@import "path/main.css";
頁面渲染類
1.把 CSS 資源引用放到 HTML 文件頂部
一般推薦將所有 CSS 資源盡早指定在 HTML 文檔
中,這樣瀏覽器可以優(yōu)先下載 CSS 并盡早完成頁面渲染。
2.JavaScript 資源引用放到 HTML 文件底部
JavaScript 資源放到 HTML 文檔底部可以防止 JavaScript 的加載和解析執(zhí)行對(duì)頁面渲染造成阻塞。由于 JavaScript 資源默認(rèn)是解析阻塞的,除非被標(biāo)記為異步或者通過其他的異步方式加載,否則會(huì)阻塞 HTML DOM 解析和 CSS 渲染的過程。
3.盡量預(yù)先設(shè)定圖片等大小
在加載大量的圖片元素時(shí),盡量預(yù)先限定圖片的尺寸大小,否則在圖片加載過程中會(huì)更新圖片的排版信息,產(chǎn)生大量的重排
4.不要在 HTML 中直接縮放圖片
在 HTML 中直接縮放圖片會(huì)導(dǎo)致頁面內(nèi)容的重排重繪,此時(shí)可能會(huì)使頁面中的其他操作產(chǎn)生卡頓,因此要盡量減少在頁面中直接進(jìn)行圖片縮放。
5.減少 DOM 元素?cái)?shù)量和深度
HTML 中標(biāo)簽元素越多,標(biāo)簽的層級(jí)越深,瀏覽器解析 DOM 并繪制到瀏覽器中所花的時(shí)間就越長,所以應(yīng)盡可能保持 DOM 元素簡潔和層級(jí)較少。
6.盡量避免在選擇器末尾添加通配符
CSS 解析匹配到 渲染樹的過程是從右到左的逆向匹配,在選擇器末尾添加通配符至少會(huì)增加一倍多計(jì)算量。
7.減少使用關(guān)系型樣式表的寫法
直接使用唯一的類名即可最大限度的提升渲染引擎繪制渲染樹等效率
8.盡量減少使用 JS 動(dòng)畫
JS 直接操作 DOM 極容易引起頁面的重排
9.CSS 動(dòng)畫使用 translate、scale 代替 top、height
盡量使用 CSS3 的 translate、scale 屬性代替 top、left 和 height、width,避免大量的重排計(jì)算
10.盡量避免使用


咨詢
建站咨詢
