Expo SDK 52 预览:新架构成默认设置,更多新功能等你来探索
Expo SDK 52 的测试版现已推出,为开发人员提供了一个清晰的视图,了解即将发布的正式版本将包含哪些内容。此次更新通过将新架构设为新项目默认,展示了 Expo 对更好开发实践的承诺。此更改旨在为在 iOS 和 Android 上构建应用提供更加流畅和高效的体验。让我们一起来看看详细的更改,并看看这次更新带来了什么新东西给开发人员。
新建筑默认设置: SDK 52 默认使用新架构作为新项目的默认设置。需要注意的是:
npx create-expo-app (一个特定的命令或工具名称)模板 default@beta
你会看到在你的 app.json
中,newArchEnabled
设置成了 true
。对于从旧 SDK 升级的项目,新架构是可选的,但在成功使用旧架构升级后,我们推荐使用新架构。值得注意的是,在 SDK 53 中,这种新设置将可能成为默认设置,并且预计到 2025 年,旧架构将会被淘汰。
Expo Go 用户请注意: 从 SDK 52 开始,Expo Go 将仅支持新架构,这与整个 Expo 生态系统的变化保持一致。如果遇到兼容性问题,您仍然可以通过在 app.json
中将 newArchEnabled
设置为 false
,从而禁用新架构,并构建一个开发版本即可。
转向新架构
升级到 SDK 52 的开发者:
- 确保所有第三方原生库都已更新到最新版本。
- 使用
npx expo-doctor@latest
检测任何不兼容的库。该工具会与 React Native 目录进行交叉参照,并标出任何潜在问题。 - 了解已知问题,熟悉可能遇到的挑战,做好准备。
iOS 和 Android 的新消息:
- iOS 部署目标现在调整为 15.1(从 13.4),以满足 React Native 0.76 的需求。
- Android 的
minSdkVersion
和compileSdkVersion
分别调整为 24 和 35。
EAS构建版:
- 默认的 iOS 构建环境现在使用 macOS 14.6 和 Xcode 16.0。
更新升级的库:
- expo-video: 现已稳定发布,提供了一个功能强大的
expo-av
替代方案,功能更强大,包括锁定屏幕控制以及适用于 iOS 和 Android 的画中画支持。更新还包括一个可以替代expo-video-thumbnails
的缩略图生成器。 - expo-audio: 这个 beta 版本引入了一个更简单易用的音频 API,在易用性和常见音频用例的可靠性能之间取得了平衡。
- expo-file-system/next: 重新设计,包含了同步读写操作和有状态的文件管理,并保持向后兼容性。
- expo-live-photo: 新的 iOS 独占库,支持播放 Live Photos,并且在 expo-image-picker 中可以选取它们。
- expo-image v2: 引入了
useImage
钩子,用于预加载图像并访问其元数据,从而减少网络请求并提高性能。 - expo-camera: 在 iOS 上通过 Swift Concurrency 进行升级,从而提高可靠性。
DOM 组件通过允许开发人员使用 <div>
、<span>
等标签创建组件,并添加 "use dom"
指令后,可以将它们导入 React Native 组件中。这简化了从网页到原生应用的过渡。这些组件在 webview 中渲染,并且可以像平时一样接受 props,不过,像函数这样的非序列化 props 则需要特别处理。DOM 组件使在原生应用中直接使用网页库成为可能,这使得迁移网页项目或集成仅限网页的库变得更加简单。
示例用法:
- Protomaps 集成: 使用 DOM 组件来自定义地图图块。
- 球形照片查看器: 使用 DOM 组件快速实现的。
- 通用示例: 由 Evan Bacon 分享,适用于各种用例。
Expo 命令行工具
expo CLI 在 SDK 52 中引入了一系列新功能和改进,使开发更快更高效。以下这些更改旨在简化项目配置、构建流程和调试过程,从而提升开发者使用 Expo 的整体体验。以下是 Expo CLI 的主要更新:
- 通用树摇功能:自动移除未使用的 ESM 导入/导出,以增强 OTA 和网页性能。
- 启用 React 编译器支持:在应用配置中添加
"experiments": { "reactCompiler": true }
以启用实验性功能。 - 解析速度更快:现在所有平台的解析速度提高了 15 倍,已集成到 Metro 中,从 React Native 0.76 版本开始。
- 新的 iOS 运行命令标志:使用
npx expo run:ios --binary /path/to/bin
指定要启动的应用程序。 - 预构建:使用
npx expo run --eager
,在使用 Metro 编译前将 JavaScript 打包,加快构建过程。 - 调试增强功能:使用
EXPO_USE_METRO_REQUIRE=1
标志帮助识别缺失的模块。 - Monorepo 增强:默认启用
EXPO_USE_METRO_WORKSPACE_ROOT
以更好地处理 Monorepos,Metro 现在可以自动支持 pnpm Monorepos。 - CSS 模块嵌套:现在 CSS 模块可以导入其他 CSS 模块,以实现更好的模块化样式。
- Web 资源处理:使用
strings/ImageSource
更容易地与 web 生态系统集成。 - iOS 配置改进:新增
ios.appleTeamId
字段简化了多目标应用中 DEVELOPMENT_TEAM 的定义。 - 更小的 Expo CLI 大小:取消了对 RNC CLI 的依赖,自动链接由
expo-modules-autolinking
管理。使用@react-native-community/cli
,设置EXPO_USE_COMMUNITY_AUTOLINKING=1
并运行 pod install。
Expo Modules API 在 SDK 52 中迎来了重大更新,提升了类型安全、内存管理和事件处理的能力。这些改进让开发和维护模块变得更加简单,同时轻松集成更多高级功能。关键更新包括:。
- SharedRef 共享支持: 改进了在包之间共享和验证
SharedRef
类型,使直接在 JavaScript 中进行类型检查变得更加容易。 - 内存管理: 增强了
SharedObject
支持,引入了更好的内存压力处理,以实现大原生数据对象的高效垃圾回收处理。 - 媒体处理: 添加了对
CMTime
(iOS)和Duration
(Android)作为可转换类型的支持,简化了基于时间的媒体处理。 - 自定义根视图: 现在开发人员可以通过
ExpoAppDelegateSubscriberProtocol
中的customizeRootView
自定义 iOS 的根视图,从而更好地控制应用初始设置。 - Android 生命周期事件: 添加了
OnUserLeavesActivity
事件,用于检测用户退出应用。 - 简化事件 API: 新的
useEvent
和useEventListener
钩子减少了重复事件代码的需要,简化了模块中的事件管理。 - C++ EventEmitter: 迁移到 C++ 实现改进了事件处理的性能和可靠性。
- 更简单的 AAR 包装: 在
expo-module.config.json
中的新android.gradleAarProjects
配置简化了第三方 AAR 的集成过程。 - Web 模块支持:
registerWebModule
现在允许定义具有事件支持的类型安全的 Web 模块,弥补了 Web 和原生开发之间的差距。
Expo 路由器在 SDK 52 中引入了新的功能,增强了项目中的导航和集成能力,使开发过程更加灵活高效。开发者将更好地支持现代开发实践和实验性功能。
- React Server Components 预览版: 如在 React Conf 2024 上展示的,Expo Router 现在包含 React Server Components 的早期预览版本。此功能面向库开发者实验新的开发模式,但目前尚不适合正式使用,更多详情请参阅文档,完整的博客文章即将发布。
- React Navigation v7: Expo Router 现在支持 React Navigation v7 的 RC 版本,最终版本即将推出不久将发布。
- expo-router/ui Tabs API: 新的无头
<Tabs />
组件提供了一个类似于 Radix 的灵活且未样式化的标签布局,让网络上的自定义标签开发变得更加简单。 - 改进的 expo-router/link 导出: 以增强与未来
package.json
导出和服务器组件支持的兼容性,使代码更加灵活。 - 遗留订阅 API: 为使用支持
Linking.subscribe
但缺少原生 Expo Router 集成的服务(如 Branch)的项目添加了legacy_subscribe
方法。 - 站点地图配置选项: 开发者现在可以通过在
expo-router
配置插件中设置sitemap: false
来禁用内建的/_sitemap
路由。
expo-video
库已发布稳定版本,提供了一个更可靠且功能更丰富的替代方案,取代了expo-av
,并继承了其功能,其中包括适用于iOS和Android的锁屏控制和画中画模式功能。expo-audio
库现已进入测试阶段,提供了一个简洁的API,专注于处理音频,注重稳定性和易用性。另一个重大更新是expo-file-system/next
,它提供了同步读写操作和有状态的文件管理,并支持向后兼容。
一个新的库,expo-live-photo,允许iOS用户回放Live照片,并支持与expo-image-picker集成。新的版本expo-image v2
引入了 useImage
钩子,使图片预加载更高效,减少了网络流量。
- expo-av 视频 API 功能: 现已废弃,推荐使用 expo-video 替代。
- Expo Go 的变化: 不再支持 JSC;现在必须使用 Hermes。
-
移除的库文件:
expo-camera/legacy
,expo-sqlite/legacy
,expo-barcode-scanner
注:自 SDK 53 起,
_expo-notifications_
和_react-native-maps_
在 Android 版 Expo Go 中将不再受支持。开发人员应过渡到开发构建以继续使用。
Expo SDK 52 Beta 提供了一系列更新,使其更易于迁移到新架构。凭借这些改进,这个测试版为最终发布奠定了坚实的基础。开发人员应尝试一下这个测试版,将他们的项目更新以利用这些新功能,并在 Expo 社区分享他们的反馈。这次更新不仅优化了开发流程,也为 Expo 的未来发展奠定了基础。
共同学习,写下你的评论
评论加载中...
作者其他优质文章