移動端+HTML5拒炎,這個組合對前端工程師來說是個不小的挑戰(zhàn):如何讓開發(fā)的頁面能有更好的體驗?這就是我們今天討論的話題:移動端HTML5頁面前端性能優(yōu)化。
如何優(yōu)化HTML5在移動設(shè)置上的性能表現(xiàn),首先需要明確以下幾個原則:
1章办、PC優(yōu)化手段在Mobile端同樣適用。
2滨彻、在Mobile側(cè)我們提出三秒種渲染完成首屏指標藕届。
3、基于第二點亭饵,首屏加載3秒完成或使用Loading休偶。
4、基于聯(lián)通3G網(wǎng)絡(luò)平均338KB/s(2.71Mb/s)冬骚,所以首屏資源不應(yīng)超過1014KB椅贱。
5、Mobile端因手機配置原因只冻,除加載外渲染速度也是優(yōu)化重點庇麦。
6、基于第五點喜德,要合理處理代碼減少渲染損耗山橄。
7、基于第二舍悯、第五點航棱,所有影響首屏加載和渲染的代碼應(yīng)在處理邏輯中后置睡雇。
8、加載完成后用戶交互使用時也需注意性能饮醇。
接下來先看一張神圖:
之所以說是神圖它抱,是因為它基本上涵蓋了所有的優(yōu)化方案!非常詳盡朴艰!在這里观蓄,我們針對其中幾個代表性方案進行探討:
加載優(yōu)化
對于移動端的網(wǎng)頁來說,加載過程是最為耗時的過程祠墅,可能會占到總耗時的80%時間侮穿,因此是優(yōu)化的重點,當然毁嗦,手機站的其他前端要素優(yōu)化也是不能忽略的亲茅。
1、減少HTTP請求
因為手機瀏覽器同時響應(yīng)請求為4個請求(Android支持4個狗准,iOS 5后可支持6個)克锣,所以要盡量減少頁面的請求數(shù),首次加載同時請求數(shù)不能超過4個腔长,建議優(yōu)化要點為以下2點:
1娶耍、合并CSS、Java
2饼酿、合并小圖片,使用雪碧圖
2胚膊、緩存
使用緩存可以減少向服務(wù)器的請求數(shù)故俐,節(jié)省加載時間,所以所有靜態(tài)資源都要在服務(wù)器端設(shè)置緩存紊婉,并且盡量使用長Cache(長Cache資源的更新可使用時間戳)药版。
1、緩存一切可緩存的資源
2喻犁、使用長Cache(使用時間戳更新Cache)
3槽片、使用外聯(lián)式引用CSS、Java
3肢础、壓縮HTML还栓、CSS、Java
減少資源大小可以加快網(wǎng)頁顯示速度传轰,所以要對HTML剩盒、CSS、Java等進行代碼壓縮慨蛙,并在服務(wù)器端設(shè)置GZip辽聊。
1纪挎、壓縮(例如,多余的空格跟匆、換行符和縮進)
2异袄、啟用GZip
4、無阻塞
寫在HTML頭部的Java(無異步)玛臂,和寫在HTML標簽中的Style會阻塞頁面的渲染烤蜕,因此CSS放在頁面頭部并使用Link方式引入,避免在HTML標簽中寫Style垢揩,Java放在頁面尾部或使用異步方式加載
5玖绿、使用首屏加載
首屏的快速顯示,可以大大提升用戶對頁面速度的感知叁巨,因此應(yīng)盡量針對首屏的快速顯示做優(yōu)化斑匪。
6、按需加載
將不影響首屏的資源和當前屏幕資源不用的資源放到用戶需要時才加載锋勺,可以大大提升重要資源的顯示速度和降低總體流量蚀瘸。
1、LazyLoad
2庶橱、滾屏加載
3贮勃、通過Media Query加載
另外,提醒大家一點:按需加載會導(dǎo)致大量重繪苏章,影響渲染性能寂嘉。
7、預(yù)加載
大型重資源頁面(如游戲)可使用增加Loading的方法枫绅,資源加載完成后再顯示頁面泉孩,但Loading時間過長,會造成用戶流失并淋。
1寓搬、可感知Loading(如進入空間游戲的Loading)
2、不可感知的Loading(如提前加載下一頁)
3县耽、對用戶行為分析句喷,可以在當前頁加載下一頁資源,提升速度兔毙。
8唾琼、壓縮圖片
圖片是最占流量的資源,因此盡量避免使用他瞒御,使用時選擇最合適的格式(實現(xiàn)需求的前提下父叙,以大小判斷),合適的大小,然后使用智圖壓縮趾唱,同時在代碼中用Srcset來按需顯示涌乳。
1、使用智圖
2甜癞、使用其它方式代替圖片(使用CSS3夕晓;使用SVG;使用IconFont)
3悠咱、使用Srcset
4蒸辆、選擇合適的圖片(webP優(yōu)于JPG;PNG8優(yōu)于GIF)
5析既、選擇合適的大泄薄(首次加載不大于1014KB;基于手機屏幕一般寬度不寬于640)
提醒大家一點:過度壓縮圖片大小影響圖片顯示效果眼坏。
9拂玻、減少Cookie,避免重定向以及異步加載第三方資源
Cookie會影響加載速度宰译,所以靜態(tài)資源域名不使用Cookie檐蚜。另外,重定向會影響加載速度沿侈,所以在服務(wù)器正確設(shè)置避免重定向闯第。還有,第三方資源不可控會影響頁面的加載和顯示缀拭,因此要異步加載第三方資源咳短。
腳本執(zhí)行優(yōu)化
腳本處理不當會阻塞頁面加載、渲染蛛淋,因此在使用時需要注意以下幾點:
1诲泌、CSS寫在頭部,Java寫在尾部或異步铣鹏。
2、避免圖片和iFrame等的空Src哀蘑,空Src會重新加載當前頁面诚卸,影響速度和效率。
3绘迁、盡量避免重設(shè)圖片大小合溺,重設(shè)圖片大小是指在頁面、CSS缀台、Java等中多次重置圖片大小棠赛,多次重設(shè)圖片大小會引發(fā)圖片的多次重繪,影響性能。
4睛约、圖片盡量避免使用DataURL鼎俘,DataURL圖片沒有使用圖片的壓縮算法文件會變大,并且要解碼后再渲染辩涝,加載慢耗時長贸伐。
CSS優(yōu)化
1、盡量避免寫在HTML標簽中寫Style屬性怔揩。
2捉邢、避免CSS表達式,CSS表達式的執(zhí)行需跳出CSS樹的渲染商膊,因此請避免CSS表達式伏伐。
3、移除空的CSS規(guī)則晕拆,空的CSS規(guī)則增加了CSS文件的大小藐翎,且影響CSS樹的執(zhí)行,所以需移除空的CSS規(guī)則潦匈。
4阱高、正確使用Display的屬性,Display屬性會影響頁面的渲染茬缩,建議各位站長要合理使用赤惊。
(1)、display:inline后不應(yīng)該再使用width凰锡、height未舟、margin、padding以及float
(2)掂为、display:inline-block后不應(yīng)該再使用float
(3)裕膀、display:block后不應(yīng)該再使用vertical-align
(4)、display:table-*后不應(yīng)該再使用margin或者float
5勇哗、不濫用Float昼扛,F(xiàn)loat在渲染時計算量比較大,盡量減少使用欲诺。
6抄谐、不濫用Web字體,Web字體需要下載扰法,解析蛹含,重繪當前頁面,盡量減少使用塞颁。
7浦箱、不聲明過多的Font-size吸耿,過多的Font-size引發(fā)CSS樹的效率。
8酷窥、值為0時不需要任何單位咽安,為了瀏覽器的兼容性和性能,值為0時不要帶單位竖幔。
9板乙、標準化各種瀏覽器前綴
(1)、無前綴應(yīng)放在最后拳氢。
(2)募逞、CSS動畫只用(-webkit- 無前綴)兩種即可。
(3)馋评、其它前綴為“-webkit- -moz- -ms-無前綴”四種(-o-Opera瀏覽器改用blink內(nèi)核放接,所以淘汰)。
10留特、避免讓選擇符看起來像正則表達式纠脾。
高級選擇器執(zhí)行耗時長且不易讀懂,避免使用蜕青。
Java執(zhí)行優(yōu)化
1苟蹈、減少重繪和回流
(1)、避免不必要的Dom操作
(2)右核、盡量改變Class而不是Style慧脱,使用classList代替className
(3)、避免使用document.write
(4)贺喝、減少drawImage
2菱鸥、緩存Dom選擇與計算,每次Dom選擇都要計算躏鱼,緩存他氮采。
3、緩存列表.length染苛,每次.length都要計算鹊漠,用一個變量保存這個值。
4茶行、盡量使用事件代理贸呢,避免批量綁定事件。
5拢军、盡量使用ID選擇器,ID選擇器是最快的怔鳖。
6茉唉、TOUCH事件優(yōu)化,使用touchstart、touchend代替click度陆,因快影響速度快艾凯,但應(yīng)注意Touch響應(yīng)過快,易引發(fā)誤操作懂傀。
渲染優(yōu)化
HTML文檔是以包含文檔編碼信息的數(shù)據(jù)流方式在網(wǎng)絡(luò)間傳輸趾诗,頁面的編碼信息一般會在HTTP響應(yīng)的頭部信息或在文檔內(nèi)的HTML標記中指明,客戶端瀏覽器只有在確定了頁面編碼后才能正確的渲染頁面蹬蚁,所以在繪制頁面或執(zhí)行任何的java代碼前恃泪,大部分的瀏覽器(ie6、ie7犀斋、ie8除外)都 會緩沖一定字節(jié)的數(shù)據(jù)來從中查找編碼信息贝乎,不同的瀏覽器當中預(yù)緩沖的字節(jié)數(shù)是不一樣的。
1叽粹、HTML使用Viewport
Viewport可以加速頁面的渲染览效,請使用以下代碼:
2、減少Dom節(jié)點
Dom節(jié)點太多影響頁面的渲染虫几,應(yīng)盡量減少Dom節(jié)點锤灿。
3、動畫優(yōu)化
(1)辆脸、盡量使用CSS3動畫但校。
(2)、合理使用requestAnimationFrame動畫代替setTimeout每强。
(3)始腾、適當使用Canvas動畫5個元素以內(nèi)使用css動畫,5個以上使用Canvas動畫(iOS8可使用webGL)空执。
4浪箭、高頻事件優(yōu)化
Touchmove、Scroll事件可導(dǎo)致多次渲染辨绊。
(1)奶栖、使用requestAnimationFrame監(jiān)聽幀變化,使得在正確的時間進行渲染门坷。
(2)宣鄙、增加響應(yīng)變化的時間間隔,減少重繪次數(shù)默蚌。
5冻晤、GPU加速
CSS中以下屬性(CSS3 transitions、CSS3 3Dtransforms绸吸、Opacity鼻弧、Canvas设江、WebGL、Video)來觸發(fā)GPU渲染攘轩,請合理使用叉存。(PS:過渡使用會引發(fā)手機過耗電增加。)
轉(zhuǎn)載來源:移動端H5前端性能優(yōu)化 - 周磊