亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费

新聞中心

NEWS

優(yōu)化什么意思?(關(guān)于前端性能優(yōu)化的知識點(diǎn))

時(shí)間:2026-05-05 03:13:30

Web前端進(jìn)階指南

| 點(diǎn)擊上方紅色按鈕加關(guān)注,優(yōu)化于前一起學(xué)前端!什意思關(guān)

關(guān)于前端性能優(yōu)化的端??性點(diǎn)知識點(diǎn)

“春江??水暖鴨先知,產(chǎn)品好壞客戶(hù)知”,知識作為前端開(kāi)發(fā),優(yōu)化于前我們更??注重客戶(hù)體驗,什意思關(guān)產(chǎn)品的端性點(diǎn)好壞決定著(zhù)客戶(hù)的體驗,那么一款產(chǎn)品的知識好壞有很多因素,其中性??能是優(yōu)化于前決定因素,那么怎么優(yōu)化才能讓產(chǎn)品的什意思關(guān)性能達到優(yōu)良(′;ω;`),讓客戶(hù)體驗良好,端性點(diǎn)今ヾ(′ω`)?天我就帶大家去了解學(xué)習前端性能優(yōu)化。知識

優(yōu)化的優(yōu)化于前目的

優(yōu)化的目的在于讓頁(yè)面加載的更快,對用戶(hù)操作響應更及時(shí),??什意思關(guān)為用戶(hù)??帶來(lái)更好的端性點(diǎn)用戶(hù)體驗,對于開(kāi)發(fā)者來(lái)說(shuō)優(yōu)化能夠減少頁(yè)面請求數,能夠節省資源。

優(yōu)化哪些?

那么我們需要優(yōu)化那些點(diǎn)呢?

加載資源優(yōu)化渲染優(yōu)化瀏覽器緩存策略圖片優(yōu)化節流與(yu)防抖加載??資源優(yōu)化

說(shuō)起加載,當我們輸入URL時(shí),我們要知道這中間發(fā)生了什么?

首先做 DNS 查詢(xún),如果這一步做了智能 DNS 解析的話(huà)(O_O),會(huì )提供訪(fǎng)問(wèn)速度最快的 IP( ?° ?? ?°) 地址回來(lái)接下來(lái)是 TCP 握手,應用層會(huì )下發(fā)數據給( ?° ?? ?°)傳輸層,這里 TCP 協(xié)議會(huì )指明兩端的端口號,然后下發(fā)給網(wǎng)絡(luò )層。網(wǎng)絡(luò )層中的 IP 協(xié)議會(huì )確定 IP 地址,( ?ヮ?)并且指示了數據傳輸中??如(ru)何跳轉路由器。然后包會(huì )再被封裝到數據鏈路層的數據幀結構中,最后就是物理層面的傳輸了TCP 握手結束后會(huì )進(jìn)行 TLS 握手,然后就開(kāi)始正式的傳輸數據數據在進(jìn)入服務(wù)端之前,可能還會(huì )先經(jīng)過(guò)負責負載均衡的服務(wù)器,它的作用就是將請求合理的分發(fā)到多臺服??務(wù)器上,這時(shí)ヽ(′ー`)ノ假設服務(wù)端會(huì )響應一個(gè) HTML 文件首先瀏覽器會(huì )判斷狀態(tài)碼(′?`*)是什么(′▽?zhuān)?),如果是 200 那就繼續解析,如果?? 400 或 500 的話(huà)就會(huì )報錯,如果 300 的話(huà)會(huì )進(jìn)行重定向,這里會(huì )有個(gè)重定向計數器,避免過(guò)多次的重定向,超過(guò)次數也會(huì )報錯瀏覽器開(kāi)始解析文件,如果是 gzip 格式的話(huà)會(huì )先解壓一下,然后通過(guò)文件的編碼格式知道該如何去解碼文件文件解碼成功后會(huì )正式開(kāi)(′?ω?`)始渲染流程,先會(huì )根據 HTML 構建 DOM 樹(shù),有 CSS 的話(huà)會(huì )去構建 CSSOM 樹(shù)。如果遇到 script 標簽的話(huà),會(huì )(′;ω;`)判斷是否存在 async 或者 defer ,前(qian)者會(huì )并行進(jìn)行下載并執???行 JS,后者會(huì )先下載文件,然后等待 HTML 解析完成后順序執行,如果以上都沒(méi)??有,(′?ω?`)就會(huì )阻塞住渲染流程直到 JS 執行完畢。遇到文件下載的(de)會(huì )去下載文件,這里如果使用 HTTP 2.0 協(xié)議的話(huà)會(huì )極大的提高多圖的下載效率。初始的 HTML 被完全加載和??解析后會(huì )觸發(fā) DOMContentLoaded 事件CSSOM 樹(shù)和 DOM 樹(shù)構建完成后會(huì )開(kāi)始生成 Render 樹(shù),這一步就是確定頁(yè)面元素的布局、樣式等等諸多方面的東西在生成 Render 樹(shù)的過(guò)程中,瀏覽器就開(kāi)始調用 GPU 繪制,合成圖層,將內容顯示在屏幕上了

我們從輸入 URL 到顯示頁(yè)面這個(gè)過(guò)程中,涉及到網(wǎng)絡(luò )層面的,有三個(gè)主要過(guò)程:

DNS 解析TCP 連接ヾ(′?`)?HTTP(╬?益?) 請求/響應

這里我們就不用去管(guan)DNS解析和TCP鏈接了,畢竟不是我們的事,也干不來(lái),但是HTTP請求和響應是我們優(yōu)化的重點(diǎn)。

HTTP優(yōu)化可分為兩個(gè)方面:

盡量減少請求次數盡量減少單次請求所花費的時(shí)間

減少請求數:

合理的設置htt(╬ ò﹏ó)p緩存,恰當的緩存設置可以大大減少h??ttp請求。要盡可能地讓資源能夠在緩存中待得更久。從設計實(shí)現層面簡(jiǎn)化頁(yè)面,保持頁(yè)面??簡(jiǎn)潔、減少資源的使用時(shí)是最直ˉ\_(ツ)_/ˉ接的。資源合并與壓縮,盡可能的將外部的腳本、樣式進(jìn)行合并,多個(gè)合為一個(gè)。CSS Sprites,通過(guò)合并 CSS圖片,這是減少請求數的一個(gè)好辦法

內聯(lián)腳本的位置:

瀏覽器是并發(fā)請求的,( ?▽?)很多時(shí)候我們會(huì )加入(′_`)很多的外鏈腳本,而外鏈腳本在加載時(shí)卻常常阻塞其他資源,例如在腳本加載完成??之前,它后面的圖片、樣式以及其他腳本都處于阻塞狀態(tài),直到腳本加載完成后才會(huì )開(kāi)始加載。如果將腳本放在比較靠前的位置,則會(huì )影響整個(gè)頁(yè)面的加載速度從而影響用戶(hù)體驗。所以說(shuō)盡可能的將腳本往后挪,減少對并發(fā)下載的影響。

渲染優(yōu)化

客戶(hù)端的渲染

前端去取后端的數據生成DOM樹(shù),加載過(guò)來(lái)后,自己在瀏覽器由上(′?`*)而下跑執行JS,隨后就會(huì )生成相應的DOM。

優(yōu)點(diǎn):

客戶(hù)端的渲染使得前后端分離,開(kāi)發(fā)效率高用戶(hù)體驗更好,我們將網(wǎng)站做成SPA(單頁(yè)面應用)或者部分內容做成Sヽ(′?`)ノPA,當用戶(hù)ヽ(′▽?zhuān)?ノ點(diǎn)擊時(shí),不會(huì )形成頻繁的跳轉

缺點(diǎn):

前端響應速度慢,特別是首屏,( ?ヮ?)這樣用戶(hù)是受不了的不利于SEO優(yōu)化,因為爬蟲(chóng)不認識SPA,所以它只是記錄了一個(gè)頁(yè)面

服務(wù)端的渲染

DO??M(???)樹(shù)在服??務(wù)端生成,然后??返回給前端,頁(yè)面上展現的內容(rong),我們在HTML源文件也能找到。

優(yōu)點(diǎn):

服務(wù)端渲染盡量不占用前端的資源,前端這塊耗時(shí)少,速度快利于SEO優(yōu)化,因為在后端有完整的??html頁(yè)面,所以爬蟲(chóng)更容易爬取信息

缺點(diǎn):

不利于前后端分離,開(kāi)發(fā)的效率降低了對html的解析,對前端來(lái)說(shuō)加快了速度,但是加大了??服務(wù)器的壓力

類(lèi)似企業(yè)級網(wǎng)站,主??要功能是頁(yè)面展示,它沒(méi)有復雜的交互,并且需要良好的SEO,那我們應該使用服務(wù)端渲染。

現在很多網(wǎng)站使用服務(wù)端渲染和客戶(hù)端渲染結合的方式:首屏使用服務(wù)端渲染,其他頁(yè)面使(shi)用客戶(hù)端渲染。這樣可以保證首屏的加載速度,也完成了前后端分離。

區分:源碼里如果能找到前端頁(yè)面中的內容文字,那就是在服務(wù)端構建的DOM,就是服務(wù)端渲染,反之是客戶(hù)端??渲染。

瀏覽器渲染

瀏覽器渲染機制一般分為:

分析HTML并構建DOM樹(shù)???分析CSS構建CSSOM樹(shù)將DOM和CSSOM合并成一個(gè)渲染樹(shù)根據渲染樹(shù)布局,計算每個(gè)節點(diǎn)的位置調用GPU繪制(T_T),合成圖層,顯示頁(yè)面

在渲染DOM的時(shí)候,瀏覽器所做的事情:

獲取DOM后分割為多個(gè)圖層對每個(gè)圖??層的節點(diǎn)計算樣式結果(recalculate style — 樣式重計算)為每個(gè)節點(diǎn)生成??圖形和位置(layout — 回流和重布局)將每個(gè)節點(diǎn)繪制填充到圖層位圖中(paint setup 和 paint ̵??2; 重繪)圖層作為紋理上傳至GPU復合多個(gè)圖層到頁(yè)面上生(╬ ò﹏ó)成最終屏幕圖像(composite layers — 圖層重組)

新建獨立圖層會(huì )(′_`)減少重回回流帶來(lái)的影響,但是在圖層重組的時(shí)候會(huì )消耗大量的性能,所以要權衡利弊,有所選擇。

渲染流程的CSS優(yōu)化

CSS的渲┐(′?`)┌染是從右到左進(jìn)行匹配的,我們應該注意:

避免大量使用通配符,可選擇需要用到的元素關(guān)注可以通過(guò)繼承實(shí)現的屬性,避免重復匹配,重復定義少用標簽選擇器,例如.header ul li aid和class選擇器不應??該被多余的選擇器拖后腿,例如.header#title減少嵌套,后代選擇器的開(kāi)銷(xiāo)最高,不要一大串,要將選擇器的深度降到最低,盡可能使用類(lèi)來(lái)關(guān)聯(lián)每一個(gè)標簽元素。

CSS阻塞

我們將css放在head標簽里和盡快啟用CDN實(shí)現靜態(tài)資源加載速度的優(yōu)化,因(yin)為只要(yao)CSSOM不OK,那么渲染就不會(huì )完成。

JS阻塞

JS引擎是獨立于渲染引擎存在的,就是說(shuō)插在頁(yè)面那,就在那執行,瀏覽器遇到script標簽時(shí),它就會(huì )停止交于JS引擎渲染,等它渲染完,瀏覽器又交于渲染引擎繼續CSSOM和DOM的構建。

DOM渲染優(yōu)化

也就是說(shuō)重繪回流問(wèn)題

回流:前面我們通過(guò)構造渲染樹(shù),我們將可見(jiàn)DOM節點(diǎn)以及它對應的樣式結合起來(lái),可是我們??還需要計算它們在設備視口(viewport)內的確切位置和大小,這個(gè)計算的??階段就是回流。重繪:最終,我們通過(guò)構造渲染樹(shù)和回流階段,我們知道了哪些節點(diǎn)是可見(jiàn)的,以及可見(jiàn)節點(diǎn)的樣式和具體的幾何信息(位置、大小),那么我們就可以將(jiang)渲染樹(shù)的每個(gè)節點(diǎn)都轉換為屏幕上的實(shí)際像素,這個(gè)階段就叫做(°ロ°) !重繪節點(diǎn)。

當頁(yè)面布局和幾何信息發(fā)生變化的時(shí)候???,就需要(′▽?zhuān)?回流。比如以下情況:

添加或刪除可見(jiàn)的D??OM元素元素的位置發(fā)生變化元素的尺寸發(fā)生??變化(包括外邊距、內邊框、邊框大小、高度和寬度等)內容發(fā)生變化,比如文本變化或圖片被另一個(gè)不同尺寸的圖片所替代。頁(yè)面一開(kāi)始???渲染的時(shí)候(這肯定避免不了)瀏覽器的窗口尺寸變化(因為回流是根??據視??口的(de)大小來(lái)計算元素的位置和大小的)

注??意:回流一定會(huì )觸發(fā)重繪,而重繪不一定會(huì )回流,回流比重繪做的事情要多,帶來(lái)的開(kāi)銷(xiāo)也大(da),在開(kāi)發(fā)中,要從代碼層面出發(fā),盡可能把回流和重繪的次數最小化。

如何最小化重繪和重排

用 translate 替代 top用 opac??ity 替代 visibility不要一條一條的修改 DOM 的樣式,預先定義好 class,然后修改 DOM 的 classNa??me把 DOM 離線(xiàn)后修改,比如:先把 DOM 給 display: none(有一次 reflow),然后修改100次,然后再顯示出來(lái)不要把 DOM 節點(diǎn)的屬性值放在一個(gè)循環(huán)里當成循環(huán)里的變量不要使用 table 布局,可能很小的一個(gè)改動(dòng)就??會(huì )造成整個(gè) table 的重新布局動(dòng)畫(huà)實(shí)現的速度的選擇對于動(dòng)畫(huà)新建圖層啟用 GPU 硬件加速瀏覽器緩存

強緩存

發(fā)現有緩存直接用。

Expires: 絕對時(shí)間,判斷客戶(hù)端日期是否超過(guò)這個(gè)時(shí)間

Cache-Control:相對時(shí)間,判斷訪(fǎng)問(wèn)間隔是否大于36ヽ(′▽?zhuān)?/00秒

//在設定時(shí)間之前不會(huì )和服務(wù)端進(jìn)行通信(′ω`)了

//如果兩個(gè)都下發(fā)以后者為準

協(xié)商緩存

詢(xún)問(wèn)服??務(wù)器緩存是否可以用,在進(jìn)行判斷是否用。

Last-Modified/If-Modified-Si(′-ι_-`)nce

第一次請求,respone的header加上Last-Modified(最后修改時(shí)間)

再次請求,在request的header上加上If-Mod??ified-Since

和服務(wù)端的最后修改時(shí)間對比,如果沒(méi)有變化則返回304 Not Modified,但是不會(huì )返回資源內容;如果有變化,就正常返回資源內容。瀏覽器??收到304的響應后,就會(huì )從緩存中加(′-ι_-`)載資源

如果協(xié)商緩存沒(méi)有命中,瀏覽器直接從服務(wù)器加載資源時(shí),Last-Modified的Header在重新加載的時(shí)候會(huì )被更ヽ(′ー`)ノ新

Etag/??I(′ω`)f-None-Match

這兩個(gè)值是由服務(wù)器生成的每個(gè)資源的唯一標識字符串,只要資源有變化就這個(gè)值就會(huì )改變;其判斷過(guò)程與Last-Modified/If-Modified-Since類(lèi)似,他可以精(jing)確到秒的更高級別。

DNS預解析

<meta http-equiv='x-dns-prefetch-control' content="on"(′▽?zhuān)?><link rel='dns-prefetch' href='//www.web.net'>

在一些瀏覽器的a標簽是默認打開(kāi)dns預解析的,在ht( ???)tps協(xié)議下dns預解析是關(guān)閉的,加入mate后會(huì )打開(kāi)??。

圖片優(yōu)化

減小圖片大小

我看到有的文章通過(guò)計算圖片大小來(lái)優(yōu)化圖片,就是說(shuō):

比如一張100*100的圖片,圖片上有10000個(gè)像素點(diǎn),如果每個(gè)像ヾ(′?`)?素的值是RGBA存儲的話(huà),那么也就是說(shuō)每個(gè)像素有4個(gè)通道,每個(gè)通道1個(gè)字節(8位 = 1個(gè)字節),所以該圖片的大小大概為39KB。所以說(shuō)通過(guò)(guo):

減少像素點(diǎn)減少每個(gè)像素點(diǎn)ヽ(′▽?zhuān)?ノ能??夠顯示的顏色

上面的兩種方式減小圖片的大小,不過(guò)在我們開(kāi)發(fā)中直接壓縮來(lái)減( ???)小圖片的大小。

改變圖片的格式

這個(gè)圖片的類(lèi)型也決定著(zhù)圖片的屬性(╬ ò﹏ó),詳??細的我再微頭條說(shuō)過(guò),附上鏈接:

各種圖片格式的特點(diǎn)

節流和防抖

日常開(kāi)(′?`*)發(fā)過(guò)程中,滾動(dòng)事件做復雜計算頻繁調用回調函數很可能會(huì )造成頁(yè)面的卡頓,這時(shí)候我們更希望把多次計算合并成一次,只操作一個(gè)精確點(diǎn),JS把這種方式稱(chēng)為debounce(防抖)和throヾ(′?`)?ttle(節流)

函數節流

當持續觸發(fā)事件時(shí),保證在一定時(shí)間內(′?`)只調用一次事件處理函數,意思就??是說(shuō),假設一個(gè)用戶(hù)一直觸(O_O)發(fā)這個(gè)函數,且每次觸發(fā)小于既定值,函數節流會(huì )每隔這個(gè)時(shí)(???)間調用一次用一句話(huà)總結防抖和節流的(de)區別:防抖是將多次執行變?yōu)樽詈笠淮螆绦?,節流是將多次執行變?yōu)槊扛粢欢螘r(shí)間執行實(shí)現函數節流我們主要有兩種方法:時(shí)間戳和定時(shí)器

var throttle = function(func, delay) { var prev = Date.now(); return function() { var context = this; //this(′?`*)指向window var args = arguments; var now = Date.now(); if (now - prev >= delay) { func.apply(context(′ω`), args); prev = Date.no(′_`)w(); } }}function handle()?? { console.log(Math.random());}window.addEventListener('scroll', throttle(handl(╯°□°)╯︵ ┻━┻e, 1000));

這個(gè)節流函數利用時(shí)間戳讓第一次滾動(dòng)事件執行一次回調函數,此后每隔1000ms執行一次,在小于1000ms這段時(shí)間??內的滾動(dòng)是不執行的

函數防抖

當持續觸發(fā)事件時(shí),一定時(shí)間段內沒(méi)有再觸發(fā)事件,事件處理函數才會(huì )執行一次,如果設定時(shí)間到來(lái)之???前,又觸發(fā)(fa)了(le)事件,就重新開(kāi)始延時(shí)。也就是說(shuō)當一個(gè)用戶(hù)一直??觸發(fā)這個(gè)函數,且每次觸發(fā)函數的間隔小于既定時(shí)間,那么防抖的情況下只會(huì )執行一次。

function deboun(?Д?)ce(fn, wait) { var timeout = null; //定義一個(gè)定時(shí)器 return function() { if(timeout !== null) clearTimeout(t(′?_?`)imeout); //清除這個(gè)定時(shí)器 timeout = setTimeout(fn, wait); }}// 處理函數function handle() { co??nsole.log(Math.random()); }// 滾動(dòng)事件window??.addEventListener('scroll', deboun( ?° ?? ?°)ce(handle, 1000??));

如上所見(jiàn),當ˉ\_(ツ)_/ˉ持續觸發(fā)scroll函數,handle函數只會(huì )在1秒時(shí)間內執行一次,在滾動(dòng)過(guò)程中并沒(méi)有持續執行,有效減少了性能的損耗。

防抖和節流(liu)能有效減少瀏覽器引擎的損耗,防止出現頁(yè)面堵塞卡頓現象。

總結

上面我們主要從加載資源優(yōu)化、渲染優(yōu)??化、瀏覽器緩存策略、圖片優(yōu)化、節流與防抖這幾個(gè)方(′;д;`)面,講??述了我們平常不易掌握和了解的性能優(yōu)化知識點(diǎn),希望大家(???)可以了解學(xué)習掌握并加以應用,讓我們的產(chǎn)品體驗更佳,精益求精,做最好的產(chǎn)品和自己。

亚洲女同成aV人片在线观看|亚洲www啪成人一区二区麻豆|亚洲国产中日韩精品综合|亚洲国产成人精品一级片|亚洲无码在线视频免费 昌宁县| 休宁县| 崇左市| 遂平县| 兴和县| 开阳县| 嘉善县| 岐山县| 汉寿县| 上栗县| 甘谷县| 莒南县| 固安县| 冕宁县| 方正县| 耒阳市| 姚安县| 新竹县| 潜山县| 新邵县| 巫山县| 洛隆县| 申扎县| 水城县| 乐至县| 夏河县| 安西县| 皋兰县| 顺平县| 阿克陶县| 绥德县| 大新县| 信阳市| 九江县| 达拉特旗| 伊宁县| 桑植县| 高碑店市| 会理县| 宜兴市| 贞丰县| http://444 http://444 http://444 http://444 http://444 http://444