「輸入URL到顯示頁面的過程」及「Web性能優(yōu)化」

我們這里要談及的「Web性能優(yōu)化」,是指在用戶輸入URL后烫止,到頁面顯示出來所花的時間較少奈泪,而不是什么CPU占用資源少(這是指服務(wù)器端的性能優(yōu)化)。既然知道了我們的目的黎侈,自然就要了解察署,我們從輸入URL到頁面顯示是一個怎樣的過程呢?然后在過程中逐一優(yōu)化峻汉。

  1. 緩存
    我們在瀏覽器輸入URL后贴汪,瀏覽器會先看是不是有緩存,如果已經(jīng)訪問過該網(wǎng)頁休吠,則會有緩存扳埂,可以很快顯示該網(wǎng)頁。緩存也分很多種瘤礁,后文會提及阳懂。
  1. DNS查詢
    我們在瀏覽器輸入URL訪問服務(wù)器,但是其實服務(wù)器要的不是這個URL蔚携,要的是「IP地址」希太,所以我們要把這個URL轉(zhuǎn)換為IP地址,這個時候就需要查詢DNS了酝蜒,DNS查詢就像一個電話簿誊辉。比如我們輸入的URL相當(dāng)于電話簿中的姓名(暫不考慮重名情況),這樣就會對應(yīng)一個電話號碼(這個相當(dāng)于IP地址)亡脑。

(1)瀏覽器緩存:首先會向瀏覽器的緩存中查找是否有訪問記錄


瀏覽器緩存機(jī)制.png

(2)操作系統(tǒng)緩存:在系統(tǒng)運行中的內(nèi)存里查找是否有緩存堕澄。
(3)host文件:如果在緩存中查找不到邀跃,系統(tǒng)就會讀取系統(tǒng)中預(yù)設(shè)的host文件。
(4)路由器緩存:有些路由器也有緩存功能蛙紫。
(5)ISP DNS緩存:互聯(lián)網(wǎng)服務(wù)提供商(比如中國電信)也會提供DNS服務(wù)拍屑,比較有名的是114.114.114.114
(6)頂級/根DNS服務(wù)器:根域名收到請求后,會判別這個域名是授予了哪個服務(wù)器坑傅,并且返回這個頂級DNS服務(wù)器的IP地址僵驰,客戶端收到這個地址后便會訪問這個頂級服務(wù)器,如果該服務(wù)器無法解析唁毒,該服務(wù)器就會返回它下一級的DNS服務(wù)器的IP蒜茴,客戶端再次訪問,直到找到輸入的URL對應(yīng)的主機(jī)浆西。

優(yōu)化方案:
(1)減少DNS查詢
每次DNS查詢就是查找域名的過程粉私,那么如果查找的域名越少,DNS查詢就越少近零,所以我們應(yīng)該盡量把資源放在同一域名下诺核。(其實這么做也有其他問題,見下文)

  1. TCP連接

主要內(nèi)容是:三次握手和四次揮手久信,此處不展開贅述窖杀。

優(yōu)化方案:TCP連接復(fù)用,在HTTP請求頭中的Connection加上keep-alive裙士;HTTP2.0是多路復(fù)用陈瘦。

  1. HTTP請求
    優(yōu)化方案:
    (1)減少Cookie體積。每個請求都會帶上Cookie潮售,所以Cookie小的話會加快速度痊项。
    (2)把靜態(tài)資源放到CDN上,靜態(tài)資源一般無需使用 Cookie酥诽,可以把它們放在使用二級域名或者專門域名的無 Cookie 服務(wù)器上鞍泉,降低 Cookie 傳送的造成的流量浪費,提高響應(yīng)速度肮帐。
    (3)使用Cache-Control咖驮。
    (4)同時發(fā)送多個請求。這一步是瀏覽器自身會做的训枢,一般瀏覽器訪問一個域名會同時發(fā)送4~8個請求(根據(jù)瀏覽器不同而有所差異)托修,為了同時發(fā)送多個請求,我們自然而然想到了增加域名數(shù)量(一般通過CDN)恒界。
    注意:這里出現(xiàn)了一個「矛盾」睦刃,在「DNS查詢」步驟中的優(yōu)化方案,我們明明是要減少域名數(shù)十酣,但是這里怎么要增加呢涩拙?這個時候就要做到「權(quán)衡」际长。如果我的文件很少(比如我html,css兴泥,js都只有一個)工育,那么就不如放在一個域名下面。

  2. 接受響應(yīng)

優(yōu)化方案:
(1)ETag
MD5搓彻,請求一個文件帶上ETag如绸,服務(wù)器發(fā)現(xiàn)是最新的文件不需要更新,則會響應(yīng)一個304 Not Modified的狀態(tài)碼旭贬,這樣接受響應(yīng)的體積就很小竭沫。
(2)使用Gzip壓縮(注:已經(jīng)是壓縮格式的文件就不需要Gzip壓縮了,如圖片)骑篙,接受的響應(yīng)都是Gzip壓縮的,只不過接收后瀏覽器都幫我們解壓了森书。

  1. 接受完成(HTML)

  2. DOCTYPE

優(yōu)化方案:「不要寫錯了靶端,也不要不寫」,不然瀏覽器會“猜”給的文檔是什么凛膏,可能一開始用HTML解析杨名,然后再用XML解析,這樣會浪費時間猖毫,還可能選擇錯誤的模式台谍。

  1. 逐行解析(普通標(biāo)簽,看到CSS吁断,看到JS)

(1)在我們看到普通標(biāo)簽的時候(比如<h1>)趁蕊,CSS或者JS會阻塞它的渲染嗎?(可以看看我的另一篇文章:http://www.reibang.com/p/a50fac65d698
(2)看到CSS的時候仔役。下載CSS掷伙,在看下面還有沒有CSS,有的話也同時下載又兵,一個域名一共可以同時下載4~8個(根據(jù)瀏覽器而不同)任柜,但是解析的時候按順序逐一解析的。簡單來說就是「下載并行沛厨,解析串行」宙地。
(3)看到JS的時候。

優(yōu)化方案:
(1)使用CDN(針對CSS和JS)逆皮,增加域名數(shù)宅粥,就增加請求數(shù)。
(2)CSS放到head中电谣,JS放到body最后粹胯。CSS放后面一樣會阻塞渲染蓖柔,還不如放前面今早下載,有了樣式的頁面結(jié)構(gòu)讓用戶先看到风纠,JS放后面可以獲取之前的節(jié)點况鸣。

除開以上的優(yōu)化方案,還有一些竹观。

  1. 懶加載
  2. 避免空的src的圖片镐捧,如果寫成「src=""」會造成不必要的請求,可以寫成「src="about:blank"」
  3. 開發(fā)聰明的事件處理臭增,比如「事件委托」懂酱。有時候頁面看起來沒那么快,可能是因為綁定到不同元素的大量事件處理函數(shù)執(zhí)行了太多次誊抛,使用事件委托就可以提高效率列牺。另外不必等到「onload」事件來開始處理DOM樹,可以使用「DOMContentLoaded」拗窃,因為大多數(shù)時候我們只是想要處理的元素已經(jīng)在DOM樹中瞎领,無需等待所有圖片被下載。

參考:

  1. http://www.alloyteam.com/2016/03/discussion-on-web-caching/
  2. https://segmentfault.com/a/1190000013522717
  3. https://segmentfault.com/a/1190000006879700
  4. https://zhuanlan.zhihu.com/p/53605323
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末随夸,一起剝皮案震驚了整個濱河市九默,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宾毒,老刑警劉巖驼修,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诈铛,居然都是意外死亡乙各,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門幢竹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觅丰,“玉大人,你說我怎么就攤上這事妨退「咎眩” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵咬荷,是天一觀的道長冠句。 經(jīng)常有香客問我,道長幸乒,這世上最難降的妖魔是什么懦底? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮罕扎,結(jié)果婚禮上聚唐,老公的妹妹穿的比我還像新娘丐重。我一直安慰自己,他們只是感情好杆查,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布扮惦。 她就那樣靜靜地躺著,像睡著了一般亲桦。 火紅的嫁衣襯著肌膚如雪崖蜜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天客峭,我揣著相機(jī)與錄音豫领,去河邊找鬼。 笑死舔琅,一個胖子當(dāng)著我的面吹牛等恐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播备蚓,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼课蔬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了星著?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤粗悯,失蹤者是張志新(化名)和其女友劉穎虚循,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體样傍,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡横缔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衫哥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茎刚。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撤逢,靈堂內(nèi)的尸體忽然破棺而出膛锭,到底是詐尸還是另有隱情,我是刑警寧澤蚊荣,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布初狰,位于F島的核電站,受9級特大地震影響互例,放射性物質(zhì)發(fā)生泄漏奢入。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一媳叨、第九天 我趴在偏房一處隱蔽的房頂上張望腥光。 院中可真熱鬧关顷,春花似錦、人聲如沸武福。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艘儒。三九已至聋伦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間界睁,已是汗流浹背觉增。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留翻斟,地道東北人逾礁。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像访惜,于是被迫代替她去往敵國和親嘹履。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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