React 18 + Next.js TypeScript项目集成React Three Fiber遇'ReactCurrentOwner'未定义错误求助
React 18 + Next.js TypeScript项目集成React Three Fiber遇'ReactCurrentOwner'未定义错误求助
嘿,这个错误我之前在React 18 + Next.js的项目里也踩过坑!给你几个亲测有效的排查和解决方向,你可以挨个试试:
锁死兼容React 18的R3F稳定版本
你说不能用alpha版(确实要React 19),那直接装适配React 18的最后几个稳定版就行,我当时用的是:npm install @react-three/fiber@8.15.12 @react-three/drei@9.92.7(用yarn或pnpm的话把npm换成对应命令就行),这两个版本完全兼容React 18,不会触发
ReactCurrentOwner的问题。确保所有R3F相关组件都是客户端组件
你已经加了"use client"指令,这个是对的,但要注意:如果你的Overview.tsx是被服务器组件导入的,一定要保证R3F的所有渲染逻辑都在客户端组件里,别把Canvas这类R3F组件放到服务器组件里渲染,Next.js的App Router对服务器/客户端组件的边界卡得很严。统一React和ReactDOM的版本
有时候项目里的react和react-dom版本不一致也会搞出这种奇怪的错误,你可以先跑个命令看看:npm list react react-dom如果看到版本不一样,就统一装18.2.0的稳定版:
npm install react@18.2.0 react-dom@18.2.0清理缓存+重启项目
别小看缓存的问题!我当时就是删了缓存才好的:- 删掉项目根目录的
node_modules文件夹和package-lock.json(yarn用户删yarn.lock) - 重新跑
npm install - 彻底关掉Next.js的dev服务器,再重新启动
npm run dev
- 删掉项目根目录的
检查Next.js版本
尽量用13.4.0以上的App Router稳定版,早期的13.x版本对客户端组件的兼容有bug,容易和R3F冲突。
对了,给你贴个我当时能用的Overview.tsx示例,你可以对比下自己的代码有没有问题:
"use client"; import { Canvas } from "@react-three/fiber"; import { Box, OrbitControls } from "@react-three/drei"; export default function Overview() { return ( <div style={{ width: "100%", height: "600px" }}> <Canvas camera={{ position: [5, 5, 5] }}> <ambientLight intensity={0.5} /> <directionalLight position={[3, 5, 2]} /> <Box position={[0, 0, 0]}> <meshStandardMaterial color="#42a5f5" /> </Box> <OrbitControls /> </Canvas> </div> ); }
按这几步来,应该能解决这个问题!
备注:内容来源于stack exchange,提问作者Wer Wer
相关产品推荐
相关产品推荐

