3.3 KiB
3.3 KiB
Next.js HMR错误解决方案
问题描述
Module [project]/novalon-website/node_modules/next/dist/compiled/react/jsx-dev-runtime.js [app-client] (ecmascript) was instantiated because it was required from module [project]/novalon-website/src/app/(marketing)/contact/page.tsx [app-client] (ecmascript), but module factory is not available. It might have been deleted in an HMR update.
原因分析
这是React 19和Next.js 16之间的兼容性问题,特别是在开发模式下的热模块替换(HMR)过程中。
解决方案
方案1:禁用实验性功能(推荐)
修改 next.config.ts,禁用可能导致问题的实验性功能:
experimental: {
optimizePackageImports: ['lucide-react', 'framer-motion', '@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
// 暂时禁用optimizeCss
// optimizeCss: true,
},
方案2:使用生产模式启动
如果HMR问题严重影响开发,可以使用生产模式启动:
npm run build
npm run start
方案3:降级React版本(不推荐)
将React降级到18.x版本:
npm install react@^18.3.0 react-dom@^18.3.0
方案4:升级Next.js版本(推荐)
升级到Next.js 15,它对React 19有更好的支持:
npm install next@^15.0.0
方案5:使用Turbopack替代
在 next.config.ts 中添加:
experimental: {
turbo: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
},
临时解决方案
快速修复脚本
运行以下命令清除缓存并重启:
# 停止开发服务器
lsof -ti:3000 | xargs kill -9 2>/dev/null
# 清除缓存
rm -rf .next node_modules/.cache
# 重新启动
npm run dev
使用修复脚本
chmod +x scripts/fix-dev-server.sh
./scripts/fix-dev-server.sh
深度清理
./scripts/fix-dev-server.sh --deep
长期解决方案
1. 等待Next.js更新
Next.js团队正在修复React 19的兼容性问题,建议关注Next.js的更新。
2. 使用稳定版本
考虑使用更稳定的React和Next.js版本组合:
- React 18.x + Next.js 14.x
- React 19.x + Next.js 15.x+
3. 禁用HMR(不推荐)
在 next.config.ts 中添加:
webpack: (config, { dev, isServer }) => {
if (dev && !isServer) {
config.watchOptions = {
ignored: /node_modules/,
};
}
return config;
},
推荐行动
短期(立即)
- ✅ 运行修复脚本清除缓存
- ✅ 禁用
optimizeCss实验性功能 - ✅ 如果问题持续,使用生产模式开发
中期(1-2周)
- 考虑升级到Next.js 15
- 或降级到React 18
- 监控Next.js的React 19支持更新
长期(1个月)
- 等待Next.js官方修复React 19兼容性
- 评估是否需要调整技术栈
- 建立更稳定的开发环境
监控和反馈
如果问题持续,请:
- 记录错误发生的频率和场景
- 检查是否有特定的文件或组件触发问题
- 在Next.js GitHub提交issue
- 关注Next.js的更新日志