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 发展的重要一步,加强了该框架在提供现代、高效和稳健的开发体验方面的承诺。
首发于公众号 大迁世界,欢迎关注。📝 每周一篇实用的前端文章 🛠️ 分享值得关注的开发工具 ❓ 有疑问?我来回答
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。