前端性能優化總結

這里寫目錄標題

  • 頁面性能測試工具
    • 測試指標
  • 前端頁面性能常見的問題
  • 前端頁面性能優化常見策略及方案
    • dns優化------預解析域名(異步進行)
    • http請求優化
      • 減少請求次數
      • 同時多開持久連接
  • 前面面試
    • url從輸入到確認搜索發生了什么
    • js介紹new一個對象的過程,示例代碼如下:
    • 介紹一下this
      • 默認綁定
      • 隱式綁定
      • 顯式綁定
    • 介紹一下promise
    • class繼承的原理
    • diff算法
    • 事件循環
      • 舊說法先執行微任務
      • W3c新規范任務隊列做了細分
      • 調用棧(Call Stack)
      • 事件隊列 (Task Queue)

頁面性能測試工具

lighthouse -----> Google內置
在這里插入圖片描述

測試指標

在這里插入圖片描述

webPageTest -----> 在線測試工具
可以選擇服務器節點
Google ------> devTools

前端頁面性能常見的問題

前端頁面性能優化常見策略及方案

dns優化------預解析域名(異步進行)

在這里插入圖片描述

http請求優化

減少請求次數

同時多開持久連接

Chrome支持同域名六個, 多域名訪問,增加并行鏈接

http1.1默認就是長連接,Connection:keep-alive 請求頭加入
Connection: close (http1.1設置獲取資源后斷開連接)
http1.1新增管道機制,客戶端可以同時發送多個請求(并發請求)(響應不是并發,串行)
http2 沒有響應串行限制

http2 多工
HTTP/2復用TCP連接,在-個連接里,客戶端和瀏覽器都可以同時發送多個請求或回應,而且不用按照
順序一-對應,這樣就避免了"隊頭堵塞"。
這樣雙向的、實時的通信,就叫做多工(Multiplexing)
在這里插入圖片描述

前面面試

url從輸入到確認搜索發生了什么

(1) 瀏覽器接收到URL, 到網絡請求線程的開啟。
(2) 一個完整的HTTP請求并的發出。(dns、tcp)
(3)服務器接收到請求并轉到具體的處理后臺。
(4)前后臺之間的HTTP交互和涉及的緩存機制。
(5)瀏覽器接收到數據包后的關鍵渲染路徑。
(6) JS引擎的解析過程.

1.用戶輸入URL,會使用瀏覽器默認搜索引擎加上搜索內容合成url;如果是域名會加上協議(如https)合成完整的url。

2.網絡進程接收到url后,先查找有沒有緩存。有緩存,直接返回緩存的資源。 沒有緩存。(進入真正的網絡請求)。

3.首先獲取域名的IP,系統會首先自動從hosts文件中尋找域名對應的 IP 地址,一旦找到,和服務器建立TCP連接;如果沒有找到,則系統會將網址提交 DNS 域名解析服務器進行 IP 地址的解析。

4.利用IP地址和服務器建立TCP連接(3次握手)

5.建立連接后,瀏覽器構建數據包(包含請求行,請求頭,請求正文,并把該域名相關Cookie等數據附加到請求頭),然后向服務器發送請求消息。

6.服務器接收到消息后根據請求信息構建響應數據(包括響應行,響應頭,響應正文),然后發送回網絡進程。

7.數據傳輸完成,TCP四次揮手斷開連接。如果,瀏覽器或者服務器在HTTP頭部加上如下信息,TCP就一直保持連接。保持TCP連接可以省下下次需要建立連接的時間,提示資源加載速度Connection:Keep-Alive 。

8.網絡進程將獲取到的數據包進行解析,根據響應頭中的Content-type來判斷響應數據的類型,如果是字節流類型,就將該請求交給下載管理器,該導航流程結束,不再進行;如果是text/html類型,就通知瀏覽器進程獲取到文檔準備渲染。

瀏覽器進程獲取到通知之后。新建一個渲染進程。

渲染進程對文檔進行頁面解析和子資源加載。解析html生成DOM樹,解析CSSOM樹。合并生成render tree,
將每個節點的具體繪制方式轉化到屏幕上的實際像素。

js介紹new一個對象的過程,示例代碼如下:

function ClassA(){this.name = "123"
}
var p = new ClassA();

1、 創建空對象;
  var obj = {};
2、 設置新對象obj的constructor屬性為構造函數的名稱,設置新對象obj的__proto__屬性指向構造函數的prototype對象;
  obj.proto = ClassA.prototype;
3、 使用新對象調用函數,函數中的this被指向新實例對象:
  ClassA.call(obj);  //通過 call(),obj能夠使用屬于另一個對象的方法。
4、 將初始化完畢的obj返回,賦給變量p

介紹一下this

默認綁定

默認綁定的字面意思就是,不滿足其他的綁定方式,而執行的綁定規則。默認綁定會把this綁定到全局對象(是一個危險的操作,文章后面會說為什么) 看代碼

function foo(){var num=2;this.num++console.log(this.num)}var num=0;foo()//1

在foo方法的代碼塊中操作的是window.num++

隱式綁定

函數被調用的位置有上下文,或者是該函數的引用地址是不是被某個對象的屬性引用,并通過對象的屬性直接運行該函數。如果出現上述的情況,就會觸發this的隱式綁定,this就會被綁定成當前對象 看代碼

function foo(){console.log(this.name)
}
var bar={name:'shiny',foo:foo
}
bar.foo()//shiny

顯式綁定

call、apply綁定

介紹一下promise

class繼承的原理

diff算法

事件循環

首先,JavaScript是一門單線程的語言,意味著同一時間內只能做一件事,但是這并不意味著單線程就是阻塞,而實現單線程非阻塞的方法就是事件循環。
JavaScript中的任務分為同步任務和異步任務:
同步任務:立即執行的任務,同步任務一般會直接進入到主線程中執行,
異步任務:異步執行的任務,比如ajax網絡請求,setTimeout定時函數等。異步任務進入任務隊列。

舊說法先執行微任務

I/O、定時器、事件綁定、ajax等都是宏任務
Promise的then、catch、finally和process的nextTick都是微任務

W3c新規范任務隊列做了細分

分為微隊列、延時隊列、交互隊列等,先執行微隊列的任務,依次是交互、延時。

調用棧(Call Stack)

是一種后進先出的數據結構。當一個腳本執行的時候,js引擎會解析這段代碼,并將其中的同步代碼按照執行順序加入調用棧中,然后從頭開始執行。

事件隊列 (Task Queue)

js引擎遇到一個異步事件后并不會一直等待其返回結果,而是會將這個事件掛起(其他模塊進行處理),繼續執行執行棧中的其他任務。當一個異步事件返回結果后,js會將這個事件加入到事件隊列。

Google瀏覽器是多進程的在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160734.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 進程等待

在2號手冊里查wait()。wait()等待任意一個子進程的狀態。 wait()等待成功會返回該子進程的id,返回失敗會返回-1: 小實驗 子進程的退出碼 子進程執行work(),父進程wait子進程。 子進程跑完5秒之后就e…

GCANet_Gated context aggregation network for image dehazing and deraining

2019、中科大港科、有代碼 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

丟掉破解版,官方免費了!!!

哈嘍!大家好。 幾天不見,今天給大家帶來一款海外的神器,官方宣布完全免費,但僅限于個人與教育用途,切勿商用噢! 不要看這個軟件名字普普通通,實際上內蘊乾坤! 接下來看我給大家炫一…

隊列的實現和OJ練習(c語言)

目錄 概念 隊列的實現 利用結構體存放隊列結構 為什么單鏈表不使用這種方法? 初始化隊列 小提示: 隊尾入隊列 隊頭出隊列 獲取隊頭元素 獲取隊尾元素 獲取隊列中有效元素個數 檢測隊列是否為空 銷毀隊列 最終代碼 循環隊列 隊列的OJ題 …

元素清空操作clear與選擇操作check

元素清空操作clear與選擇操作check clear() 作用 清空輸入框的所有內容.clear() 等價于 .type("{selectall}{backspace}") 語法 .clear() .clear(options)option選項 元素選中操作check與uncheck check 語法 // 所有匹配到的選擇框都會被選中一遍 .check()/…

CISP模擬考試(二)

免責聲明 文章僅做經驗分享用途,利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,作者不為此承擔任何責任,一旦造成后果請自行承擔!!! 1.DDoS攻擊主要目的是: A.破壞完整性 B.破壞機密性 C.破壞可用性 D.破壞不可抵賴性 答案:…

三、防火墻-源NAT

學習防火墻之前,對路由交換應要有一定的認識 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式(Easy IP)1.4.Smart NAT1.5.三元組 NAT1.6.多出口場景下的源NAT 總結延伸 ——————————————————————————————…

C語言prim算法求最小生成樹

Prim算法是一種用于尋找無向帶權圖的最小生成樹的算法。該算法的基本思想是從一個源點開始,逐步向外擴展生成樹,每次找到與當前生成樹最近的未被訪問的頂點,并將其加入到生成樹中,直到所有頂點都被加入到生成樹中為止。 具體來說…

部署你的第一個應用

🗓?實驗環境 OS名稱Microsoft Windows 11 家庭中文版系統類型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 🤓FastAPI 構建應用 #基于fastapi快速創建一個項目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…

1688 API接口測試指南

本文為您提供1688 API接口的測試指南。我們將介紹1688 API的基本概念,詳解測試步驟,并為您提供一系列的最佳實踐,以確保您在與1688平臺進行API交互時能夠獲得最佳的效果和穩定性。 一、了解1688 API 1688 API是1688平臺為開發者提供的一套用…

數學建模之擬合及其代碼

發現新天地,歡迎訪問Cr不是鉻的個人網站 引言 與插值問題不同,在擬合問題中不需要曲線一定經過給定的點。擬合問題的目標是尋求一個函數(曲線),使得該曲線在某種準則下與所有的數據點最為接近,即曲線擬合…

基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼

基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于跳蛛優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要:針對PNN神經網絡的光滑…

7_畫圖常用代碼

plt.figure(dpi200) # 設置 dpi 為 200(可以根據需要調整這個值)

數據結構學習筆記——多維數組、矩陣與廣義表

目錄 一、多維數組(一)數組的定義(二)二維數組(三)多維數組的存儲(四)多維數組的下標的相關計算 二、矩陣(一)特殊矩陣和稀疏矩陣(二)…

從權限跳轉看Activity的data android:scheme

在應用申請懸浮窗權限的時候,可以跳轉到相應的設置界面,并且自動切換到應用的條目,高亮顯示一下, android懸浮窗權限怎么申請 在Android中,要申請懸浮窗權限,需要以下步驟: 在 AndroidManifes…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原裝出廠Win11系統ISO鏡像

光影精靈9筆記本電腦原廠W11系統22H2恢復出廠時開箱狀態一模一樣 適用型號:15-fa1003TX,15-fa1005TX,15-fa1007TX,15-fa1025TX 鏈接:https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取碼&#xff1a…

每天一道算法題(十一)——滑動窗口最大值_困難(中等)

文章目錄 1、問題2、示例3、解決方法(1)方法1——雙指針 總結 1、問題 給你一個整數數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗…

c++ 函數的申明

1 一個cpp中 兩種情況 1.1 定義 使用 1.2 聲明 使用 定義 2 按 定義 后 直接使用的順序 不用 聲明 函數 #include <iostream> using namespace std;int max(int a, int b) {int max a>b?a:b;return max; }int main() {int a 1;int b 2;cout << max(a, b…

解決vue中引入天地圖顯示不全問題,設置setTimeout即可解決!

index.html中引入天地圖api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地圖 //初始化天地圖 initTMap() {const T window.T;// 3.初始化地圖對象this.tMap new…

flink1.13.6版本的應用程序(maven版)

問題 想要一個指定flink版本的java計算任務hello world最簡工程。 解決 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.13.6這里直接使用官方mave模版工程&#xff0c;指…