前端性能優(yōu)化:客戶端從輸入到展示講解

性能優(yōu)化的根本目的:

==>要思考的是用戶使用網(wǎng)站的體驗(yàn)如何叫潦,而不是我們可以節(jié)省多少字節(jié)沧侥,只有準(zhǔn)確感知用戶的感受,我們才有必要談毫秒科乎、字節(jié)和請(qǐng)求數(shù)量等問(wèn)題。

針對(duì)優(yōu)化注意事項(xiàng):

==>1. 防止過(guò)早優(yōu)化:沒(méi)必要在剛開(kāi)始階段就對(duì)一個(gè)細(xì)節(jié)進(jìn)行放大型的優(yōu)化贼急,因?yàn)檫@樣的成本很高茅茂,除了代碼可讀性方面的東西,甚至還可能會(huì)引入更多的bug太抓,所以空闲,針對(duì)這個(gè)問(wèn)題,我們可以在上線和運(yùn)營(yíng)的時(shí)候進(jìn)行監(jiān)控走敌,當(dāng)快暴露到問(wèn)題的時(shí)候碴倾,進(jìn)行整體優(yōu)化。

==>2. 本末倒置的關(guān)注:網(wǎng)站內(nèi)容是最重要的,應(yīng)該查看頁(yè)面的每個(gè)部分跌榔,看是否滿足網(wǎng)站頁(yè)面的主要目的异雁,暫時(shí)不需要將額外的注意力全部放到一些不關(guān)乎本質(zhì)的東西上。

對(duì)于性能的分析:

==>1. 使用瀏覽器的性能分析工具矫户,得到性能分析圖表片迅,最著名的就是反向火焰圖表残邀,針對(duì)瀏覽器的加載和渲染一目了然皆辽。

==>2. 投入使用之前缺乏壓力測(cè)試和性能測(cè)試

性能優(yōu)化(從用戶輸入網(wǎng)址到客戶端展現(xiàn),一步一步優(yōu)化)

1. 輸入網(wǎng)址 ==> 告訴瀏覽器你要去哪里
2. 瀏覽器查找DNS ==> 網(wǎng)絡(luò)世界是IP地址的世界芥挣,DNS就是ip地址的別名驱闷。從本地DNS到最頂級(jí)DNS一步一步的網(wǎng)上爬,直到命中需要訪問(wèn)的IP地址
a. DNS預(yù)解析 使用CDN緩存空免,加快解析CDN尋找到目標(biāo)地址(dns-prefetch)

3. 客戶端和服務(wù)器建立連接 ==>建立TCP的安全通道空另,3次握手
a. CDN加速 使用內(nèi)容分發(fā)網(wǎng)絡(luò),讓用戶更快的獲取到所要內(nèi)容
b. 啟用壓縮 在http協(xié)議中蹋砚,使用類似Gzip壓縮的方案(對(duì)服務(wù)器資源不足的時(shí)候進(jìn)行權(quán)衡)
c. 使用HTTP/2協(xié)議 http2.0針對(duì)1.0優(yōu)化了很多東西扼菠,包括異步連接復(fù)用,頭壓縮等等坝咐,使傳輸更快

4. 瀏覽器發(fā)送http請(qǐng)求 ==> 默認(rèn)長(zhǎng)連接(復(fù)用一個(gè)tcp通道循榆,短連接:每次連接完就銷毀)
a. 減少http請(qǐng)求 每個(gè)請(qǐng)求從創(chuàng)建到銷毀都會(huì)消耗很多資源和時(shí)間,減少請(qǐng)求就可以相對(duì)來(lái)說(shuō)更快展示內(nèi)容
- 1). 壓縮合并js文件以及css文件
- 2). 針對(duì)圖片墨坚,可將圖片進(jìn)行合并然后下載秧饮,通過(guò)css Sprites切割展示(控制大小,太大的話反而適得其反)
b. 使用http緩存 緩存原則:越多越好泽篮,越久越好盗尸。讓客戶端發(fā)送更少請(qǐng)求,直接從本地獲取帽撑,加快性能泼各。
c. 減少cookie請(qǐng)求 針對(duì)非必要數(shù)據(jù)(靜態(tài)資源)請(qǐng)求,進(jìn)行跨域隔離亏拉,減少傳輸內(nèi)容大小扣蜻。
d. 預(yù)加載請(qǐng)求 針對(duì)一些業(yè)務(wù)中場(chǎng)景可預(yù)加載的內(nèi)容,提前加載专筷,在之后的用戶操作中更少的請(qǐng)求弱贼,更快的響應(yīng)
e. 選擇get和post 在http定義的時(shí)候,get本質(zhì)上就是獲取數(shù)據(jù)磷蛹,post是發(fā)送數(shù)據(jù)的吮旅。get可以在一個(gè)TCP報(bào)文完成請(qǐng)求,但是post先發(fā)header,再發(fā)送數(shù)據(jù)庇勃。so檬嘀,考慮好請(qǐng)求選型。
f. 緩存方案選型 遞進(jìn)式緩存更新(防止一次性丟失大量緩存责嚷,導(dǎo)致負(fù)載驟多)

5. 服務(wù)器響應(yīng)請(qǐng)求 ==> tomcat鸳兽、IIS等服務(wù)器通過(guò)本地映射文件關(guān)系找到地址或者通過(guò)數(shù)據(jù)庫(kù)查找到數(shù)據(jù),處理完成返回給瀏覽器
a. 后端框架選型
==> 更快的響應(yīng)罕拂,前端更快的操作揍异。
b. 數(shù)據(jù)庫(kù)選型和優(yōu)化 /

6. 瀏覽器接受響應(yīng) ==> 瀏覽器根據(jù)報(bào)文頭里面的數(shù)據(jù)進(jìn)行不同的響應(yīng)處理
a. 解耦第三方依賴 越多的第三方的不確定因素,會(huì)導(dǎo)致web的不穩(wěn)定性和不確定性
b. 避免404資源 請(qǐng)求資源不到浪費(fèi)了從請(qǐng)求到接受的所有資源

7. 瀏覽器渲染順序
==>a.HTML解析開(kāi)始構(gòu)建dom樹(shù)
b.外部腳本和樣式表加載完畢
- a). 盡快加載css爆班,首先將CSSOM對(duì)象渲染出來(lái)衷掷,然后進(jìn)行頁(yè)面渲染,否則導(dǎo)致頁(yè)面閃屏柿菩,用戶體驗(yàn)差
- b). css選擇器是從右往左解析的戚嗅,so類似#test a {color: #444},css解析器會(huì)查找所有a標(biāo)簽的祖先節(jié)點(diǎn),所以效率不是那么高
- c). 在css的媒介查詢中枢舶,最好不要直接和任何css規(guī)則直接相關(guān)懦胞。最好寫到link標(biāo)簽中,告訴瀏覽器凉泄,只有在這個(gè)媒介下躏尉,加載指定這個(gè)css
c.腳本在文檔內(nèi)解析并執(zhí)行
- a). 按需加載腳本,例如現(xiàn)在的webpack就可以打包和按需加載js腳本
- b). 將腳本標(biāo)記為異步旧困,不阻塞頁(yè)面渲染醇份,獲得最佳啟動(dòng),保證無(wú)關(guān)主要的腳本不會(huì)阻塞頁(yè)
- c). 慎重選型框架和類庫(kù)吼具,避免只是用類庫(kù)和框架的一個(gè)功能或者函數(shù)僚纷,而引用整個(gè)文件。
d.HTML DOM完全構(gòu)造起來(lái)
- a). DOM 的多個(gè)讀操作(或多個(gè)寫操作)拗盒,應(yīng)該放在一起怖竭。原則:統(tǒng)一讀、統(tǒng)一寫陡蝇。
e.圖片和外部?jī)?nèi)容加載
- a). 對(duì)多媒體內(nèi)容進(jìn)行適當(dāng)優(yōu)化痊臭,包括恰當(dāng)使用文件格式,文件處理登夫、漸進(jìn)式渲染等
= b). 避免空的src广匙,空的src仍然會(huì)發(fā)送請(qǐng)求到服務(wù)器
- c). 避免在html內(nèi)容中縮放圖片,如果你需要使用小圖恼策,則直接使用小圖
f.網(wǎng)頁(yè)完成加載
- a). 服務(wù)端渲染鸦致,特別針對(duì)首屏加載很重要的網(wǎng)站,可以考慮這個(gè)方案。后端渲染結(jié)束分唾,前端接管展示抗碰。
a)針對(duì)首屏展示優(yōu)化
- 1). 圖片懶加載 針對(duì)展示只加載第一屏,等用戶進(jìn)行滾動(dòng)的時(shí)候再進(jìn)行加載绽乔。如果用戶對(duì)下面內(nèi)容不感興趣弧蝇,那么節(jié)省的請(qǐng)求。
b)javascript優(yōu)化
- 1). 減少對(duì)dom節(jié)點(diǎn)的查詢折砸,因?yàn)槊看味紩?huì)重新去索引這個(gè)集合或者元素看疗。或者查詢一次緩存起來(lái)鞍爱,以待接下來(lái)使用
- 2). 進(jìn)行js操作DOM的時(shí)候鹃觉,考慮清楚頁(yè)面的重繪和重排专酗,因?yàn)檫@些操作相對(duì)來(lái)說(shuō)十分損耗性能的睹逃。
- 3). 避免使用eval和Function構(gòu)造,因?yàn)榻馕銎鲿?huì)將這些內(nèi)容先轉(zhuǎn)換成可執(zhí)行代碼祷肯,然后再進(jìn)行接下去的操作沉填。
- 4). 減少作用域鏈的查找,如果一個(gè)閉包函數(shù)使用到全局作用域的數(shù)據(jù)佑笋,那么每次局部作用域都會(huì)一層一層爬到最高作用域取得數(shù)據(jù)翼闹。
- 5). 數(shù)據(jù)訪問(wèn),對(duì)非引用類型數(shù)據(jù)訪問(wèn)和局部變量的訪問(wèn)是最快的蒋纬。所以如果對(duì)引用類型的成員(對(duì)象的屬性或者數(shù)組的成員)訪問(wèn)超過(guò)一次猎荠,則緩存
- 6). 將前端可能會(huì)使用的一些算法函數(shù)寫的更優(yōu)化,在時(shí)間和空間復(fù)雜度上尋找到一個(gè)最優(yōu)方案蜀备。
- 7). 去除重復(fù)加載同一模塊腳本
- 8). 智能事件處理关摇,比如在一個(gè)div下有10個(gè)按鈕,可以在冒泡過(guò)程中捕獲這個(gè)事件源碾阁,然后注冊(cè)
c) css優(yōu)化
-1). 刪除無(wú)用規(guī)則
- 2). 內(nèi)聯(lián)關(guān)鍵CSS
- 3). 避免@imports和Base64
- 4). 啟用高性價(jià)比屬性(如opacity over rgba())
- 5). 避免重復(fù)性工作
- 6). 不要一條條地改變樣式输虱,而要通過(guò)改變class,或者csstext屬性脂凶,一次性地改變樣式宪睹。
- 7). 可將元素設(shè)為display: none(需要1次重排和重繪),然后N次操作蚕钦,最后恢復(fù)顯示
-8). position屬性為absolute或fixed的元素亭病,重排的開(kāi)銷會(huì)比較小,因?yàn)椴挥每紤]它對(duì)其他元素的影響嘶居。
d) 圖片優(yōu)化(網(wǎng)絡(luò)請(qǐng)求中80%都是靜態(tài)資源的請(qǐng)求)
- 1). 圖片正確格式的選擇
- 2). 圖片尺寸的選擇罪帖,在低分辨率等狀況下考慮降級(jí)處理(考慮響應(yīng)式圖片)
- 3). 使用正確的工具進(jìn)行優(yōu)化(有損壓縮、無(wú)損壓縮)
- 4). 能用css處理和代理的,優(yōu)先考慮css實(shí)現(xiàn)(陰影胸蛛,濾鏡等)
-5). 正確使用data url污茵,比如說(shuō)多地使用的地方,不建議data url葬项,可考慮緩存
- 6). 考慮圖片的懶加載和元素可見(jiàn)加載方案
- 7). 圖片的預(yù)加載泞当,在正確的合理的設(shè)計(jì)節(jié)點(diǎn)進(jìn)行圖片的預(yù)加載
所有性能優(yōu)化總結(jié)為三個(gè)層面優(yōu)化:物理層面的優(yōu)化,設(shè)計(jì)層面的優(yōu)化民珍,代碼層面的優(yōu)化

:設(shè)計(jì)層優(yōu)化最主要的核心:衡量如何花費(fèi)最少代價(jià)實(shí)現(xiàn)頁(yè)面功能

:HTTP/2(超文本傳輸協(xié)議第2版襟士,最初命名為HTTP 2.0):
是HTTP協(xié)議的的第二個(gè)主要版本,HTTP/2的目標(biāo)包括異步連接復(fù)用嚷量,頭壓縮和請(qǐng)求反饋管線化并保留與HTTP 1.1的完全語(yǔ)義兼容陋桂。Google Chrome、Mozilla Firefox蝶溶、Microsoft Edge和Opera已支持HTTP/2嗜历,并默認(rèn)啟用。Internet Explorer自IE 11開(kāi)始支持HTTP/2抖所,但僅限于Windows 10 Beta梨州,并默認(rèn)情況激活。

學(xué)習(xí)前端的同學(xué)注意了L镌1┙场!
學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話傻粘,歡迎加入前端學(xué)習(xí)交流群461593224每窖,我們一起學(xué)前端!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弦悉,一起剝皮案震驚了整個(gè)濱河市窒典,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌警绩,老刑警劉巖崇败,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肩祥,居然都是意外死亡后室,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門混狠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岸霹,“玉大人,你說(shuō)我怎么就攤上這事将饺」北埽” “怎么了痛黎?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)刮吧。 經(jīng)常有香客問(wèn)我湖饱,道長(zhǎng),這世上最難降的妖魔是什么杀捻? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任井厌,我火速辦了婚禮,結(jié)果婚禮上致讥,老公的妹妹穿的比我還像新娘仅仆。我一直安慰自己,他們只是感情好垢袱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布墓拜。 她就那樣靜靜地躺著,像睡著了一般请契。 火紅的嫁衣襯著肌膚如雪咳榜。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天姚糊,我揣著相機(jī)與錄音贿衍,去河邊找鬼。 笑死救恨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的释树。 我是一名探鬼主播肠槽,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奢啥!你這毒婦竟也來(lái)了秸仙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤桩盲,失蹤者是張志新(化名)和其女友劉穎寂纪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赌结,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捞蛋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柬姚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟杉。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖量承,靈堂內(nèi)的尸體忽然破棺而出搬设,到底是詐尸還是另有隱情穴店,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布拿穴,位于F島的核電站泣洞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏默色。R本人自食惡果不足惜斜棚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望该窗。 院中可真熱鬧弟蚀,春花似錦、人聲如沸酗失。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)规肴。三九已至捶闸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拖刃,已是汗流浹背删壮。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兑牡,地道東北人央碟。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像均函,于是被迫代替她去往敵國(guó)和親亿虽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案苞也? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • Yahoo!的Exceptional Performance團(tuán)隊(duì)為改善Web性能帶來(lái)最佳實(shí)踐洛勉。他們?yōu)榇诉M(jìn)行了一系列...
    拉風(fēng)的老衲閱讀 1,834評(píng)論 0 1
  • 0. 前言 前面有被用戶投訴 APP 流量消耗厲害: 于是乎考慮了流量方面的問(wèn)題。暫時(shí) APP 中涉及流量的幾個(gè)方...
    zyl06閱讀 23,923評(píng)論 5 62
  • 寫一段常用sql語(yǔ)句存儲(chǔ)起來(lái)相當(dāng)于多表的查詢連接->形成的“新表”但視圖不占存儲(chǔ)空間如迟,不存儲(chǔ)數(shù)據(jù) 新建視圖Teac...
    Lulus閱讀 221評(píng)論 0 0