經過近兩個月的準備,攜程無線平台研發團隊正式將內部的React Native開發框架 - CRN 實現開源。CRN對原生的React Native框架進行了大量架構簡化、性能和穩定性調優的工作,能大幅降低RN技術的應用成本。
背景
攜程從2016年年中正式引入React Native,至今已將近3年,現在逐步穩定,並成為內部首選的跨平台開發方案。
先簡單回顧下ReactNative在攜程的發展軌跡
- 2016年,RN 0.30.0版本,試驗期
- 少數對性能和動態性都有要求的業務模塊使用,其它大多選擇流量小的業務流程做嘗試;
- 完成了打包Bundle拆分、框架預載入等核心性能瓶頸的優化;
- 配套文檔、發布系統建設;
- 2017年,RN 0.41.0版本,大面積使用期
- 攜程旅行App各業務線都有接入使用,大量原先使用傳統Hybrid技術開發的業務,切換到CRN;
- 為解決複雜業務的首屏渲染性能問題開發LazyRequire方案;
- 配套的發布監控、異常監控、性能報表系統建設;
- 2018年,RN 0.51.0版本,爆發期
- 業務大規模接入,大多是主流程、全流程使用,現在大家使用的攜程旅行App中有超過一半的頁面都是RN開發的;
- 集團內其他核心App (智行、http://Trip.com、攜程商旅等) 全部接入使用;
- Android平台的穩定性大幅提升;
- 2019年,RN 0.59.0版本,穩定期
為什麼開源
- 分享我們對RN框架的性能優化方案
- 期待業內使用RN技術的同行通過開源社區與我們進行更深入的交流
開源內容
CRN作為一個整體解決方案,涵蓋了從開發框架、工具、文檔、測試、發布到運維全研發生命周期的支持,與大量內部系統打通,並定製了適合攜程研發組織結構的開發流程。
本次開源基於ReactNative 0.59.0, react 16.8.3版本, 開源的主要是性能優化部分, 也是規模化使用RN進行業務開發必須要做的優化。
- CLI
- 工程創建、調試和運行
- 打包時拆分框架和業務代碼
- 打包時生成一套打包產物 (可同時運行在iOS和Android平台)
- 打包時支持增量編譯 (同一JS模塊多次編譯模塊ID不變,便於差分更新)
- LazyRequire, 按需載入
- Runtime
- 打包出的框架代碼後台預載入
- 業務代碼緩存策略 (提升業務首屏二次打開速度)
- 穩定性增強
- 首屏渲染性能統計
適用場景
- 純RN App
- 因為啟動就是RN業務,首頁無法享受框架預載入帶來的載入提速
- 如果有多個業務包,CLI的拆包可以減小包大小
- 使用CRN開源的Runtime(iOS/Android native代碼)可以增強RN的穩定性
- 混合型 App
改造優化
舉例介紹其中兩個重要的優化場景:
首屏載入性能
- 運行Demo工程中的Tester模塊 (為RN官方提供的測試模塊)
- 在iPhone 7Plus、iPhone 6、Samsung S6 Edge+ 三款機型上測試
- 分別採用CRN和標準RN兩種模式載入
統計頁面的首屏載入時間,對比圖如下: