Expo SDK51升级回滚后Storybook依赖解析失败求助
Expo SDK升级与Storybook依赖解析问题排查与解决
问题背景
我有一个集成Storybook的Expo React Native项目,原本基于expo@~48.0.21正常运行。尝试升级到Expo SDK51后,项目构建失败,出现错误:
Unable to resolve "storybook/internal/preview-api" from "node_modules\@storybook\preview-api\shim.mjs"
即使回滚到之前可用的旧版package.json,删除node_modules、package-lock.json后重新安装依赖,错误依然存在。但其他开发者使用完全相同的旧配置可以正常运行。我尝试过更新Storybook相关依赖版本,但问题未解决。
问题原因分析
- Storybook版本不兼容:
@storybook/preview-api8.x版本内部模块结构发生变化,而@storybook/react-native7.x依赖的是旧的内部模块路径,混合使用7.x和8.x版本会导致依赖解析失败。升级SDK51时可能无意中拉取了高版本的@storybook/preview-api,回滚后缓存残留导致问题持续。 - 缓存残留:metro缓存、npm/yarn缓存或Expo本地缓存未彻底清理,新旧依赖的缓存文件混合,导致解析逻辑混乱。
- 全局/本地expo-cli冲突:升级SDK51后,全局安装的expo-cli版本可能与项目本地SDK版本不匹配,干扰了依赖安装和项目启动流程。
解决方案
1. 彻底清理所有缓存与依赖文件
执行以下操作,确保完全清除残留的依赖和缓存:
- 删除项目根目录下的
node_modules文件夹 - 删除
package-lock.json(npm)或yarn.lock(yarn)文件 - 删除
.expo文件夹(Expo本地缓存) - 清理npm缓存:
若使用yarn:npm cache clean --forceyarn cache clean - 启动项目时强制清理metro缓存:
npx expo start --clear
2. 统一Storybook依赖版本
确保所有Storybook相关依赖版本一致,避免混合不同大版本。针对Expo 48(对应React Native 0.71),建议使用Storybook 7.x全系列:
修改package.json中的Storybook依赖为:
"@storybook/addon-ondevice-actions": "^7.6.20", "@storybook/addon-ondevice-controls": "^7.6.20", "@storybook/preview-api": "^7.6.20", "@storybook/react-native": "^7.6.20"
删除@storybook/react(Expo RN项目不需要web端的Storybook依赖)。
3. 避免全局expo-cli干扰
- 始终使用项目本地的Expo命令,即通过
npx expo ...执行操作,不要直接使用全局安装的expo命令 - 如果需要全局安装expo-cli,确保其版本与项目SDK版本匹配:Expo 48对应expo-cli 6.x,SDK51对应expo-cli 7.x
4. 重新安装依赖
执行依赖安装命令,确保依赖完全按照package.json声明的版本安装:
npm install
或
yarn install
5. 若需升级到Expo SDK51的适配方案
如果最终要升级到SDK51(对应React Native 0.74),需要升级Storybook到支持RN 0.74的版本,将所有Storybook依赖统一升级到8.2.x及以上:
"@storybook/addon-ondevice-actions": "^8.2.6", "@storybook/addon-ondevice-controls": "^8.2.6", "@storybook/preview-api": "^8.2.6", "@storybook/react-native": "^8.2.6"
同时按照Expo官方文档完成SDK51的升级步骤,确保所有Expo相关依赖同步升级到对应版本。
内容的提问来源于stack exchange,提问作者skassi
相关产品推荐
相关产品推荐

