Vercel部署Next.js生成静态页面时遇useMemo相关错误求助
遇到的构建错误
> Build error occurred Error: Export encountered errors on following paths: / /: /en /: /pl /_error: /404 /_error: /500 /_error: /en/404 /_error: /en/500 /_error: /pl/404 /_error: /pl/500 /listing/[slugId]: /pl/listing/1 /listing/[slugId]: /pl/listing/10 /listing/[slugId]: /pl/listing/100 /listing/[slugId]: /pl/listing/11 /listing/[slugId]: /pl/listing/12
具体错误栈
TypeError: Cannot read properties of null (reading 'useMemo') at exports.useMemo (/vercel/path0/node_modules/.pnpm/react@18.2.0/node_modules/react/cjs/react.production.min.js:25:208) at Object.useDehydratedState (file:///vercel/path0/node_modules/.pnpm/@trpc+react-query@10.0.0-rc.3_y6yjugiwomqyvbrpc2lz4flpyi/node_modules/@trpc/react-query/dist/createHooksInternal-92c57b9a.mjs:379:29) at WithTRPC (/vercel/path0/.next/server/chunks/834.js:988:40) at Yd (/vercel/path0/node_modules/.pnpm/next@13.0.2-canary.2_mk5yftg2men2cn3ayx4t7ddtvy/node_modules/next/dist/compiled/react-dom/cjs/react-dom-server.browser.production.min.js:98:272)
项目现状
- 本地与Vercel预览环境的.env变量完全一致
- 本地构建无任何错误
- 所有页面均放置在/pages目录下
- /listing类静态页面的fallback设置为false
- 所有依赖已更新至最新版本(包括next@13)
解决思路
调整TRPC版本
错误源于@trpc/react-query@10.0.0-rc.3的useDehydratedState调用useMemo时触发异常。RC版本稳定性不足,建议降级到TRPC 9.x稳定版,或升级到TRPC 10的正式发布版(若已推出),避免使用候选版本。校验静态生成的TRPC数据预取逻辑
针对静态页面构建场景,检查getStaticProps中TRPC数据预取后的脱水(dehydrate)流程是否正确。确保服务端预取的数据能完整传递给客户端组件,防止静态生成过程中React Hook调用环境异常。适配多语言路由的TRPC配置
错误涉及多语言路径(/en、/pl),确认TRPC客户端在不同语言路由下的初始化逻辑是否正常,避免因路由上下文缺失导致Hook调用时React环境为null。临时关闭React Strict Mode排查
在next.config.js中关闭React Strict Mode,验证是否是严格模式下的双重渲染导致TRPC脱水状态异常:module.exports = { reactStrictMode: false, };注意:此为临时排查手段,不建议长期关闭。
统一Vercel与本地的依赖安装环境
本地构建正常但Vercel失败,可能是包管理器或依赖版本差异。在package.json中添加"packageManager": "pnpm@<你的本地版本>",强制Vercel使用与本地一致的pnpm版本,避免依赖安装不一致。检查页面的TRPC Provider包裹逻辑
确保/pages下所有页面都被正确的TRPC Provider包裹,且Provider在服务端渲染时能正常初始化,防止静态生成时因Provider未挂载导致Hook调用环境异常。
内容的提问来源于stack exchange,提问作者Łukasz Samulnik

