精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

史上最漫長的React hooks遷移之旅:如何在不停產的情況下大規模現代化遺留代碼庫

開發 前端
我們從類組件和MobX到React hooks的遷移不僅僅是一次重構——它是我們大規模構建UI方式的深度現代化。多年來,我們沿用過去行之有效的模式,但這些模式阻礙了我們獲得現代React提供的性能和組合性優勢。

我們如何在不中斷產品開發的情況下(最終)實現了大規模遺留代碼庫的現代化改造

在Faire,我們最近完成了前端代碼庫歷史上最漫長的一次代碼遷移。我們將最大的React應用從類組件和MobX類遷移到了函數組件和hooks。這次遷移通過提升代碼組合性和訪問強大的第三方庫(如TanStack Query和zustand),顯著增強了代碼庫的可維護性。同時借助數據預取提升了網站性能,并通過NextJS為采用服務器組件做好了準備。

以下是我們的遷移歷程,以及我們如何在不影響產品開發的情況下完成這一壯舉。

等待的代價

在深入遷移細節之前,讓我們直面核心問題:"為什么hooks在2019年發布,我們卻等到2025年才完成遷移?"2017年時,我們的React應用使用Redux,面臨著常見挑戰——包裝器地獄、代碼復用性差、副作用管理復雜以及笨重的reducer。

2018年,我們轉向MobX,因為它與類組件配合使用的編程模型要簡單得多。當hooks在2019年2月發布時,我們剛完成MobX遷移,對hooks的持久性存疑。考慮到當時的快速增長和產品需求,再次遷移似乎并不明智。

然而我們等待得太久了。到2022年我們最終決定從類遷移到函數時,代碼庫中的類數量已增長至5倍,而前端團隊僅擴大了一倍。這種增長極大地增加了遷移的復雜性和范圍。

為何必須改變

雖然類組件和MobX的組合最初表現良好,但隨著網站功能日益豐富,兩個主要問題逐漸顯現:

  1. 可維護性:由于缺乏強制性的類結構標準,代碼庫中積累了大量"大雜燴"類和過度聰明的面向對象編程模式。
  2. 性能:由于包體積增大和缺乏適當客戶端緩存的數據獲取層,網站性能下降。此外,MobX使得服務器端渲染的實現頗具挑戰性。

可維護性問題

我們的代碼庫包含兩種主要類型的MobX類:

  • "視圖狀態/模型":實例化一次后作為props傳遞
// State.ts  
classReferralViewState {  
@observable// 客戶端狀態  
activeTab: Tab = Tab.INVITED;

@observable// 服務器狀態  
referralResponses: Record<Tab, IPromiseBasedObservable<Referral[]>> = {};

@computed// 派生狀態  
getreferrals(): Referral[] | undefined {  
   returnthis.referralResponses[this.activeTab].case({  
     fulfilled: (referrals) => referrals,  
     pending: () =>undefined,  
   })  
 }

// 數據獲取邏輯  
asyncfetchReferrals() {  
   try {  
     if(!this.referralResponses[this.activeTab]) {  
       this.referralResponses[this.activeTab] = fromPromise(  
         fetchReferrals(  
           IListReferredBrandsRequest.build({  
             active_tab: this.activeTab,  
           })  
         )  
       )  
     }  
   } catch (error) {  
     console.error(error);  
   }  
 }  
}
  • "單例存儲":實例化一次(附加到window對象)并在應用任何位置訪問
// Store.ts  
classUserStore {  
// 將實例綁定到全局window  
static get = singletonGetter(UserStore);

@observable// 從服務器序列化的初始值  
user: IUser = getUser();

@computed// 派生值  
getfullName() {  
   return`${user.first_name} ${user.last_name}`;  
 }

// 數據獲取  
 refetchUser = async () => {  
   try {  
     this.user = awaitfetchUser();  
   } catch (error) {  
     console.error(error);  
   }  
 }  
}

隨著代碼庫增長,這種方法變得難以維護。視圖狀態實例通過整個子樹傳遞,導致開發者傾向于直接向這些類添加新狀態或派生值,造成簽名臃腫和組件接口僵化。

單例存儲也存在類似問題——全局可訪問性使得添加新字段比創建專用存儲更方便。雖然這種與組件樹的分離提供了靈活性,但也更容易引入錯誤。由于這些存儲早于React的"hooks規則",有時會因頂層訪問和變更導致難以追蹤的錯誤。

性能問題

這種架構方式導致包體積膨脹,因為訪問單例存儲會將其全部代碼拉入頁面包中。

我們還需要為每個客戶端-服務器端點調用自行實現數據獲取、緩存和失效邏輯。像TanStack Query和SWR這樣的現代基于hooks的庫與我們的類組件不兼容。

此外,我們的"單例存儲"window技巧使服務器端渲染復雜化,因為window在服務器上不可用,且我們需要防止狀態在請求間泄漏。在轉向NextJS之前,我們嘗試自行實現React SSR,不得不使用zone.js作為臨時解決方案。

遷移策略

2022年7月,我們決定遷移到hooks。由于當時AI代碼生成技術尚不成熟(GitHub Copilot剛剛起步,ChatGPT尚未出現),我們計劃采用傳統遷移方法。

為了追蹤使用情況,我們創建了報告類組件和MobX類的ESLint規則,將它們添加到單獨的eslint.tracking.config.js中。這種配置讓我們可以在CI中監控違規情況并向Snowflake報告,而不會用警告干擾開發者的IDE。由于我們的源文件映射到產品區域和團隊,我們構建了展示各團隊遷移進度的儀表板。

我們還需要從不支持hooks的mobx-react v5升級。雖然升級mobx-react相對簡單,但由于我們的多倉庫包結構和TypeScript的useDefineForClassFields影響類行為,遷移到mobxv6頗具挑戰性。最終我們停留在mobx v5和mobx-react v6的組合。

圖片圖片

兼容性矩陣顯示mobx-react v5不支持hooks,但mobx-react v6支持

我們添加了便利工具來簡化遷移同時保持互操作性。一個關鍵補充是createStoreHook工廠,它將單例存儲轉換為帶有選擇器參數的hook,使我們能夠先遷移存儲使用者,再更新底層實現。

在開始大規模遷移前,我們創建了針對Faire的MobX類轉hooks指南。由于到2022年hooks已經成熟,我們可以參考大量資料,包括新的react.dev文檔。

推進遷移

工具和文檔就位后,我們轉向實際的代碼遷移。雖然當時的AI工具還不夠成熟,無法可靠處理轉換,但我們找到了部分自動化的方法。

我們與Grit合作,他們使用專門的查詢語言進行代碼模式匹配和轉換。他們的團隊已經開發了將類組件轉換為函數組件的模式,并調整以處理MobX裝飾器。我們還創建了自己的模式來將"視圖狀態"MobX類轉換為自定義hooks。這些自動化模式要么一次性完成遷移,要么為手動優化提供良好起點。

圖片圖片

動畫展示Grit將React類組件遷移為函數組件的過程

然而,遷移的瓶頸并非代碼轉換本身——而是測試和審查變更。盡管我們在互操作性方面取得了良好進展,但我們的應用并非為hooks設計,且將MobX的可變observable推向了極限。

盡管前端代碼庫有很高的測試覆蓋率(平均80%以上),我們還是遇到了許多由新產生的不穩定引用導致的useEffect無限循環。這促使我們要求對所有非簡單的hook遷移PR進行手動測試,并由"hooks專家"審查。雖然這延長了遷移過程,但考慮到這些遷移的復雜性,這被證明是正確的決定。

獲得支持

這次遷移最困難的部分之一是獲得工程師和領導層的支持。

當我們首次宣布hooks遷移時,反應褒貶不一。一些工程師感到興奮,而另一些則心存疑慮。乍看之下,hooks似乎是一種奇怪的范式轉變,有著特殊的規則,相比類組件的優勢也不明顯。直到我們在API層引入TanStack的useQuery后,這種情況才改變。

圖片圖片

表情包展示一只鸚鵡最初對React hooks不滿,直到useQuery出現

useQuery極大地簡化了React應用中最常見的挑戰:數據獲取。相比基于類的方法,react-query API使服務器狀態管理簡單得多。改進如此顯著,以至于開發者開始自愿將類組件遷移為函數,只為使用useQuery

盡管有部分自動化,遷移成本仍然太高,無法強制要求。由于我們的團隊圍繞實現公司目標的路線圖構建,技術債務分布并不均勻。一些團隊在幾個月內完成了遷移,而擁有遺留或復雜代碼的團隊則需要更多時間。

我們嘗試了各種激勵措施鼓勵團隊完成遷移,但效果有限。我們的遷移排行榜最初激發了一些熱情,但少數熱心貢獻者很快占據了前列,使其他人難以競爭。我們還添加了修改類時的CI警告,但由于大多數遷移需要專門的PR,這些警告常被忽視。

到2025年上半年,我們終于獲得批準將遷移設為強制要求。那時AI工具已顯著改進,剩余的類也不多,即使沒有強制要求,我們可能也會完成遷移。

多年來的React類組件和MobX類數量下降圖表多年來的React類組件和MobX類數量下降圖表

遷移影響

單個類遷移到函數并沒有立即釋放太多價值。但當較大代碼區域和應用集體遷移到hooks后,效益開始累積。

當我們的數據獲取層使用useQuery后,我們開始利用推測性數據預取來改善頁面導航的加載時間。這被用于所有關鍵用戶旅程,僅預取帶來的速度提升就累計為我們市場帶來了5%的訂單量增長。

由于MobX自行處理狀態管理,它與React編譯器不兼容。移除MobX后,我們開始實驗為市場啟用編譯器,觀察到全站INP提升了25%。

MobX v5也與Turbopack不兼容(即使在支持舊裝飾器后),移除它解鎖了更快的本地開發打包器,為工程師每天節省約20-30分鐘。

展望未來

我們仍在從其他大型React應用中移除MobX,但現在有了AI的幫助。過去一年,LLM的編碼能力顯著提升,現在能生成更高質量的從類組件和MobX到函數組件和hooks的遷移。我們已成功使用Cursor的Agent模式加速遷移,目前正在試驗各種"后臺代理"解決方案來異步執行遷移。

結語

我們從類組件和MobX到React hooks的遷移不僅僅是一次重構——它是我們大規模構建UI方式的深度現代化。多年來,我們沿用過去行之有效的模式,但這些模式阻礙了我們獲得現代React提供的性能和組合性優勢。遷移一個成熟的、重度依賴類的代碼庫并不光鮮,但一旦完成,這種工程工作每天都會帶來回報。

我們沒有輕視這段旅程。它需要周密的計劃、定制的linting基礎設施、量身定制的代碼轉換和大量手動測試。還需要組織的耐心和共同信念——這種基礎性工作很重要。作為回報,我們現在擁有了一個更易理解、模塊化程度更高、兼容React生態最佳工具的代碼庫。

如果你在自己的代碼庫面臨類似遷移:開始測量、從小處著手,并在工具和人員上投入。因為最終,你會想構建一些hooks-based React才能實現的東西——當那一刻到來時,你會慶幸基礎已經準備就緒。

原文地址https://craft.faire.com/the-worlds-longest-react-hooks-migration-8f357cdcdbe9

作者: Chris Krogh

責任編輯:武曉燕 來源: 前端小石匠
相關推薦

2021-07-09 05:25:48

CIO遺留系統現代化用戶體驗

2015-10-29 14:35:21

移動設備現代化

2018-04-09 11:10:04

PHP前端控制器自動加載

2020-11-30 10:13:17

ITCIO首席信息官

2023-07-29 00:12:10

2025-06-04 07:00:00

技術債務企業CIO

2019-09-03 09:55:48

DevOps云計算安全

2023-02-06 10:29:36

CIO首席信息官

2019-07-26 11:51:20

云計算IT系統

2024-07-03 08:19:56

2023-03-02 08:19:43

不加鎖程序實時性

2020-03-11 09:54:04

技術IT架構

2013-09-23 10:05:50

2024-09-26 10:41:31

2020-06-19 14:12:35

2.3 TbpsDDoS攻擊網絡攻擊

2018-07-31 16:20:12

Windows 10Windows密碼

2023-09-05 06:48:46

云計算微服務領導者

2018-12-07 11:15:20

設置Windows 10命令

2022-09-09 17:57:35

戴爾
點贊
收藏

51CTO技術棧公眾號

欧美日韩人人澡狠狠躁视频| 丝袜脚交一区二区| 日韩精品一区二区三区中文不卡| av在线播放天堂| 日韩私人影院| 精品一二三四在线| 欧美性做爰毛片| av在线免费播放网址| 91久久精品无嫩草影院| 色久优优欧美色久优优| 国产在线xxxx| 亚洲1卡2卡3卡4卡乱码精品| 国产69精品久久久久毛片| 国产精品美女主播| 国产在线观看成人| 久久免费av| 精品无人区太爽高潮在线播放| 中文字幕在线综合| 黄色软件视频在线观看| 亚洲日本在线观看| 亚洲美女屁股眼交3| 久青草国产97香蕉在线视频| 污污内射在线观看一区二区少妇| 在线观看欧美| 色视频欧美一区二区三区| 国产又粗又长又爽视频| 成人高清免费观看mv| 成人激情午夜影院| 91情侣偷在线精品国产| 中文字幕在线日本| 中文欧美日韩| 久久免费精品视频| 国产精品 欧美激情| 精品视频网站| 亚洲欧美自拍一区| 艳妇乳肉亭妇荡乳av| 日本亚洲视频| 欧美久久久久久蜜桃| 奇米影音第四色| 男人久久天堂| 五月激情综合婷婷| 国产免费黄色小视频| 免费毛片在线看片免费丝瓜视频| 1区2区3区欧美| 亚洲国产精品毛片| av天在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 日韩女优中文字幕| 国产福利片在线| 久久久99久久| 日本一区免费看| 男女网站在线观看| 久久精品这里都是精品| 欧美激情一区二区三区在线视频 | 在线中文字幕第一页| 亚洲欧洲日本在线| 日本女人高潮视频| av网站在线免费看推荐| 少妇一区视频| 99视频国产精品| 国产一区二区三区色淫影院 | 91久久久久久白丝白浆欲热蜜臀| 91久久国产最好的精华液| 无遮挡又爽又刺激的视频| 成人影院网站| 欧美在线视频日韩| 潘金莲激情呻吟欲求不满视频| 亚洲综合av一区二区三区| 欧美日韩精品一区视频| 精品综合久久久久| 91麻豆精品国产91久久久久推荐资源| 精品国产免费视频| 日韩人妻一区二区三区| 精品国产视频| 精品国产拍在线观看| 欧美另类视频在线观看| 制服诱惑一区二区| 国产精品欧美激情在线播放| 国产精品亚洲lv粉色| 国产 欧美在线| 欧美精品一区二区三区在线四季 | 亚洲激情校园春色| 成年人看的毛片| 欧美自拍电影| 91麻豆精品国产91久久久久久久久 | 韩国av一区二区三区在线观看| 99久久99久久| 国产色a在线| 亚洲柠檬福利资源导航| 欧美日韩性生活片| 麻豆久久久久| 亚洲第一网站免费视频| 日本免费www| 好看不卡的中文字幕| 琪琪第一精品导航| 精品久久久中文字幕人妻| 国产成人综合精品三级| 国产综合av一区二区三区| h网站视频在线观看| 亚洲一区二区中文在线| 国产真人无码作爱视频免费| 日韩最新av| 国产一区二区三区在线播放免费观看| 婷婷久久综合网| 首页国产欧美久久| av一本久道久久波多野结衣| 99国产成人精品| 伦一区二区三区中文字幕v亚洲| 91精品国模一区二区三区| 国产乱了高清露脸对白| 亚洲一区色图| 日韩av大片免费看| 亚洲伦理在线观看| 国产精品麻豆久久久| 国产精品无码一区二区在线| www欧美在线观看| 亚洲天堂免费视频| 日本网站免费观看| 国产精品综合在线视频| 色综合久久av| 亚洲妇女成熟| 欧美精品一区二区三区在线播放| а天堂中文在线资源| 免费看亚洲片| 国产一区二区高清不卡| 国产在线观看a视频| 日本高清不卡一区| 亚洲一区二区乱码| 激情综合视频| 国产伊人精品在线| 97视频精彩视频在线观看| 欧美色视频日本版| 岛国精品资源网站| 黄色亚洲在线| 99re在线观看视频| 一区二区三区伦理| 日韩一级片网址| 一级性生活免费视频| 久久国产成人午夜av影院| 日本一区二区三区四区在线观看| 午夜影院一区| 亚洲精选在线观看| 天天做天天爱夜夜爽| 不卡的av在线| 欧美成人三级在线视频| 菁菁伊人国产精品| 亚州欧美日韩中文视频| 亚州av在线播放| 一本色道久久综合狠狠躁的推荐| 少妇特黄一区二区三区| 午夜在线精品偷拍| 日韩欧美精品一区二区三区经典| 成人看片网页| www.美女亚洲精品| 国产av无码专区亚洲a∨毛片| 亚洲精品一二三四区| 人妻体体内射精一区二区| 综合一区二区三区| 亚洲一区二区久久久久久久| 婷婷av在线| 亚洲国产黄色片| 免费黄色网址在线| 中文字幕乱码一区二区免费| 亚洲xxx在线观看| 亚洲最大黄网| 国产精品加勒比| 日本免费一区二区六区| 亚洲天堂成人在线| 一级黄色短视频| 亚洲伦在线观看| 亚洲乱妇老熟女爽到高潮的片| 樱桃成人精品视频在线播放| 久久久久久国产精品mv| 91大神在线观看线路一区| xvideos亚洲人网站| 亚洲爱情岛论坛永久| 午夜精品久久一牛影视| 我想看黄色大片| 国产成人精品免费网站| 能在线观看的av| 色婷婷一区二区三区| 成人9ⅰ免费影视网站| 松下纱荣子在线观看| 中文字幕成人精品久久不卡| 超碰在线人人干| 一本久久综合亚洲鲁鲁五月天| 美女网站视频色| 粉嫩av亚洲一区二区图片| chinese少妇国语对白| 51精产品一区一区三区| 国产一区精品在线| 久久99久久久精品欧美| 欧美极品少妇xxxxⅹ免费视频| 久久99久久| 欧美va亚洲va国产综合| 久久精品五月天| 亚洲激情在线激情| 性欧美精品男男| 国产成人一区在线| 五月婷婷深爱五月| 一区二区亚洲精品| 亚洲欧美日韩精品在线| 欧美激情99| 成人国产精品一区| 成人免费看视频网站| 欧美刺激性大交免费视频| 精品资源在线看| 精品久久一区二区| 国产乱码精品一区二区三区精东| 精品欧美国产一区二区三区| 免费看一级大片| 国产欧美日韩不卡免费| 日本道中文字幕| 激情综合五月天| 久久国产色av免费观看| 影音先锋国产精品| 日韩不卡一二区| 日韩理论电影大全| 六十路精品视频| 高清欧美性猛交xxxx黑人猛| 成人做爽爽免费视频| 欧美色999| 欧美在线视频播放| 91福利区在线观看| 欧美精品激情视频| 天堂av资源在线观看| 久久精品国亚洲| 伊人免费在线| 在线观看中文字幕亚洲| 毛片在线播放网址| 亚洲精品国产精品乱码不99按摩 | 婷婷色一区二区三区| 99久久精品99国产精品| 精品少妇人妻av一区二区三区| 国产一区二区h| 污网站在线免费| 久久www免费人成看片高清| 欧美性猛交久久久乱大交小说| 一区二区三区国产盗摄| 九九热只有这里有精品| 伊人成人在线| 2018日日夜夜| 亚洲免费播放| ww国产内射精品后入国产| 亚洲性人人天天夜夜摸| 亚洲精品蜜桃久久久久久| 欧美精选在线| 日本黄色片一级片| 激情综合电影网| 热99这里只有精品| 亚洲在线观看| av无码精品一区二区三区| 日韩精品乱码免费| 五月婷婷丁香综合网| 麻豆精品一区二区综合av| 中文字幕 91| 精品一区免费av| 日日夜夜精品视频免费观看| 国产精品一级二级三级| 日本一级大毛片a一| 成人91在线观看| 亚欧洲乱码视频| 国产精品久久三区| 成熟的女同志hd| 亚洲成人一二三| 久久亚洲精品国产| 欧美伊人久久久久久久久影院 | 妞干网免费在线视频| 国产精品第七十二页| 日本在线一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 视频二区欧美毛片免费观看| 狠狠色综合网站久久久久久久| 国产精品嫩模av在线| 亚洲 欧洲 日韩| 红桃视频国产精品| 国产a级一级片| 精彩视频一区二区| 中文字幕在线观看91| 久久久www成人免费毛片麻豆 | 亚洲视频免费| 欧美一级黄色影院| 国产91丝袜在线播放0| 女人又爽又黄免费女仆| 亚洲欧美一区二区不卡| 久久9999久久免费精品国产| 91黄色小视频| 亚洲av无码片一区二区三区 | 快射av在线播放一区| 国内成人精品一区| 日本h片久久| 国产精品久久亚洲| 日韩www.| 国自产拍偷拍精品啪啪一区二区| 久久国产欧美日韩精品| 中文字幕一区三区久久女搜查官| 国产精品国产精品国产专区不蜜 | 伊人福利在线| 国产精品高潮视频| av动漫精品一区二区| 亚洲精品美女久久7777777| 一区二区亚洲| 天堂av手机在线| 久久蜜桃香蕉精品一区二区三区| 成人性生活毛片| 欧美亚洲尤物久久| 天堂av一区二区三区| www.美女亚洲精品| 性欧美hd调教| 国内外成人免费视频| 亚洲人metart人体| 亚洲 中文字幕 日韩 无码| 成人小视频在线| 黄色香蕉视频在线观看| 91黄色在线观看| 亚洲aaaaaaa| 久久久噜噜噜久久久| 国产成人视屏| 午夜精品区一区二区三| 香蕉国产精品偷在线观看不卡| 97超碰免费在线观看| 国产精品久久久久久久蜜臀| 一级片视频在线观看| 亚洲高清av在线| 天使と恶魔の榨精在线播放| 国产欧美日韩最新| 成人羞羞网站| 妺妺窝人体色www在线观看| 91视频在线看| 午夜精品三级久久久有码| 精品福利视频一区二区三区| 在线视频国产区| 亚洲一区二区三区视频播放| 婷婷综合亚洲| 欧美特黄aaa| 国产精品国产三级国产有无不卡| 国产乡下妇女三片| 正在播放国产一区| 91精品影视| 日韩和欧美的一区二区| 六月天综合网| 成人免费无遮挡无码黄漫视频| 欧美性猛xxx| 邻居大乳一区二区三区| 日本午夜在线亚洲.国产| 香蕉久久夜色精品国产使用方法| av之家在线观看| 91亚洲男人天堂| 日韩黄色在线播放| 亚洲视频一区二区三区| 日韩高清中文字幕一区二区| 日韩精品欧美一区二区三区| 免费观看久久久4p| av手机在线播放| 欧美午夜电影一区| 黄色网在线免费看| 99在线视频播放| 亚洲欧洲一级| 亚洲天堂视频一区| 欧美综合久久久| 蜜芽在线免费观看| 国产精品18毛片一区二区| 亚洲最黄网站| 极品久久久久久久| 777午夜精品视频在线播放| 亚洲国产精品精华素| 久久精品成人一区二区三区蜜臀| 久热国产精品| av成人免费网站| 亚洲国产精品系列| 欧美va在线观看| 黄色污污在线观看| 91丝袜美腿高跟国产极品老师| 精品一区二区无码| 久热精品视频在线观看| 六月丁香久久丫| www.激情小说.com| 一区二区三区久久久| 欧美日韩国产中文字幕在线| 91精品美女在线| 国产欧美一区二区色老头| 国产传媒视频在线| 精品久久久久久久久久久久久久久| 亚洲伊人av| 麻豆md0077饥渴少妇| 91麻豆国产香蕉久久精品| 91 中文字幕| 午夜伦理精品一区| 希岛爱理一区二区三区| 三级男人添奶爽爽爽视频| 8v天堂国产在线一区二区| 在线看的毛片| 狠狠干视频网站| 日本一区二区视频在线观看| 亚洲第一天堂在线观看| 国产精品青青在线观看爽香蕉| 激情文学一区| 久久久久亚洲av片无码| 亚洲欧美视频在线| 91国内精品白嫩初高生|