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