瀏覽器輸入 URL 到頁面呈現(xiàn)及其優(yōu)化

輸入 url: 瀏覽器先檢查緩存,然后解析本地-路由器-全網(wǎng) dns,指向服務(wù)器 ip

  • 強(qiáng)緩存 request Cache-Control
    1.max-age=0,只 if-none-match 協(xié)商 etag 的 hash
    2.no-cache, 都不緩存
  • 強(qiáng)緩存 response Cache-Control
    1.max-age=0, no-cache, 只 etag 對 if-none-match 協(xié)商 hash
    2.no-store 都不緩存 隱私
  • DNS 緩存
    1.瀏覽器緩存的 dns
    2.本機(jī) host 文件的映射
    3.路由器的映射
    4.網(wǎng)絡(luò)服務(wù)商的映射 (本地DNS服務(wù)器為止)
    5.root 域名服務(wù)器
    6.頂級域名-主域名服務(wù)器-結(jié)果緩存在本地DNS服務(wù)器
  • 默認(rèn)訪問 http 重定向到 https
    HSTS 策略: response headers: Strict-Transport-Security: max-age=31536000 把所有請求都訪問為 https,首次訪問不知道配置可以注冊在公網(wǎng)上。

請求遠(yuǎn)程服務(wù)器: 建立 TLS 連接2次RTT, TCP 三次握手RTT,nginx 轉(zhuǎn)發(fā)到對應(yīng)的資源上,服務(wù)器檢查緩存

  • 優(yōu)化 TLS 2次 RTT, 瀏覽器緩存對稱密鑰
    1.client 發(fā)送 k1 和加密方案列表
    2.server 發(fā)送 k2、證書、公鑰、確定的加密方案
    3.client 驗(yàn)證證書、公鑰加密 k3 發(fā)送
    4.server 密鑰解 k3
    5.client server 使用 k1 k2 k3 對稱加密通信
ssl_session_tickets on;
ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;
  • 優(yōu)化 TCP 三次握手 RTT
    1. request header:connection: keep-alive
    2. 重用 TCP 連接
  • 管線化 http 1.1
    1. keep-alive 基礎(chǔ)上
    2. 請求一次發(fā)出
    3. 響應(yīng)按順序 還是有阻塞可能
  • 管線化和多路復(fù)用區(qū)別
    1. 管線化在 keep-alive 基礎(chǔ)上復(fù)用 TCP 3次握手
    2. 管線化一次發(fā)送多個(gè)請求返回仍是一個(gè)個(gè)的順序不變
    3. 多路復(fù)用是 http2 多個(gè)請求響應(yīng)都是并行

服務(wù)器斷開連接的四次揮手

  • 客戶端請求斷開連接
  • 服務(wù)端確認(rèn)斷開請求
  • 服務(wù)端發(fā)送完畢剩下的數(shù)據(jù) close
  • 客戶端close 回復(fù)

瀏覽器檢查狀態(tài)碼,304 協(xié)商緩存,301,302 重定向

  • 304 req:if-none-match, res:etag 協(xié)商 hash
  • 301 永久重定向會瀏覽器緩存
  • 302 臨時(shí)重定向?yàn)g覽器不緩存

解析返回內(nèi)容,重排重繪

  • 頁面生成過程
  1. html 解析成 dom 樹
  2. css 解析成 cssom
  3. 結(jié)合 dom 樹和 cssom 生成 render tree
  4. 進(jìn)行布局 flow 將 渲染樹的 節(jié)點(diǎn)進(jìn)行合成
  5. 進(jìn)行繪制 paint 至屏幕上
  • 文檔解析過程的事件觸發(fā)
    1 開始解析 html 文檔
    觸發(fā) readystatechange: load
    2 DOMContentLoaded 事件,原始 html 解析
    不包含樣式資源加載, 同時(shí)觸發(fā) readystatechange: interactive
    3 load 事件,資源加載完畢
    樣式資源加載完畢后才觸發(fā), 同時(shí)觸發(fā) readystatechange: complete
  • defer async 資源的script 都不阻塞,
    普通 script 下載阻塞再執(zhí)行阻塞
    defer 先下載 html 解析完后執(zhí)行,沒什么阻塞
    async 下載好后直接執(zhí)行,阻塞執(zhí)行階段
  • 重排
    1.dom 的增刪改查
    2.瀏覽器窗口的變化滾動
    3.用戶的輸入
    4.dom的形狀大小動畫
    5.重排必定發(fā)生重繪
    6.影響范圍大,最好固定 dom 容器大小不影響到其他 dom

  • 重繪
    1.dom 的顏色背景
    2.dom border 樣式 如圓角內(nèi)陷
    3.每次重繪前執(zhí)行 requestAnimationFrame

重排重繪優(yōu)化

  • 目標(biāo) dom 父容器固定大小,重排不會影響其他 dom
// 改變 p 里的 dom 也會影響 h5 和 h4,固定 p 的大小
<body>
  <div class="hello">
    <h4>h4</h4>
    <p><strong>Name:</strong>BDing</p>
    <h5>h5</h5>
  </div>
</body>
  • 讀寫操作分離
// 只發(fā)生一次重繪重排, 讀取操作在寫入操作完成后才進(jìn)行, 有的瀏覽器低下仍會進(jìn)行4次
div.style.left = '10px';
div.style.top = '10px';
div.style.width = '20px';
div.style.height = '20px';
console.log(div.offsetLeft);
console.log(div.offsetTop);
console.log(div.offsetWidth);
console.log(div.offsetHeight);
  • 樣式集中改變
// 使用添加 className 和 cssText 的方式一次操作
el.className += " otherclass"
el.style.cssText += "; left: " + left + "px; top: " + top + "px;";
  • 緩存布局信息
// bad 同時(shí)又讀寫操作 強(qiáng)制刷新 觸發(fā)兩次重排
div.style.left = div.offsetLeft + 1 + 'px';
div.style.top = div.offsetTop + 1 + 'px';
// good 緩存布局信息 讀寫分離
var curLeft = div.offsetLeft;
var curTop = div.offsetTop;
div.style.left = curLeft + 1 + 'px';
div.style.top = curTop + 1 + 'px';
  • dom 離線更改
dom.display = 'none'
// 修改dom樣式
dom.display = 'block'
----
const fragment = document.createDocumentFragment();
// DocumentFragment 上批量操作 dom
list.appendChild(fragment);
----
復(fù)制 dom,操作完后替換掉原 dom
var p = document.getElementById("para1"),
var p_prime = p.cloneNode(true);
  • 絕對定位 固定定位
    position屬性為absolute或fixed 的dom 重排消耗小

  • 優(yōu)化動畫
    動畫移動 1px 增加為 3px 減少 重排
    啟動 GPU 操作

  • react 調(diào)度優(yōu)化 調(diào)度模塊原理 - 實(shí)現(xiàn) requestIdleCallback ?

    1. 重繪的一幀 16.67,性能低是 33.33
    2. rAF 計(jì)算出當(dāng)前幀開始時(shí)間和下一幀開始時(shí)間
    3. 把 react 更新任務(wù)推入 addEventLisnter 隊(duì)列中
    4. 每一幀更新順序:隊(duì)列 react 任務(wù) -> UI 渲染動畫 -> idle 回調(diào)
    5. 每一次循環(huán)隊(duì)列開始根據(jù) react 任務(wù)過期時(shí)間判斷是否過期,過期了執(zhí)行 react 更新,再執(zhí)行 UI 操作

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容