為什么React一年不發(fā)新版了?
大家好,我卡頌。
遙想前幾年,不管是React還是Vue,都在快速迭代版本,以至于很多同學(xué)抱怨「學(xué)不動了」。
而現(xiàn)在,React已經(jīng)一年沒更新穩(wěn)定release了。
上一次發(fā)版還是22年6月
甚至有人認為,這就是「前端已死」最直接的證據(jù):
那么,React最近一年為什么不發(fā)版了呢?是因為前端框架領(lǐng)域已經(jīng)沒有新活兒可整了么?React v19是不是遙遙無期了?
最近一年React活躍嗎?
不想看長文章的同學(xué),這里一句話總結(jié)本文觀點:
React之所以一年沒發(fā)版,并不是因為無活可整,而是在完成框架從UI庫到元框架的轉(zhuǎn)型
首先,我們來看看,最近這一年React的更新活躍度是否降低?
從代碼push量來看,最近一年甚至比release產(chǎn)出較多的前幾年更活躍:
既然更活躍,那React這段時間到底在做什么呢?從「代碼增刪行數(shù)」可以一窺端倪,其中:
- 「綠色柱狀」代表代碼增加行數(shù)
- 「紅色柱狀」代表代碼減少行數(shù)
- 「紅色折線」代表代碼行數(shù)總體趨勢
從代碼量變化[1]來看,React歷史上大體分為四個時期:
- 13年開源,到17年之前的功能迭代期
- 持續(xù)到18年的重構(gòu)期(重構(gòu)React Fiber架構(gòu))
- 18~22年基于Fiber架構(gòu)的新功能迭代期
- 22年至今的重構(gòu)期
「功能迭代期」與「重構(gòu)期」的區(qū)別在于:
- 前者主要是在穩(wěn)定的架構(gòu)上迭代新特性
- 后者一般重構(gòu)底層架構(gòu)的同時,重構(gòu)老特性
「劇烈的代碼量波動」通常發(fā)生在「重構(gòu)期」。比如,在最近的重構(gòu)期內(nèi),PR #25774[2]刪除了3w行代碼。
這個PR主要改變React對于同一個子包,同時擁有.new、.old兩個文件的開發(fā)模式
最近一年React都在干啥?
明確了React最近一年處于重構(gòu)期。那么,究竟是重構(gòu)什么呢?
答案是 —— 將RSC(React Server Component,服務(wù)端組件)接入當前React體系內(nèi)。
有同學(xué)會問:RSC只是個類似SSR的特性,為什么要實現(xiàn)他還涉及重構(gòu)?
這是因為RSC不僅是一個特性,更是React未來主要的發(fā)展方向,其意義不亞于Hooks。所以,圍繞RSC的迭代涉及大量代碼的重構(gòu)。比如:
- SSR相關(guān)代碼需要修改
- SSR代碼修改導(dǎo)致Suspense組件代碼修改
- Suspense的修改又牽扯到useEffect回調(diào)觸發(fā)時機的變化
可以說是牽一發(fā)而動全身了。
RSC為什么重要
為什么RSC對React這么重要?要回答這個問題,得從開源項目的發(fā)展聊起。
開源項目要想獲得成功,一定需要滿足目標用戶(開發(fā)者)的需求。
早期,React作為前端框架,滿足了UI開發(fā)的需求。在此期間,React團隊的迭代方向主要是:
- 摸索更清晰的開發(fā)范式(發(fā)布了Error Boundray、Suspense、Hooks)
- 修補代碼(發(fā)布新的Context實現(xiàn))
- 優(yōu)化開發(fā)體驗(發(fā)布CRA)
- 底層優(yōu)化(重構(gòu)Fiber架構(gòu))
可以發(fā)現(xiàn),這些迭代內(nèi)容中大部分(除了底層優(yōu)化)都是直接面向普通開發(fā)者的,所以React文檔(文檔也是面向開發(fā)者的)中都有體現(xiàn),開發(fā)者通過文檔能直觀的感受到React不斷迭代。
隨著前端領(lǐng)域的發(fā)展,逐漸涌現(xiàn)出各種業(yè)務(wù)開發(fā)的最佳實踐,比如:
- 狀態(tài)管理的最佳實踐
- 路由的最佳實踐
- SSR的最佳實踐
一些框架開始整合這些最佳實踐(比如Next.js、Remix,或者國內(nèi)的Umijs...)
到了這一時期,開發(fā)者更多是通過使用這些框架間接使用React。
感受到這一變化后,React團隊的發(fā)展方向逐漸變化 —— 從「面向開發(fā)者」的前端框架變?yōu)椤该嫦蛏蠈涌蚣堋沟脑蚣堋?/p>
發(fā)展方向變化最明顯的表現(xiàn)是 —— 文檔中新出的特性普通開發(fā)者很少會用到,比如:
- useTransition
- useId
- useMutableSource
這些特性都是作為元框架,給上層框架(或庫)使用的。
上述特性雖然普通開發(fā)者很少用到,但至少文檔中提及了。但隨著React不斷向元框架方向發(fā)展,即使出了新特性,文檔中已經(jīng)不再提及了。比如:
- useOptimistic
- useFormStatus
上述兩個Hook想必大部分同學(xué)都沒聽過。他們是React源碼中切實存在的Hook。但由于是元框架理念下的產(chǎn)物,所以React文檔并未提及。相反,Next.js文檔[3]中可以看到使用介紹。
總結(jié)
React之所以已經(jīng)一年沒有發(fā)布穩(wěn)定release,是因為發(fā)展方向已經(jīng)從「面向開發(fā)者」轉(zhuǎn)型為「面向上層框架」。
在此期間的更新都是面向上層框架,所以開發(fā)者很難感知到React的變化。
但這并不能說明React停止迭代了,也不能據(jù)此認為前端發(fā)展的停滯。
如果一定要定量觀察React最近一年的發(fā)展,距離React v19里程碑,已經(jīng)大體過半了:
參考資料
[1]代碼量變化:https://ossinsight.io/analyze/facebook/react/#commits。
[2]PR #25774:https://github.com/facebook/react/commit/420f0b7fa1fcc609fc7b438c4599d0f76fab4bc0。
[3]Next.js文檔:https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions#experimental-useoptimistic。