本文详细解析在 React 项目中使用 @react-three/drei 的 useGLTF 加载本地 .gltf 文件时常见的路径错误(如返回 HTML 而非模型文件)、解决方案及最佳实践,帮助开发者快速定位并修复 3D 模型加载失败问题。
在 React + Three.js 项目中,利用 useGLTF 加载 3D 模型时,你可能会遇到一个令人困惑的错误提示:Unexpected token '<', '。这个错误看着挺唬人,但本质其实很简单——浏览器没有获取到真正的 GLTF 模型文件,而是被服务器返回了一个 HTML 页面,通常是开发服务器的 fallback index.html。说白了,就是资源路径没有正确匹配,被前端路由或 Webpack 开发服务器中途拦截了。今天我们就来彻底解决这个 GLTF 模型加载路径问题。
✅ 正确路径规则:必须使用 / 开头的绝对路径(相对于 public 根目录)
先记住一条核心原则:useGLTF 内部使用的是浏览器原生的 fetch 方法,它无法识别 Node.js 风格的绝对路径(比如 C:/Users/...),也不支持相对路径写法(比如 ./FSFenix_Render.gltf)。唯一可靠的做法就是将 GLTF 文件放置在public/目录下,并使用/开头的路径进行引用:
import { useGLTF } from '@react-three/drei';
function Model() {
const { nodes, materials } = useGLTF('/FSFenix_Render.gltf'); // ✅ 正确:/ 表示 public/ 根目录
return (
);
}
⚠️ 几个关键注意事项:
- ✅ 模型文件必须正确放置在 public/FSFenix_Render.gltf(如果放在子目录,比如 public/models/FSFenix_Render.gltf,路径应写为 /models/FSFenix_Render.gltf);
- ❌ 避免使用 C:/...、./...、../... 或 src/... 这类路径——运行时浏览器无法访问这些位置;
- ❌ 不要将 .gltf 文件放在 src/ 目录下并尝试通过模块导入——useGLTF 只接受 HTTP 可访问的 URL,不支持模块导入机制;
- ✅ 如果使用 gltfjsx 生成组件,记得手动将 useGLTF(...) 中的路径修改为 /xxx.gltf 格式;
- ? 修改路径后务必重启开发服务器(npm start / yarn dev),缓存未清除可能导致修改无效。
? 验证路径是否有效
如何确认路径配置正确?打开浏览器开发者工具的 Network 面板,刷新页面,找到 FSFenix_Render.gltf 这个请求:
- ✅ 成功:状态码为 200,Type 显示为 glb 或 json,Preview 中可以看到二进制或 JSON 结构数据;
- ❌ 失败:状态码虽然为 200,但 Type 显示为 html,Preview 中呈现的是
——这说明路径有误,服务器返回了 index.html 作为替代。
? 进阶建议
优化加载体验:结合 Suspense 和 ErrorBoundary 组件,妥善处理加载状态和异常情况:
import { Suspense } from 'react'; import { Canvas } from '@react-three/fiber'; function App() { return ( ); }推荐使用 GLB 格式:如果模型包含纹理和动画,建议优先导出为 .glb 格式。单文件二进制结构,部署更简单,也避免了外部资源路径的复杂问题;
生产环境检查:构建完成后,务必确认 public/ 目录中的 GLTF 文件已被正确复制到最终的 dist/ 目录。Create React App 默认会处理此步骤,但其他脚手架可能需要手动验证。
按照这套规范操作,那个“HTML instead of GLTF”的报错基本上就不会再出现了。让 3D 模型在 React 应用中稳定、高效地运行,也就不是什么难事。
