web 端渲染優(yōu)化指北

web 端渲染優(yōu)化指北

前言

web端近年來發(fā)展十分迅速,網(wǎng)頁在 native app 中的占比也不斷增加褒搔,但H5應(yīng)用的渲染方式阶牍,刷新方式與 native 應(yīng)用有很大的區(qū)別。帶來的問題是用戶會(huì)感覺刷新慢星瘾,易卡頓走孽,體驗(yàn)差,本篇博文主要針對(duì)渲染速度問題進(jìn)行優(yōu)化~

渲染原理

渲染原理圖

從上圖可知web界面的渲染原理死相,這樣我們就可以針對(duì)此進(jìn)行優(yōu)化了融求,先強(qiáng)調(diào)一下html的加載原理,我們常說的”加載是并行的算撮,執(zhí)行是串行的“的結(jié)果生宛。html開始加載的時(shí)候,瀏覽器會(huì)將頁面外聯(lián)的css文件和js文件并行加載肮柜,如果一個(gè)文件還沒回來陷舅,它后面的代碼是不會(huì)執(zhí)行的。

優(yōu)化渲染速度

大概從如下幾個(gè)方面進(jìn)行優(yōu)化:

  1. 采用SPA開發(fā)模式
  2. 采用 Virtual DOM 進(jìn)行界面更新優(yōu)化
  3. 服務(wù)端渲染
  4. 首屏渲染速度優(yōu)化
  5. 代碼自動(dòng)化優(yōu)化審查
  6. 懶加載
  7. 預(yù)加載
  8. 資源壓縮
  9. 開發(fā)規(guī)范

SPA開發(fā)模式

由于傳統(tǒng)多頁模式開發(fā)审洞,界面切換造成了頻繁的網(wǎng)絡(luò)請(qǐng)求莱睁,導(dǎo)致界面渲染效率十分低下待讳,來自Alexander Aghassipour和Shajith Chacko發(fā)表的這篇文章講述了單頁應(yīng)用程序是如何創(chuàng)建而來的。
單頁面應(yīng)用是指用戶通過瀏覽器加載獨(dú)立的HTML頁面并且無需離開此導(dǎo)航頁面仰剿,這也是其獨(dú)特的優(yōu)勢所在创淡。對(duì)用戶操作來說,一旦加載和執(zhí)行單個(gè)頁面應(yīng)用程序通常會(huì)有更多的響應(yīng)南吮,這就需要返回到后端Web服務(wù)器琳彩,而單頁面應(yīng)用為用戶提供了更接近一個(gè)本地移動(dòng)或桌面應(yīng)用程序的體驗(yàn)。

單頁Web應(yīng)用程序的優(yōu)點(diǎn):

首先部凑,最大的好處是用戶體驗(yàn)露乏,對(duì)于內(nèi)容的改動(dòng)不需要加載整個(gè)頁面。這樣做好處頗多涂邀,因?yàn)閿?shù)據(jù)層和UI的分離瘟仿,可以重新編寫一個(gè)原生的移動(dòng)設(shè)備應(yīng)用程序而不用(對(duì)原有數(shù)據(jù)服務(wù)部分)大動(dòng)干戈。
單頁面Web應(yīng)用層程序最根本的優(yōu)點(diǎn)是高效比勉。它對(duì)服務(wù)器壓力很小劳较,消耗更少的帶寬,能夠與面向服務(wù)的架構(gòu)更好地結(jié)合浩聋。

單頁Web應(yīng)用程序的缺點(diǎn):

雖然還有一些歷史遺留問題(大部分是針對(duì)HTML5的改進(jìn))以及SEO兴想。如果你看中SEO,那就不應(yīng)該在頁面上使用JavaScript赡勘,你應(yīng)該使用網(wǎng)站而不是Web應(yīng)用。目前該技術(shù)還存在一些爭議捞镰,但這并不是重點(diǎn)闸与,因?yàn)檫@種類型的體系架構(gòu)為SAAS Web Apps提供了一個(gè)極大的可用性。

單頁Web應(yīng)用程序的結(jié)構(gòu)很簡單:首先傳遞HTML文檔框架岸售;然后使用JavaScript修改頁面践樱;緊接著再從服務(wù)器傳遞更多數(shù)據(jù)然后再修改頁面,如此循環(huán)凸丸。從性能的角度看拷邢,在現(xiàn)代瀏覽器中單頁面Web App已經(jīng)能夠和普通應(yīng)用程序相媲美,而且?guī)缀跛械牟僮飨到y(tǒng)都支持現(xiàn)代的瀏覽器屎慢。使用HTML+CSS+Javascript編寫應(yīng)用程序瞭稼,能使更多的人們都加入到程序開發(fā)的行列。

在單頁開發(fā)框架中腻惠,我建議使用vue 2环肘,下圖是一些關(guān)于界面渲染相關(guān)的數(shù)據(jù)對(duì)比:

Type Vue 2(單位/s) React 15(單位/s) Angular 2(單位/s)
create rows Duration for creating 1000 rows after the page loaded. 171.36 227.44 198.06
replace all rows Duration for updating all 1000 rows of the table (with 5 warmup iterations) 68.76 211.71 178.45
remove row Duration to remove a row. (with 5 warmup iterations). 64.11 49.42 19.14
partial update Time to update the text of every 10th row (with 5 warmup iterations) 22.17 14.77 11.42
ready memory Memory usage after page load 3.43 4.64 15.45

Virtual DOM

首先強(qiáng)調(diào)一下,Virtual DOM 并沒有提升首屏渲染速度集灌,而且它還延長了首屏渲染速度悔雹,但是 Virtual DOM 提升的是視圖局部更新的速度,能夠依靠映射關(guān)系快速查找到真正的 dom 節(jié)點(diǎn)。

在Virtual DOM方案中腌零,更新瀏覽器的DOM分三個(gè)步驟:

  1. 只要數(shù)據(jù)發(fā)生改變梯找,就會(huì)重新生成一個(gè)完整的Virtual DOM
  2. 重新計(jì)算比較出新的和之前的Virtual DOM的差異
  3. 更新真實(shí)DOM中真正發(fā)生改變的部分,就像是給DOM打了個(gè)補(bǔ)丁

服務(wù)端渲染

稍后補(bǔ)全~

首屏渲染速度優(yōu)化

做移動(dòng)web頁面益涧,受移動(dòng)網(wǎng)絡(luò)網(wǎng)速和終端性能影響锈锤,我們經(jīng)常要關(guān)注首屏內(nèi)容展示時(shí)間(以下簡稱首屏?xí)r間)這個(gè)指標(biāo),它衡量著我們的頁面是否能在用戶耐心消磨完之前展示出來饰躲,很大程度影響著用戶的使用滿意度牙咏。

方案:

  1. 三秒種渲染完成首屏指標(biāo)
  2. 首屏加載3秒完成或使用Loading
  3. 基于聯(lián)通3G網(wǎng)絡(luò)平均338KB/s(2.71Mb/s),所以首屏資源不應(yīng)超過1014KB
  4. 所有影響首屏加載和渲染的代碼應(yīng)在處理邏輯中后置

按需加載

將不影響首屏的資源和當(dāng)前屏幕資源不用的資源放到用戶需要時(shí)才加載嘹裂,可以大大提升重要資源的顯示速度和降低總體流量
PS:按需加載會(huì)導(dǎo)致大量重繪妄壶,影響渲染性能

  1. LazyLoad
  2. 滾屏加載
  3. 通過Media Query加載

預(yù)加載

大型重資源頁面(如游戲)可使用增加Loading的方法,資源加載完成后再顯示頁面寄狼。但Loading時(shí)間過長丁寄,會(huì)造成用戶流失
對(duì)用戶行為分析,可以在當(dāng)前頁加載下一頁資源泊愧,提升速度

  1. 可感知Loading(如進(jìn)入空間游戲的Loading)
  2. 不可感知的Loading(如提前加載下一頁)

資源壓縮

減少資源大小可以加快網(wǎng)頁顯示速度伊磺,所以要對(duì)HTML、CSS删咱、JavaScript等進(jìn)行代碼壓縮屑埋,并在服務(wù)器端設(shè)置GZip

  1. 壓縮(例如,多余的空格痰滋、換行符和縮進(jìn))
  2. 啟用GZip
  3. 控制圖片質(zhì)量(使用 tinypng 進(jìn)行壓縮)

開發(fā)建議

html注意事項(xiàng)

加載是并行的:

  1. 別再把 JsEndTime – JsStartTime 的結(jié)果成為js文件的加載執(zhí)行時(shí)間(除非你沒有外聯(lián)css文件)摘能,不然會(huì)被內(nèi)行人取笑滴;
  2. css文件的阻塞會(huì)影響后面js代碼的執(zhí)行敲街,自然也包括html代碼的執(zhí)行团搞,即是說此時(shí)你的頁面就是空白的。所以css文件盡量內(nèi)聯(lián)多艇,你可以讓構(gòu)建工具幫你忙逻恐;

執(zhí)行是串行的:

  1. 無關(guān)緊要”的js不要放在負(fù)責(zé)渲染的js前面,這里的“無關(guān)緊要”是指和首屏渲染無關(guān)峻黍,如數(shù)據(jù)上報(bào)組件复隆。我們可以選擇將要上報(bào)的數(shù)據(jù)臨時(shí)存起來,先繼續(xù)執(zhí)行渲染的js奸披,等負(fù)責(zé)渲染的js執(zhí)行完再加載上報(bào)組件再上報(bào)昏名。甚至連zepto之類的庫我們也可以放后面,把渲染相關(guān)的代碼抽離出來并用原生js書寫阵面,放到最前面
  2. 可以看到轻局,動(dòng)態(tài)加載的js的執(zhí)行是不會(huì)受到html后面外聯(lián)的js的阻塞的影響洪鸭,即是說,它的執(zhí)行和后面js的執(zhí)行順序是不確定的仑扑。因此我們要小心處理好文件的依賴關(guān)系览爵。當(dāng)然還可以采用最不容易出錯(cuò)的方法:負(fù)責(zé)動(dòng)態(tài)加載js的文件是html里面外聯(lián)的最后一個(gè)文件

html使用Viewport

Viewport可以加速頁面的渲染,請(qǐng)使用以下代碼

<meta name="viewport" content="width=device-width, initial-scale=1">

減少Dom節(jié)點(diǎn)

Dom節(jié)點(diǎn)太多影響頁面的渲染镇饮,應(yīng)盡量減少Dom節(jié)點(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è)),所以要盡量減少頁面的請(qǐng)求數(shù)储藐,首次加載同時(shí)請(qǐng)求數(shù)不能超過4個(gè)

  1. 合并CSS俱济、JavaScript
  2. 合并小圖片,使用雪碧圖

無阻塞

寫在HTML頭部的JavaScript(無異步)钙勃,和寫在HTML標(biāo)簽中的Style會(huì)阻塞頁面的渲染蛛碌,因此CSS放在頁面頭部并使用Link方式引入,避免在HTML標(biāo)簽中寫Style辖源,JavaScript放在頁面尾部或使用異步方式加載

減少Cookie

Cookie會(huì)影響加載速度蔚携,所以靜態(tài)資源域名不使用Cookie

避免重定向

重定向會(huì)影響加載速度,所以在服務(wù)器正確設(shè)置避免重定向

異步加載第三方資源

第三方資源不可控會(huì)影響頁面的加載和顯示克饶,因此要異步加載第三方資源

腳本執(zhí)行優(yōu)化

  1. CSS寫在頭部酝蜒,JavaScript寫在尾部或異步
  2. 避免圖片和iFrame等的空Src(空Src會(huì)重新加載當(dāng)前頁面,影響速度和效率)
  3. 盡量避免重設(shè)圖片大蟹取(重設(shè)圖片大小是指在頁面亡脑、CSS、JavaScript等中多次重置圖片大小邀跃,多次重設(shè)圖片大小會(huì)引發(fā)圖片的多次重繪远豺,影響性能)
  4. 圖片盡量避免使用DataURL(DataURL圖片沒有使用圖片的壓縮算法文件會(huì)變大,并且要解碼后再渲染坞嘀,加載慢耗時(shí)長)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惊来,隨后出現(xiàn)的幾起案子丽涩,更是在濱河造成了極大的恐慌,老刑警劉巖裁蚁,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢渊,死亡現(xiàn)場離奇詭異,居然都是意外死亡枉证,警方通過查閱死者的電腦和手機(jī)矮男,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來室谚,“玉大人毡鉴,你說我怎么就攤上這事崔泵。” “怎么了猪瞬?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵憎瘸,是天一觀的道長。 經(jīng)常有香客問我陈瘦,道長幌甘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任痊项,我火速辦了婚禮锅风,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鞍泉。我一直安慰自己皱埠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布塞弊。 她就那樣靜靜地躺著漱逸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪游沿。 梳的紋絲不亂的頭發(fā)上饰抒,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音诀黍,去河邊找鬼袋坑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛眯勾,可吹牛的內(nèi)容都是我干的枣宫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吃环,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼也颤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起郁轻,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤翅娶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后好唯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竭沫,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年骑篙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜕提。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靶端,死狀恐怖谎势,靈堂內(nèi)的尸體忽然破棺而出凛膏,到底是詐尸還是另有隱情,我是刑警寧澤它浅,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布译柏,位于F島的核電站,受9級(jí)特大地震影響姐霍,放射性物質(zhì)發(fā)生泄漏鄙麦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一镊折、第九天 我趴在偏房一處隱蔽的房頂上張望胯府。 院中可真熱鬧,春花似錦恨胚、人聲如沸骂因。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寒波。三九已至,卻和暖如春升熊,著一層夾襖步出監(jiān)牢的瞬間俄烁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工级野, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留页屠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓蓖柔,卻偏偏與公主長得像辰企,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子况鸣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案牢贸? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,115評(píng)論 25 707
  • 前言 前端的工作并不僅僅是實(shí)現(xiàn)「視覺&交互稿」,想要開發(fā)一個(gè)高性能易維護(hù)的「完美」站點(diǎn)并未易事镐捧,針對(duì)前端的性能優(yōu)化...
    木羽zwwill閱讀 636評(píng)論 0 4
  • 2017年7月7日 小暑 一候溫風(fēng)至 二候蟋蟀居宇 三候鷹始鷙 小暑時(shí)節(jié)大地上便不再有一絲涼風(fēng)十减,而是所有的風(fēng)中都帶...
    懂心_貼博士臍貼閱讀 944評(píng)論 0 0
  • 突如其來去很久不用的郵箱找重要的照片, 信息爆炸時(shí)代愤估,個(gè)人的隱私難留, 郵箱被莫名的網(wǎng)站發(fā)來的文字速址,堆的滿滿玩焰。 一...
    桉來閱讀 271評(píng)論 0 1