url輸入之後發生了什麼以及優化點 一,url解析以及緩存 二,DNS解析 三,減少HTTP請求和請求資源大小 四,發送http請求之後應用緩存(把內容緩存起來,他不香嗎) 七,瀏覽器渲染

\color{red}{問題:}

  • 已經建立連接了,但是服務器崩潰了,怎麼辦?
  • HSTS
  • 緩存校驗
  • DNS解析(20ms到120ms)

\color{red}{url輸入之後流程:}

一,url解析以及緩存

二,DNS解析


1,首先本地解析,沒有的話再去別的地方找(遞歸過程--深度搜索)



2,去DNS服務器上找(迭代過程--廣度搜索),2,3,4,5,6,7步驟,最後到權威域名服務器找,20-120ms
優化點:
1,減少DNS請求次數,儘量不用請求太多不同服務器資源。但是爲了做負載均衡,服務器分離部署,需要儘量多的請求不同服務器資源,所以這個很難做到。
2,DNS預解析,這個是異步處理,節省時間,針對的是頁面的圖片等資源
<link rel="dns-prefetch" href="//g.alicdn.com">

三,減少HTTP請求和請求資源大小

優化點:
1,資源合併壓縮
2,字體圖標
3,base64(小圖片)
4,GZIP
5,圖片懶加載(骨架屏技術)
6,數據延遲分批加載(第一次只加載首頁)
7,CDN資源(地域式分佈,請求離自己最近的服務器)
8,雪碧圖(基本淘汰)

四,發送http請求之後應用緩存(把內容緩存起來,他不香嗎)

緩存位置:

1,Service Worker:瀏覽器獨立線程進行緩存(基本不用)
2,Memory Cache:內存緩存(小而快,瀏覽器操作)
3,Disk Cache:硬盤緩存(大而慢,瀏覽器操作)
4,Push Cache:推送緩存(HTTP2中,基本不用)

緩存流程:

  • 初次加載url:查找disk cache,有的話直接拿,沒有的話從服務器請求,服務器返回緩存規則
  • 刷新頁面(f5):memory cache,然後再disk cache
  • 強制刷新(ctrl+f5):瀏覽器不使用緩存,發送的頭部帶有cache-control:no-cache(爲了兼容,也會有pragma:no-cache),服務器直接返回200和最新內容

4.1,強緩存(Expires/Cache-Control)

瀏覽器對於強緩存的處理:根據第一次請求資源時服務器返回的相應頭來確定


緩存規則:

  • Expries:緩存過期時間,用來指定資源到期時間(http1,過時了,現在用http1.1)
  • Cache-Control: Cache-Control:max-age=2592000,也就是30天,再次發請求,讀取緩存中的信息(http1.1),具體是在memory cache中還是disk cache中讀取,由瀏覽器規定
    規則(兩者同時寫時,Cache-Control優先級更高):



    問題:服務器在30天內更新資源,客戶端無法同步更新。
    解決:webpack打包之後,文件名會添加hash值,當成新的資源請求服務器(也就是沒有緩存)

4.2,協商緩存

強緩存失效(過期)後,瀏覽器攜帶緩存標識向服務器發起請求,由服務器根據緩存標識決定是否使用緩存的過程。
資源未更新,返回304過程:



資源更新,返回200的過程:


Last-Modified和If-Modified-Since:

  • 初次訪問,服務器返回資源,響應頭中設置了Last-Modified(上次修改時間),緩存文件和響應頭
  • 再次訪問,瀏覽器檢測到有Last-Modified,於是設置If-Modified-Since=Last-Modified,並將If-Modified-Since添加到請求頭。
  • 服務器收到請求,將If-Modified-Since與服務器的Last-Modified相同,則返回304和空的響應體,瀏覽器直接從緩存中讀取;如果If-Modified-Since小於服務器的Last-Modified,則說明服務器資源有更新,則返回新的資源文件和200.
    注意:Last-Modified是秒級,如果在不可感知的時間內修改文件,則服務器會以爲沒有修改

ETag和If-None-Match:

服務器資源改變時,ETag就會改變,用法和上面一樣

七,瀏覽器渲染

構建DOM樹,CSS樹,Render樹

7.1,DOM樹

初始字節碼-通過utf-8轉換:Bytes:3c 62 6f ......


(1)轉換 字符集

Characters:<html><head></head><body><p></p></body></html>


(2)令牌

Tokens: StartTag:html StartTag:head EndTag:head StartTag:body EndTag:body ...


(3)詞法分析

Nodes:html body p span ...


(4)DOM構建

優化點:
1,標籤語義化
2,避免多級嵌套(儘量4級以下)

7.2,CSSDOM樹,link,@import

流程和DOM一樣


優化點:
(1)css選擇器是從右到左,比如 .div a 是先找所有的a,然後再找.div,因此選擇器層級不要太多

7.3,RENDER樹

計算在視口的位置和大小,也就是迴流(因元素位置,大小變化導致的重新佈局)
根據渲染樹和迴流得到的幾何信息,進行繪製(寬高,大小,顏色)
重繪不一定會流,但是會流一定重繪

優化點:
1,減少操作dom(react之類框架很少需要):
(1)動畫效果放在absolute上面
(2)css3硬件加速(GPU加速),但是可能消耗過多性能,佔用內存,導致字體模糊等
(3)犧牲平滑度換取速度,也就是動畫時不以1px爲基準,而以3px以上,看上去略有不流暢,但可以減少因cpu打滿而產生的卡頓
(4)讀寫分離
2,link是發送http請求,每個http請求都是單獨線程處理,chorme可以允許6-7個http請求
(1)@import是同步的,會導致阻塞,因此要減少使用
(2)問:react項目中使用@import,打包之後是什麼情況?
優化點:
1,style不需要發請求,速度比link快,如果內容不多的話
2,減少@import
3,link寫在頭部,和html併發請求

7.4,JS加載

優化點
1,js也是阻塞的,需要放到底部



藍色加載,紅色渲染
async是誰先加載完成,誰先渲染,不分先後順序,不依賴其他js文件,不產生衝突的common.js可以使用。(淘寶基本都用的async,和我想的有點不一樣...)
defer會有設置依賴,有順序,一般使用defer。(webpack打包也可以加上)

參考資源:去b站看了下,視頻涼了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章