React Native 0.75 重磅發布:性能飛躍與重要更新全面解析
React Native 0.75 的發布標志著一個重要的里程碑,該版本通過一系列有影響力的更新和更改,旨在提高性能、穩定性和整體開發者體驗。以下是此版本中包含的增強功能、新特性和重大更改的全面概述。
亮點 ??
Yoga 3.1 的增強和布局改進
React Native 0.75 引入了 Yoga 3.1,它帶來了一些增強功能和新的布局能力。一個重要亮點是對布局屬性(如間隙和位移)的百分比值的支持。這些更新提供了更靈活和響應式的設計選項,僅在新架構中可用。對于這些功能感興趣的用戶應考慮遷移到更新的架構。
穩定新架構
此次發布繼續推進新架構的穩定化進程。自 React Conf 上發布 Beta 版以來,進行了多次錯誤修復和改進:
- Android 字體大小調整:修復了 adjustsFontSizeToFit 的問題。
- 文本對齊:解決了 Android 上 textAlign 在內聯視圖中不起作用的問題。
- 文本基線:修復了 iOS 上的文本基線問題。
協作與新 API
- Expo 集成:React Native Directory 現在提供了新架構支持信息,簡化了庫兼容性檢查。
- TurboModules 穩定 API:引入了用于訪問 TurboModules 中 jsi::Runtime 的新穩定 API,提供了原生模塊與運行時交互的安全方法。
框架與生產力
React Native 0.75 強調使用 Expo 等框架構建應用程序,以提高生產力并提供更好的開發者體驗。
- 模板遷移:/template 文件夾已遷移到 @react-native-community/template,以實現更快的更新和更好的社區維護。
- **棄用 react-native init**:react-native init 命令將于 2024 年 12 月 31 日棄用。之后,請使用 npx create-expo-app 創建 Expo 應用或使用 npx @react-native-community/cli init 創建社區 CLI 項目。其他命令如 react-native config 將繼續正常運行。
- 自動鏈接性能改進:自動鏈接邏輯已重寫,以提高性能,并在 Android 和 iOS 上顯著提升速度。
重大更改 ??
TypeScript 中的觸摸組件
像 TouchableOpacity 和 TouchableHighlight 這樣的觸摸組件現在是函數組件,不能在泛型表達式中用作類型。
import { TouchableHighlight } from 'react-native';
const ref = useRef<TouchableHighlight>();
改為使用 React.ElementRef 或 View 類型。
import { TouchableHighlight } from 'react-native';
const ref1 = useRef<React.ElementRef<typeof TouchableHighlight>>();
// 或
const ref2 = useRef<View>();
停止支持舊平臺
React Native 0.75 是最后一個支持 minSdk 23(Android 6.0)和 minIOSVersion 13.4 的版本。從 React Native 0.76 開始,最低支持版本將是 Android 7.0(minSdk 24)和 iOS 15.1。更多詳細信息可以在 Android 和 iOS 的官方公告中找到。
移除 Android 上的 JSIModule
com.facebook.react.bridge.JSIModule API 最初是為了促進原生模塊在 Android 上直接訪問 JSI,但在 0.74 版本中棄用,且使用很少,因此在 0.75 版本中徹底移除。開發者應過渡到使用 Turbo Native Modules 來實現類似功能。
Android 彈出菜單的更改
為模塊化核心功能,Android 的 PopUpMenu 已被提取到一個單獨的包中。以下核心方法已被棄用:
- UIManagerModule.showPopupMenu()
- UIManagerModule.dismissPopupMenu()
開發者現在應使用 @react-native/popup-menu-android 包中的 <PopupMenuAndroid /> 組件。
完成 iOS 上 PushNotificationIOS 的棄用
隨著 PushNotificationIOS 模塊的持續棄用,0.75 版本中移除了幾個舊的 API:
- + (void)didReceiveLocalNotification:(UILocalNotification *)notification;
- + (void)didReceiveRemoteNotification:(NSDictionary *)notification;
推薦使用更新的 API didReceiveNotification:(UNNotification *)notification,以更好地符合當前的通知標準。
社區 CLI 的更新
為提高性能和專注于現代工具,兩條命令已從社區 CLI 中移除:
- ram-bundle:隨著 Hermes 的引入,該命令已過時,Hermes 是默認的 JS 引擎。不再推薦直接加載內存包。
- profile-hermes:該分析工具使用了過時的 .cpuprofile 格式,與最新的 Chrome 版本不兼容。現在可以通過“實驗新調試器”中的“Profiler”面板訪問 CPU 分析功能。
這些更新反映了 React Native 致力于現代化開發體驗的承諾,確保更好的性能并保持與當前標準的兼容性。本次發布為更強大和高效的應用程序開發鋪平了道路。
React Native 0.75 的其他重大更改 ??
通用
- 代碼生成:從 C++ TurboModules 類名中刪除了 Cxx 標記。
- 浮點枚舉:由于精度錯誤,不再支持。
- 錯誤處理:在向非可空參數傳遞 null 時拋出錯誤。
- 代碼檢查:ESLint 不再運行 Prettier。
C++
- ScrollViewShadowNode:在構造函數中新增 bool includeTransform 參數。
- RuntimeExecutor:移除了 executeAsynchronously 和 executeSynchronously_CAN_DEADLOCK。
- 錯誤處理:將 JsErrorHandlingFunc 重命名為 OnJsError。
- 導入:從 ReactPrimitives.h 中移除未使用的導入。
- 方法:LongLivedObjectCollection 和 LongLivedObject 現在接受一個 Runtime 參數。
- 文件重命名:utils/jsi.h 重命名為 jsi-utils.h。
TextInput
- 回調移除:移除了已棄用的 onTextInput 回調。
Pressability
- 方法移除:移除了 onLongPressShouldCancelPress_DEPRECATED、onResponderTerminationRequest_DEPRECATED 和 onStartShouldSetResponder_DEPRECATED。
Android
- ReactViewBackgroundDrawable:已棄用,建議使用 CSSBackgroundDrawable。
- ReactContext:現在是抽象類;使用 BridgeReactContext 和 BridgelessReactContext。
- 布局:支持百分比彈性間隙值。
- 運行時:從 ReactHostImpl 中移除了 ReactJsExceptionHandler。
- 開發支持:DevSupportManagerFactory.create() 現在接受 PausedInDebuggerOverlayManager。
- 測量:刪除了 UIManagerModule.measureLayoutRelativeToParent()。
iOS
- 運行時:移除了 [RCTHost getSurfacePresenter] 和 [RCTHost getModuleRegistry]。
- 圖像:移除了 RCTImageLoadingPerfInstrumentationEnabled。
- 錯誤處理:移除了通過 RCTBridge 訪問 RCTRedBox 的功能。
- CocoaPods:將 BUILD_FROM_SOURCE 重命名為 RCT_BUILD_HERMES_FROM_SOURCE。
- TextInput:移除了已棄用的 onTextInput 回調。
結論
React Native 0.75 引入了關鍵的更新,這些更新簡化了開發過程,并提高了性能和兼容性。開發者被鼓勵仔細審查這些更改,并更新他們的項目以確保平穩過渡。這一版本代表了 React Native 發展的重要一步,加強了該框架在提供現代、高效和穩健的開發體驗方面的承諾。