博客專(zhuān)欄

EEPW首頁(yè) > 博客 > Qwik-能幫你移出項(xiàng)目中99%的JS代碼

Qwik-能幫你移出項(xiàng)目中99%的JS代碼

發(fā)布人:天翼云開(kāi)發(fā)者 時(shí)間:2024-10-22 來(lái)源:工程師 發(fā)布文章

本文分享自天翼云開(kāi)發(fā)者社區(qū)《Qwik-能幫你移出項(xiàng)目中99%的JS代碼》,作者:尹****勇

什么是 Qwik

Qwik 是一款全棧SSR框架,它號(hào)稱(chēng) -能幫你移出項(xiàng)目中99%的JS代碼-

FCP

FCP (First Content Paint 首次內(nèi)容繪制)測(cè)量 頁(yè)面從開(kāi)始加載到頁(yè)面內(nèi)容的任何部分在屏幕上完成渲染的時(shí)間

現(xiàn)在基本采用 react、vue 等框架進(jìn)行開(kāi)發(fā),這就需要如下過(guò)程

1.下載框架代碼

2.執(zhí)行框架代碼

3.由框架完成頁(yè)面渲染

這無(wú)疑導(dǎo)致了FCP指標(biāo)的下降

Qwik 采用了SSR,這就省去了上述三個(gè)步驟,無(wú)疑加快了FCP

但是TTI仍然需要優(yōu)化

TTI

TTI (Time to Interactive 用戶(hù)可交互時(shí)間)測(cè)量頁(yè)面變得完全可交互所需要的時(shí)間

主要衡量如下指標(biāo)

1.FCP

2.為頁(yè)面所有元素綁定事件

3.事件相應(yīng)時(shí)間在50ms內(nèi)

框架hydrate(注水,即框架使頁(yè)面能夠相應(yīng)交互) 對(duì)TTI有很大影響,性能瓶頸在JS。

React18的Selective Hydration通過(guò) -讓用戶(hù)交互的部分優(yōu)先hydrate- 來(lái)優(yōu)化TTI指標(biāo)。

Qwik 更極端,他的目標(biāo)是——干掉所有不必要的 JS 耗時(shí),包括兩部分

1.JS 作為靜態(tài)資源加載的耗時(shí)

2.JS 運(yùn)行時(shí)的耗時(shí)

Selective Hydration

Fiber(題外話(huà))

Fiber 是纖維的意思,就是比Process和Thread更細(xì)的東西。

在 Fiber 之前更新是同步的,一鼓作氣運(yùn)行到底,中途絕不停歇。

假如更新一個(gè)組件需要1ms,如果有200個(gè)需要更新就是200ms,在這期間就會(huì)導(dǎo)致用戶(hù)輸入無(wú)響應(yīng),體驗(yàn)很差。

 

image.png

 

Fiber 之后,就采用了 -分片- 的方法來(lái)破解同步操作時(shí)間過(guò)長(zhǎng)的問(wèn)題。

把一個(gè)耗時(shí)很長(zhǎng)的任務(wù)分成很多小片,每一個(gè)小片的運(yùn)行時(shí)間很短,雖然總時(shí)間依然很長(zhǎng),但是在每個(gè)小片執(zhí)行完成之后,都給其他任務(wù)一個(gè)執(zhí)行的機(jī)會(huì),這樣唯一的線程就不會(huì)被獨(dú)占。

 

image.png

 

React Fiber 對(duì)現(xiàn)有代碼的影響

因?yàn)槭欠制?,所以完全有可能一個(gè)更新任務(wù)還沒(méi)完成,就被另一個(gè)更高優(yōu)先級(jí)的更新過(guò)程打斷,這時(shí)候更高優(yōu)先級(jí)的會(huì)完成,而低優(yōu)先級(jí)的就會(huì)被完全作廢,然后等待機(jī)會(huì)重頭再來(lái)

 

因?yàn)楦驴赡鼙淮驍?,所以React Fiber的一個(gè)更新過(guò)程分為兩個(gè)階段:

Reconciliation Phase 找出需要更新哪些DOM,這個(gè)過(guò)程可以被打斷

Commit Phase 一鼓作氣把DOM更新完,不會(huì)被打斷

這兩個(gè)部分和我們的生命周期函數(shù)息息相關(guān)。

 

比如說(shuō)一個(gè)低優(yōu)先級(jí)的任務(wù)A在執(zhí)行,已經(jīng)調(diào)用到了componentWillUpdate函數(shù),接下來(lái)發(fā)現(xiàn)時(shí)間分片已經(jīng)用完了,于是冒出水面,看看有沒(méi)有緊急任務(wù)。等緊急任務(wù)執(zhí)行完成之后任務(wù)A就會(huì)重新來(lái)一遍,所以componentWillUpdate就會(huì)再次被調(diào)用。

另外componentWillMount也是同樣的效果。

所以要注意這兩個(gè)函數(shù)的實(shí)現(xiàn)componentWillMount 和 componentWillUpdate.


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: JS 框架 SSR

相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉