expo-camera移动端网页版触发React无效Hook调用 Expo Go运行正常
结论
你的业务代码不存在无效Hook调用的问题,所有useState、useEffect都定义在函数组件顶层作用域,没有违反Hook使用规则,Expo Go端可以正常运行也可以佐证这一点。
差异原因
为什么Expo Go可以正常运行
Expo Go是预编译的原生运行容器,内置的React版本和你项目依赖的Expo SDK对应React版本完全一致,包括expo-camera在内的所有依赖都会调用同一个React实例,不会出现版本冲突或多副本问题。
为什么Web部署后报错
Web生产构建时出现了React版本冲突,属于Invalid Hook Call错误的典型场景,最可能的原因有两个:
- 项目依赖的
react和react-dom版本不匹配 - 依赖树中存在多个不同版本的React副本,
expo-camera的Web端实现调用了和业务代码不同的React实例,导致触发Hook调用规则校验失败
修复方案
- 检查
package.json中react和react-dom的版本号,确保两者严格一致,比如react@18.2.0必须搭配react-dom@18.2.0使用 - 执行
npm ls react或yarn list react检查是否存在多个React版本,如果出现多版本,可通过npm的overrides字段或Yarn的resolutions字段全局锁定React版本 - 确认安装的
expo-camera版本和当前项目的Expo SDK版本完全匹配,不要跨SDK版本单独升级expo-camera - 重新构建Web包前先清除缓存,执行
npx expo start --clear后再执行生产构建命令,避免旧依赖缓存引发问题
内容的提问来源于stack exchange,提问作者pbuzz007
相关产品推荐
相关产品推荐

