首頁(yè)加載時(shí)順序:
初始化 webview -> 請(qǐng)求頁(yè)面 -> 下載數(shù)據(jù) -> 解析HTML -> 請(qǐng)求 js/css 資源 -> dom 渲染 -> 解析 JS 執(zhí)行 -> JS 請(qǐng)求數(shù)據(jù) -> 解析渲染 -> 下載渲染圖片
前端優(yōu)化:
降低請(qǐng)求量:合并資源绑榴,減少 HTTP 請(qǐng)求數(shù)翔怎,minify / gzip 壓縮杨耙,webP,lazyLoad。
加快請(qǐng)求速度:預(yù)解析DNS剔氏,減少域名數(shù),并行加載,CDN 分發(fā)令花。
緩存:HTTP 協(xié)議緩存請(qǐng)求阻桅,離線緩存 manifest,離線數(shù)據(jù)緩存localStorage。
渲染:JS/CSS優(yōu)化,加載順序,服務(wù)端渲染嗜愈,pipeline。
- PC優(yōu)化手段在Mobile側(cè)同樣適用
- 在Mobile側(cè)我們提出三秒種渲染完成首屏指標(biāo)
- 基于第二點(diǎn),首屏加載3秒完成或使用
Loading
- 基于聯(lián)通3G網(wǎng)絡(luò)平均338KB/s(2.71Mb/s),所以首屏資源不應(yīng)超過(guò)1014KB
- Mobile側(cè)因手機(jī)配置原因基公,除加載外渲染速度也是優(yōu)化重點(diǎn)
- 基于第五點(diǎn)欠痴,要合理處理代碼減少渲染損耗
- 基于第二吠式、第五點(diǎn)是目,所有影響首屏加載和渲染的代碼應(yīng)在處理邏輯中后置
- 加載完成后用戶交互使用時(shí)也需注意性能
加載優(yōu)化
加載過(guò)程是最為耗時(shí)的過(guò)程谤饭,可能會(huì)占到總耗時(shí)的80%時(shí)間,因此是優(yōu)化的重點(diǎn)
減少HTTP請(qǐng)求
因?yàn)槭謾C(jī)瀏覽器同時(shí)響應(yīng)請(qǐng)求為4個(gè)請(qǐng)求
(Android支持4個(gè)懊纳,iOS 5后可支持6個(gè))揉抵,所以要盡量減少頁(yè)面的請(qǐng)求數(shù),首次加載同時(shí)請(qǐng)求數(shù)不能超過(guò)4個(gè)嗤疯。
a)合并CSS冤今、JavaScript
b)合并小圖片,使用雪碧圖
,或者熊貓壓縮
https://tinypng.com/
緩存
使用緩存可以減少向服務(wù)器的請(qǐng)求數(shù)茂缚,節(jié)省加載時(shí)間戏罢,所以所有靜態(tài)資源都要在服務(wù)器端設(shè)置緩存屋谭,并且盡量使用長(zhǎng)Cache
(長(zhǎng)Cache
資源的更新可使用時(shí)間戳)
a) 緩存一切可緩存的資源
b) 使用長(zhǎng)Cache(使用時(shí)間戳更新Cache)
c) 使用外聯(lián)式
引用CSS、JavaScript
壓縮HTML龟糕、CSS桐磁、JavaScript
減少資源大小可以加快網(wǎng)頁(yè)顯示速度,所以要對(duì)HTML翩蘸、CSS所意、JavaScript
等進(jìn)行代碼壓縮
,并在服務(wù)器端設(shè)置GZip
催首。
a) 壓縮(例如扶踊,多余的空格、換行符和縮進(jìn)
)
b) 啟用GZip
無(wú)阻塞
寫(xiě)在HTML
頭部的JavaScript
(無(wú)異步)郎任,和寫(xiě)在HTML
標(biāo)簽中的Style
會(huì)阻塞頁(yè)面的渲染秧耗,因此CSS
放在頁(yè)面頭部并使用Link
方式引入,避免在HTML
標(biāo)簽中寫(xiě)Style
舶治,JavaScript
放在頁(yè)面尾部或使用異步方式加載分井。
使用首屏加載
首屏的快速顯示,可以大大提升用戶對(duì)頁(yè)面速度的感知霉猛,因此應(yīng)盡量針對(duì)首屏的快速顯示做優(yōu)化尺锚。
按需加載
將不影響首屏的資源和當(dāng)前屏幕資源不用的資源放到用戶需要時(shí)才加載,可以大大提升重要資源的顯示速度和降低總體流量惜浅。
PS:按需加載會(huì)導(dǎo)致大量重繪瘫辩,影響渲染性能
a) LazyLoad
b) 滾屏加載
c) 通過(guò)Media Query
加載
預(yù)加載
大型重資源頁(yè)面(如游戲)可使用增加Loading
的方法,資源加載完成后再顯示頁(yè)面坛悉。但Loading
時(shí)間過(guò)長(zhǎng)伐厌,會(huì)造成用戶流失。
對(duì)用戶行為分析裸影,可以在當(dāng)前頁(yè)加載下一頁(yè)資源挣轨,提升速度。
a) 可感知Loading
(如進(jìn)入空間游戲的Loading)
b) 不可感知的Loading
(如提前加載下一頁(yè))
壓縮圖片
圖片是最占流量的資源轩猩,因此盡量避免使用他卷扮,使用時(shí)選擇最合適的格式(實(shí)現(xiàn)需求的前提下,以大小判斷)界轩,合適的大小画饥,然后使用智圖壓縮,同時(shí)在代碼中用Srcset
來(lái)按需顯示浊猾。
PS:過(guò)度壓縮圖片大小影響圖片顯示效果
a) 使用智圖
b) 使用其它方式代替圖片(1. 使用CSS3
2. 使用SVG
3. 使用IconFont
)
c) 使用Srcset
d) 選擇合適的圖片(1. webP
優(yōu)于JPG
2. PNG8
優(yōu)于GIF
)
e) 選擇合適的大卸陡省(1. 首次加載不大于1014KB
2. 不寬于640
(基于手機(jī)屏幕一般寬度))
減少Cookie
Cookie
會(huì)影響加載速度,所以靜態(tài)資源域名不使用Cookie
葫慎。
避免重定向
重定向會(huì)影響加載速度衔彻,所以在服務(wù)器正確設(shè)置避免重定向
薇宠。
異步加載第三方資源
第三方資源不可控會(huì)影響頁(yè)面的加載和顯示,因此要異步加載第三方資源艰额。
腳本執(zhí)行優(yōu)化
腳本處理不當(dāng)會(huì)阻塞頁(yè)面加載澄港、渲染,因此在使用時(shí)需當(dāng)注意:
CSS
寫(xiě)在頭部
柄沮,JavaScript
寫(xiě)在尾部或異步
回梧。
避免圖片
和iFrame
等的空Src
,空Src會(huì)重新加載當(dāng)前頁(yè)面祖搓,影響速度和效率狱意。
盡量避免重設(shè)圖片大小
。
重設(shè)圖片大小是指在頁(yè)面
拯欧、CSS详囤、JavaScript
等中多次重置圖片大小,多次重設(shè)圖片大小會(huì)引發(fā)圖片的多次重繪镐作,影響性能藏姐。
圖片盡量避免使用DataURL
,DataURL圖片沒(méi)有使用圖片的壓縮算法文件會(huì)變大该贾,并且要解碼后再渲染羔杨,加載慢耗時(shí)長(zhǎng)
CSS優(yōu)化
盡量避免
寫(xiě)在HTML
標(biāo)簽中寫(xiě)Style
屬性
避免CSS
表達(dá)式
CSS表達(dá)式的執(zhí)行需跳出CSS樹(shù)
的渲染,因此請(qǐng)避免CSS表達(dá)式杨蛋。
移除空的CSS規(guī)則
空的CSS
規(guī)則增加了CSS文件的大小
问畅,且影響CSS樹(shù)的執(zhí)行
,所以需移除空的CSS規(guī)則六荒。
正確使用Display的屬性
Display屬性會(huì)影響頁(yè)面的渲染,因此請(qǐng)合理使用矾端。
a) display:inline后不應(yīng)該再使用width掏击、height、margin秩铆、padding以及float
b)display:inline-block后不應(yīng)該再使用float
c) display:block后不應(yīng)該再使用vertical-align
d) display:table-*后不應(yīng)該再使用margin或者float
不濫用Float
Float
在渲染時(shí)計(jì)算量比較大
砚亭,盡量減少使用。
不濫用Web字體
Web字體需要下載殴玛,解析
捅膘,重繪當(dāng)前頁(yè)面,盡量減少使用滚粟。
不聲明過(guò)多的Font-size
過(guò)多的Font-size引發(fā)CSS樹(shù)的效率
寻仗。
值為0時(shí)不需要任何單位
為了瀏覽器的兼容性和性能,值為0時(shí)不要帶單位
凡壤。
標(biāo)準(zhǔn)化各種瀏覽器前綴
a) 無(wú)前綴應(yīng)放在最后
b)CSS動(dòng)畫(huà)
只用 (-webkit- 無(wú)前綴
)兩種即可
c) 其它前綴為 -webkit- -moz- -ms-
無(wú)前綴 四種署尤,(-o-Opera瀏覽器改用blink內(nèi)核耙替,所以淘汰)
避免讓選擇符看起來(lái)像正則表達(dá)式
高級(jí)選擇器執(zhí)行耗時(shí)長(zhǎng)且不易讀懂,避免使用曹体。
JavaScript執(zhí)行優(yōu)化
減少重繪和回流
a) 避免不必要的Dom操作
b) 盡量改變Class
而不是Style
俗扇,使用classList
代替className
c) 避免使用document.write
d) 減少drawImage
緩存Dom選擇與計(jì)算
每次Dom
選擇都要計(jì)算,緩存
他箕别。
緩存列表.length
每次.length
都要計(jì)算铜幽,用一個(gè)變量保存這個(gè)值
盡量使用事件代理,避免批量綁定事件
盡量使用ID選擇器
串稀,ID選擇器是最快
的除抛。
TOUCH事件優(yōu)化
使用touchstart、touchend
代替click
厨诸,因快影響速度快镶殷。但應(yīng)注意Touch
響應(yīng)過(guò)快,易引發(fā)誤操作
渲染優(yōu)化
HTML使用Viewport
Viewport可以加速頁(yè)面的渲染
微酬,請(qǐng)使用以下代碼:
<pre class="hljs xml" style="transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; margin: 10px auto; padding: 5px; list-style-type: none; list-style-image: none; font-family: "Courier New", sans-serif; background: rgb(245, 245, 245); color: rgb(68, 68, 68); display: block; font-size: 13px; border: 1px solid rgb(204, 204, 204); border-radius: 3px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"> <meta name=”viewport” content=”width=device-width, initial-scale=1″></pre>
減少Dom節(jié)點(diǎn)
Dom節(jié)點(diǎn)太多影響頁(yè)面的渲染绘趋,應(yīng)盡量減少Dom節(jié)點(diǎn)
動(dòng)畫(huà)優(yōu)化
a) 盡量使用CSS3動(dòng)畫(huà)
b) 合理使用requestAnimationFrame
動(dòng)畫(huà)代替setTimeout
c) 適當(dāng)使用Canvas
動(dòng)畫(huà) 5個(gè)元素以內(nèi)使用css
動(dòng)畫(huà),5個(gè)以上使用Canvas
動(dòng)畫(huà)(iOS8可使用webGL)
高頻事件優(yōu)化
Touchmove颗管、Scroll
事件可導(dǎo)致多次渲染
a) 使用requestAnimationFrame
監(jiān)聽(tīng)?zhēng)兓菡冢沟迷谡_的時(shí)間進(jìn)行渲染
b) 增加響應(yīng)變化的時(shí)間間隔,減少重繪次數(shù)
GPU加速
CSS中以下屬性(CSS3 transitions垦江、CSS3 3D transforms帽馋、Opacity、Canvas比吭、WebGL绽族、Video
)來(lái)觸發(fā)GPU
渲染,請(qǐng)合理使用衩藤。
PS:過(guò)渡使用會(huì)引發(fā)手機(jī)過(guò)耗電增加吧慢。