(草稿箱里躺了半个月,写完赶紧发了)上周查文档,发现 Expo latest 已经升级 52,于是准备找机会把 DailyLift 的依赖升级到最新版本。这周一趁着 kick-off 还没开,尝试升级了一下,很顺利,1.5 小时升级完毕跑起来没什么问题,这里小记一下。
Expo v52 的主要升级(仅限我用到的)
- 新架构。(其实我不知道具体是什么新架构,不过听说有新架构字我觉得非升不可。)
- React Native 升级到 v0.76
- expo/fetch 可以支持流式传输,这样我们就不再依赖 SSE。不过,考虑到 React 和 React Native 自身的数据传递方式(缓存数据),和低频渲染,我觉得可能对实际开发的提升不大。
- expo-audio 重写了录音功能,支持后台录音,现在切换应用时不用担心录音断掉了。
- expo-live-photo iOS 下支持 live photo 了,不知道有多大价值,也许再 iOS用户眼里是个很重要的升级吧。
- React Native DevTools 这个非常重要,在国内使用不需要翻墙,且支持 Network 面板,升级非常明显。
主要变更
- iOS 基础版本升级到 15.1
升级步骤
首先,建议阅读官方的升级指引:https://expo.dev/changelog/2024/11-12-sdk-52。因为不同开发者都有自己的开发习惯,我的升级笔记未必适合所有人,官方的要全乎得多。
不过有一点,上面说“先把所有依赖升级到最新版“,而我的经验告诉我,React Native + Expo 不能乱升级依赖,否则几乎必挂。所以这里建议大家小心为上,项目能跑就别轻易升级,React Native 的环境太复杂了。
检查依赖
使用 npx expo-doctor@latest
检查依赖,确保所有依赖都支持新版本。因为我大部分功能依赖都是从 Expo 找来的,所以这一步基本上没遇到问题。只有少数纯 JS 或者统计之类的代码无法明确得到支持状态。
升级依赖
npx expo install expo@^52 --fix
重复 npx exp-doctor@latest
和 expo install --check
直到所有的依赖都安装完成并且检查通过。将其它 React Native 无关的仓库,比如 lodash,@supabase/supabase-js,@amplitude/analytics-react-native 等等也都升级到最新版本。
expo prebuild
重新构建原生开发目录。不过我建议,如果没有修改过原生开发目录里的文件,直接删掉然后重建会比升级更好。至少我这里第一次原址升级失败了,第二次完全重建才搞定。
调整代码
升级依赖完成之后,开始调整代码。我这方面没遭遇什么问题,基本上两个版本都顺利兼容。为数不多要修改的地方主要来自于早期对 Expo 不够熟悉而错误的混用了 Expo Stack 和 React navigation Stack。这是另一个话题,等我下次分享出来。
总结
整体来说升级过程比较顺畅和平滑,这得益于我之前尽量使用 Expo 推荐的功能库,并且不 hack 代码。所以整个项目比较稳定可靠。
建议大家在条件允许的情况下都尽快升级到 Expo v52。如果大家遇到什么问题,欢迎留言讨论。
欢迎吐槽,共同进步