为了账号安全,请及时绑定邮箱和手机立即绑定

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 的 minSdkVersioncompileSdkVersion 分别调整为 24 和 35。

EAS构建版:

  • 默认的 iOS 构建环境现在使用 macOS 14.6Xcode 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 组件:将 Web 和原生应用连接起来

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 模块接口 API

Expo Modules API 在 SDK 52 中迎来了重大更新,提升了类型安全、内存管理和事件处理的能力。这些改进让开发和维护模块变得更加简单,同时轻松集成更多高级功能。关键更新包括:。

  • SharedRef 共享支持: 改进了在包之间共享和验证 SharedRef 类型,使直接在 JavaScript 中进行类型检查变得更加容易。
  • 内存管理: 增强了 SharedObject 支持,引入了更好的内存压力处理,以实现大原生数据对象的高效垃圾回收处理。
  • 媒体处理: 添加了对 CMTime(iOS)和 Duration(Android)作为可转换类型的支持,简化了基于时间的媒体处理。
  • 自定义根视图: 现在开发人员可以通过 ExpoAppDelegateSubscriberProtocol 中的 customizeRootView 自定义 iOS 的根视图,从而更好地控制应用初始设置。
  • Android 生命周期事件: 添加了 OnUserLeavesActivity 事件,用于检测用户退出应用。
  • 简化事件 API: 新的 useEventuseEventListener 钩子减少了重复事件代码的需要,简化了模块中的事件管理。
  • C++ EventEmitter: 迁移到 C++ 实现改进了事件处理的性能和可靠性。
  • 更简单的 AAR 包装:expo-module.config.json 中的新 android.gradleAarProjects 配置简化了第三方 AAR 的集成过程。
  • Web 模块支持: registerWebModule 现在允许定义具有事件支持的类型安全的 Web 模块,弥补了 Web 和原生开发之间的差距。
Expo 展区

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 的未来发展奠定了基础。

电报/Instagram/脸书/Threads/GitHub
点击访问每项链接。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消