Frontend & Mobile Engineering Weekly:Rosetta 进入退场期,Expo Go 开始要求登录
这周没有新的 Flutter、React 或 Vue 大版本,真正会改项目排期的还是平台和工具链。Apple 把 Rosetta 的退出时间说清楚了,Expo Go 在真机开发里加上了登录,pnpm 12 正式发布后的第一轮密集修 bug 也露出几个升级时要盯的点。Next.js 同时公开了 Turbopack 新的分包实验,已经有明确前端性能问题的项目可以开始针对性验证。
Apple 9 月 1 日发布了 Rosetta 支持调整说明 (opens in a new window)。从 macOS 26.4 开始,依赖 Rosetta 的 App 启动时可能收到系统提示,要求用户更新到 Apple silicon 原生版本,macOS 27 则是 Apple silicon Mac 最后一个还能运行 Intel-only App 的 macOS 版本。Apple 建议尚未完成迁移的开发者现在就提供 universal binary。
纯 Dart 的 Flutter macOS App 通常不太受影响,因为 Flutter 自己早就支持 Apple silicon,真正麻烦的是打进包里的原生二进制、闭源 SDK、命令行工具和老插件。某个依赖如果还只有 x86_64 slice,主应用就算已经是 arm64,也不能把迁移当成完成。macOS 产品可以在 CI 或发版前检查最终 .app 里的 Mach-O 文件,确认关键依赖是否包含 arm64,并在真实 Apple silicon 机器上取消“靠 Rosetta 也能跑”的假设。
Electron、Node CLI、Flutter desktop 和其他带原生扩展的项目,也应该把这件事放进依赖管理。维护者长期不提供 arm64 binary 的 package 现在已经有明确的停止支持时间,没必要因为这则公告重写桌面技术栈,但 Intel-only 原生依赖不该再搁着,而应当成有截止日期的兼容工作。
Expo 在 9 月 3 日宣布,最新版 iOS Expo Go 运行项目时要求登录 (opens in a new window)。开发机上的 Expo CLI 和 iPhone 上的 Expo Go 都需要登录,而且必须用同一个 Expo 账号,Android 版本后续也会跟进。模拟器暂不受影响,development build 也不要求这样登录。
正常使用 Expo 账号的个人开发流程受影响不大,但共享测试机、培训环境、临时真机调试,以及不希望把开发账号放进设备的团队需要改流程。过去 npx expo start 之后,任意装了 Expo Go 的设备扫二维码就能加载项目,现在 iOS 真机必须先登录。
更关键的是 development build 不受影响。已经把真实项目从 Expo Go 转到自定义 development build 的团队没有迁移压力,如果项目还把 Expo Go 当成团队长期测试环境,与其做共用账号这类绕过,不如借这次变化重新判断要不要切到 development build。
pnpm 12 上周正式发布,本周从 12.2 一路更新到 12.3.2 (opens in a new window)。这些版本大部分是修 bug,但有几项能说明 12.x 刚升级时会踩到什么。
12.3.0 修了本地目录、本地 tarball 和 file:<path> 依赖无法正常 pnpm add 的问题,也修了 .npmrc 里 :_authToken="${TOKEN}" 这类带引号的环境变量展开后认证失败的问题。循环 peer dependency 再碰上 npm alias 时,--lockfile-only 还可能生成后续无法通过 --frozen-lockfile 的锁文件。12.3.1 又修了从 12.2 self-update 到 12.3 后,node、npm、yarn 等全局命令因 shim 迁移而无法启动的问题。12.3.2 继续修 Windows 文件时间精度导致 pnpm run / pnpm exec 每次都重新安装的问题,也继续优化大型 workspace 的解析和 lockfile 写入。
这些问题多数已经修掉,所以不必把 pnpm 12 当成不稳定版本,但从 11 升 12 时最好直接验证当前最新 12.x,不要把 12.0.0 当作目标版本。私有 registry、本地 file: 依赖、Windows 开发机、全局命令管理以及复杂的 peer dependency 都应该纳入升级测试。大型 Monorepo 可以顺便记下安装耗时,因为 12.2/12.3 连续在工作区扫描、依赖解析和 lockfile 保存上做了性能优化,但官方 changelog 里的数字替代不了你自己仓库的基准。
Next.js 团队 9 月 3 日发布了 Turbopack chunking 的设计说明 (opens in a new window),解释当前默认算法如何在请求数量、重复下载和跨页面缓存之间取舍,并介绍 Next.js 16.3 新增的两个实验方向。
experimental.turbopackChunking.generateComponentChunks 会同时生成合并和未合并的 chunk,运行时按浏览器已经加载的内容挑更省的那份,减少页面跳转时因为 chunk 被合并而重复下载代码。另一类实验允许继续调整 module fragments 这类拆分方式。官方在 nextjs.org 的测试里展示了默认策略、完全不合并、更激进合并之间的请求数和下载量差异,但这些数字只对得上它自己的站点和跳转路径,套不到别的应用上。
项目如果没有明确的包体或跳转性能问题,继续用默认策略更合适。大型内容站、路由很多的 SaaS,或者已经通过 RUM 发现客户端跳转在重复下载的项目,可以单独做实验,对比真实用户路径,而不是只看一次首页 Lighthouse。实验开关也要和 Next.js 升级分开提交,方便出现回归时快速撤回。
本周新开的 GitHub issue 正好说明这些开关现在有多脆。#98128 (opens in a new window) 在一个很小的 Pages Router 复现项目中报告 turbopackModuleFragments 会触发 panic,#98205 (opens in a new window) 则报告了另一个 Turbopack module graph panic。它们目前只是特定实验配置下的已报告问题,不能据此判断默认 Turbopack 构建存在同样风险,但足以说明这些新开关暂时不适合在生产项目里随手全开。
Swift.org 9 月 4 日发布 What’s new in Swift: August 2026 Edition (opens in a new window)。这一期不是新的 Swift 正式版本,而是官方社区摘要,内容跨度比较大。其中几条对长期方向还有参考价值,Swift + WebAssembly 的前端实验在继续推进,Swift on Windows 仍在补工具链体验,安全敏感代码则继续用 Span、non-copyable types 和 strict memory safety 缩小 unsafe 范围。
这些内容目前还撑不起 iOS App 换技术选型。对移动团队更实际的是 Swift 能跑的平台还在变多,以后共享业务代码或 CLI 不一定只能待在 Apple 生态里,不过 ElementaryUI 这类 Swift Web UI 项目仍然年轻,适合作为技术观察,不适合当成 React/Vue 的替代方案进入正式选型。
Flutter 本周没有新的 stable release。3.47 系列已经在前几期讨论过 Apple 最低版本、SwiftPM、桌面 Impeller 和 Web 相关回归,本周没有足够的新证据,不必把那些结论再放大一遍。
Flutter 团队近期发布的 iOS 适配流程文章 (opens in a new window) 补了一个值得留下的工程细节。团队会在 WWDC 后按影响范围筛选 Apple 的平台变化,再用纯 UIKit 复现来区分问题出在 Flutter 还是系统。文章里的 WebView 手势案例也说明,PlatformView 一类问题不能只靠 Flutter widget test 判断根因。应用团队遇到 iOS 新版本的原生视图回归时,先做最小 Swift/UIKit 复现,通常比继续在完整 Flutter 工程里调参数更快定位。
没必要只因为零散的 3.47 issue 就暂缓整个 SDK 系列,用了 WebView、PlatformView、桌面纹理或较老 Windows GPU 的项目仍应单独做回归,其他移动项目可以按已有升级计划推进。
这周最明确的长期兼容工作来自 macOS,Rosetta 已经有清楚的退出时间,桌面项目该开始盘点 Intel-only 原生依赖。React Native / Expo 团队则需要留意 Expo Go 的登录要求,如果团队还高度依赖共享真机扫码调试,development build 会比共用账号更稳妥。
pnpm 12 已经可以进升级分支,但本周连续修掉的本地依赖、registry token、shim 和 lockfile 问题说明,升级验证不能只看一次安装成功。Next.js 16.3 的 Turbopack 分包值得对性能比较在意的项目拿来试,现阶段仍应看真实跳转数据再决定是否开启,而不是把实验开关当成默认优化。