Expo SDK 38 现已发布
⏰ 托管工作流中的新通知 API
🦋 Bare 工作流程中的构建时更新
⚡️更快的模具,更好的性能
💡 全新标签页模板:更简洁,支持深色模式,采用 TypeScript 编写
✨ 新功能
🛠 API改进和新增功能
🧹 停止支持 SDK 34;下个版本将停止支持 SDK 35
🌟 ExpoKit → 裸工作流程
⬆️ 升级您的应用
Expo CLI
今天,我们正式发布 2020 年夏季版——Expo SDK 38!☀️😎 SDK 38 🍉☀️!SDK 38 延续了我们对可靠性和开发者灵活性的重视,致力于支持 Expo 全套工具中所有可定制的应用。此外,SDK 38 还新增了对 React Native 0.62 的支持、全新和改进的模板,以及一些实用的新模块。
SDK 38 是我们今年计划发布的四个季度 SDK中的第二个。继续阅读,了解更多详情!
⏰ 托管工作流中的新通知 API
今年早些时候,我们对 Expo 通知模块进行了全面重写。我们很高兴地宣布,改进后的 API 现在更加可预测,让您可以更轻松地控制通知,并且与裸机和托管工作流完全兼容!点击此处expo-notifications查看新API的文档。
我们尤其喜欢的一项改变是,现在各个平台的通知处理方式保持一致。通知行为现在遵循一个简单的原则:
如果通知是在应用处于后台运行时触发的,
- 它立即呈现。
- 申请过程中并未被告知这一点。
如果通知是在应用处于前台运行时触发的,
- 该应用程序不仅能立即收到相关信息,而且……
- 它还可以在运行时决定是显示提示信息还是播放声音!(更多信息请参阅通知处理程序文档。)
遗憾的是,由于我们在 2020 年承诺按时发布新版本,因此在准备此模块时未能加入对通知类别的支持。我们正在努力尽快将其加入到项目中expo-notifications,届时它将立即在 Bare 工作流程中可用,敬请期待!
从旧版通知 API 迁移
import { Notifications } from 'expo';为了兼容性,旧版通知 API ( ) 仍保留在 SDK 38 中,但它已被弃用,我们预计将在即将发布的版本中将其移除。
在 Android 系统上,通知一次只能转发到两个 API 中的一个,因此目前您需要通过在应用配置中设置 `on_new_api` 来显式启用新 API android.useNextNotificationsApi。true如果该值为 `undefined` 或false`false`,则推送通知在 Android 系统上将仅转发到旧版通知 API。在 iOS 系统上,您无需额外配置即可使用新 API。
🦋 Bare 工作流程中的构建时更新
在上个版本中,我们推出了expo-updates全新的库,它允许您在任何 React Native 应用中使用空中下载更新。点击此处查看文档。
我们最近发布了该库的更新版本,expo-updates@0.2.x它简化了 Bare 工作流应用程序中的更新流程。具体来说,它引入了构建时更新,这意味着
- 发布版本会在构建时从磁盘上的 JavaScript 源代码创建并嵌入一个新的更新,而不是嵌入你最新发布的更新;
- 您不再需要
expo publish在首次创建发布版本之前运行任何命令。
有关更多详细信息,包括如何从 升级expo-updates@0.1.x,请阅读此指南。
⚡️更快的模具,更好的性能
我们特别兴奋地宣布,我们正在进行一些改进,旨在让您的开发和启动体验更加快捷!
首先,我们重新推出了创建 React Native 应用的最快方法。全新升级的版本现在除了支持 iOS 和 Android 之外,还支持 Web,开箱即用 OTA 更新,提供 25 多个模板供您选择,而且零依赖!点击此处create-react-native-app了解更多信息。
此外,如果您选择使用更强大的功能expo-cli,您会发现安装速度快得多;我们已将整体磁盘空间占用量减少了高达 2.6 倍。如果您引导启动一个新的 SDK 38 项目,其占用空间node_modules将比类似的 SDK 37 项目小 13%。
这些软件包的性能也得到了提升;我们发布的是转译后的 JS 而不是 JSX,并且放弃了 prop-types 而改用 TypeScript,这两点都带来了更快的编译速度。
💡 全新标签页模板:更简洁,支持深色模式,采用 TypeScript 编写
我们用 TypeScript 重写了标签页模板,剔除了所有冗余部分,专注于开发者构建应用所需的核心功能。此外,我们还加入了暗黑模式支持,因为我们发现,与其后期添加,不如从一开始就考虑好。
上图展示的是 iOS 系统,但与以往一样,该模板在 Expo 支持的其他平台(Android 和 Web)上也同样适用。
✨ 新功能
- 验证
- 谷歌字体
- 屏幕截图
- 状态栏
- 链接
- 滑块
- 拾取器
- 贮存
重新构想的身份验证
我们已expo-auth-session使用 Expo WebBrowser 和 Crypto 等原生组件完全重写了代码。这不仅减小了应用体积,还减少了原生代码重建的需求,因为它可以与多种不同的支付服务商兼容。此外,我们还能在 SDK 版本更新之间持续进行更新,修复 bug 并添加新功能!您可以查看我们针对 15 种以上不同支付服务商的指南,我们会定期更新这些指南。
谷歌字体
Expo 的软件包 允许您 在 Expo 应用中@expo-google-fonts 轻松使用fonts.google.com上的 991 种字体(及其变体)。
这些软件包和所有字体都可在网页、iOS 和 Android 平台上使用,并且免费开源。更多详情请阅读此处和文档。
新增屏幕截图模块
为了让开发者更好地掌控应用的安全,我们新增了一个expo-screen-capture模块,允许您在用户进行屏幕录制或截图时隐藏应用内容;如果屏幕显示敏感信息,此功能尤其有用。有关参考资料、示例和限制,请参阅文档。
新状态栏模块
我们还创建了一个expo-status-bar模块,它对 React Native 内置的 StatusBar API 进行了一些重要的改进。这个新模块translucent默认将 Android 上的状态栏设置为“显示”,并且还通过 `--light` 和 `--dark` 属性支持浅色和深色模式style="auto"。style="inverted"我们已将该模块添加expo-status-bar到所有项目模板中expo-cli。请阅读文档,并查看更新后的“配置状态栏”指南。
改进的链接
新expo-linking软件包让创建深度链接变得前所未有的容易,这些链接既可以在托管工作流项目中使用,也可以在裸工作流项目中使用,并且可以与 React Navigation v5 和我们的 Auth Session API 无缝集成。
第三方模块
为了提升性能,我们一直在从 React Native 中提取模块。为了保持运行时环境的更新,我们改进了部分提取包的性能,并为其添加了 Web 支持,使其与 Expo 生态系统兼容。
Expo客户端现已提供以下软件包:
@react-native-community/slider@react-native-community/picker@react-native-community/async-storage@react-native-community/segmented-control
最后,您现在可以@react-native-community/async-storage在托管工作流应用程序中使用它了。此更改向后兼容,因此您无需更新到 SDK 38 即可开始使用它。此更改不会添加任何新功能或改进,但确实有助于您更轻松地与其他假定您使用该库的库集成@react-native-community/async-storage。
这些软件包并非由 Expo 完全维护,因此测试覆盖率、TypeScript 支持和 Web 兼容性可能有所不同。我们将继续仅使用软件包的最稳定版本。
🛠 API改进和新增功能
后台下载和上传expo-file-system
下载外部资源可能是一项复杂的任务,涉及许多特殊情况,例如应用程序切换到后台时的处理。为了解决这个问题,expo-file-system我们现在支持后台下载,即使用户切换应用程序或设备断开网络连接,下载也不会中断。此外,我们还新增了一种原生处理文件上传的方法。更多信息,请参阅文档。
新的android.softwareKeyboardLayoutModeapp.json 键
在移动应用中构建表单时,一个棘手的问题是开发者需要确保屏幕上的“软件键盘”不会遮挡当前聚焦的表单元素。Android 允许你选择如何处理这个问题:你可以调整整个窗口的大小,使键盘下方不显示任何内容;或者你可以平移窗口,使内容不位于其下方。控制此功能的原生属性是android:windowSoftInputMode……
过去,所有 Expo 应用都默认配置为使用布局resize模式,但一些开发者发现启用该模式后,诸如标签栏之类的 UI 元素会被推到键盘上方,从而影响应用体验。如果您希望使用该模式pan,现在可以直接在应用配置中设置布局模式。请在“使用 app.json 进行配置”的“android”部分android.softwareKeyboardLayoutMode查找相应的键值。
新的android.allowBackupapp.json 键
此版本中新增的另一项安全改进是允许开发者禁用Android 的自动备份功能。对于使用早期 SDK 构建的 Expo 应用,用户的应用数据会自动备份到他们的 Google 云端硬盘。SDK 38 中仍将保持默认设置(与 Android 原生应用相同),但如果您的应用处理敏感信息,则可能需要false在应用配置中将此字段设置为“否”。
React Native 0.62
SDK 38 包含了 React Native 0.62 的许多新特性和改进,其中包括:
Appearance通过模块和钩子支持深色模式useColorScheme(请注意,这些 API 不支持 Web,因此react-native-appearance如果这对您的应用程序很重要,您可能需要使用其他方法);- 无障碍功能改进,包括新增道具
accessibilityValue和事件onSlidingComplete; - React DevTools 进行了重大改进;
- 可选的全新 LogBox错误和警告体验;
还有更多精彩内容!请查看 React Native更新日志了解更多详情。
Flipper 目前在托管工作流程中不受支持。如果您想使用 Flipper,目前需要使用裸机工作流程(但您仍然可以在裸机工作流程中使用所有您喜欢的 Expo 模块!)。
其他修复和改进
本次版本更新还包含许多其他更改!请查看我们的更新日志了解完整列表。
🧹 停止支持 SDK 34;下个版本将停止支持 SDK 35
为了减少需要支持的版本数量,我们会定期停止维护使用率较低的 SDK 版本。本次发布标志着 SDK 34 的生命周期结束。与往常一样,您使用 SDK 34 构建的独立应用程序将继续运行;但是,SDK 34 项目将无法在最新版本的 Expo 客户端中运行。如果您想重新运行expo build,则需要从 SDK 34 升级,最好升级到 SDK 38,这样您在一段时间内就不需要再次更新(而且每个 Expo 版本都比上一个版本更好!)。
我们的下一个版本计划于九月发布,届时我们将停止对 SDK 35 的支持。如果您的项目正在使用 SDK 35,请考虑在未来几个月内升级到更新的版本。
AR移除
AR 模块(用于调用 iOS ARKit 库)自推出以来一直处于实验阶段,使用并不广泛。我们决定将有限的资源集中到其他方面,而不是继续维护该库。因此,在 iOS Expo 客户端 2.16.0 版本中,所有 SDK 版本均已移除 AR 模块。点击此处了解更多信息。
🌟 ExpoKit → 裸工作流程
去年 12 月,我们公布了 2020 年的计划,将投入巨资,让您能够随时随地使用原生代码灵活地定制应用。今年 3 月,我们宣布Bare 工作流已完全取代 ExpoKit。Bare和 ExpoKit 工作流的功能已达到或超过预期,因此我们在 SDK37 中弃用了 ExpoKit,并且不再支持在新项目中使用 eject 功能切换到 ExpoKit。
按计划,SDK 38 将是 ExpoKit 的最后一个版本。SDK 38 之后,您在 App Store 和 Play Store 中的 ExpoKit 应用将继续无限期运行,但您需要迁移到裸机或托管工作流才能获得 Expo 模块中的错误修复和新功能。
了解更多详情,包括将 ExpoKit 项目迁移到 Bare 工作流程的指南,请参阅这篇博客文章。
⬆️ 升级您的应用
以下是如何将您的应用从 Expo SDK 37.0.0 升级到 38.0.0 的方法:
- 在您的项目目录中运行
expo upgrade(需要最新版本expo-cli,您可以使用更新npm i -g expo-cli)。 - 请务必查看变更日志,了解其他重大变更!
- 从 App Store / Google Play 更新手机上的 Expo 应用。
expo-cli如果您删除现有应用,它将自动更新模拟器中的应用,或者您可以运行expo client:install:ios并expo client:install:android。 - 如果您之前构建过独立应用,请记住,您需要创建一个新的构建版本才能更新 SDK 版本。当您准备好创建新构建版本并提交到应用商店时,请运行
expo build:ios以下命令。expo build:android
注意:React Native 0.62在使用动画 API 时引入了一个新的警告Animated。现在,您需要为所有动画指定useNativeDriver:true` useNativeDriver:falseanimated` 属性。
将 ExpoKit 更新至 SDK 38
🗣 如果您有任何疑问或意见,请在我们的社区论坛上分享!我们也欢迎您在 GitHub 上提交问题报告(当然也欢迎提交 PR)。
文章来源:https://dev.to/expo/expo-sdk-38-is-now-available-5aa0

