Files
novalon-website/docs/troubleshooting/HMR-ERROR-SOLUTIONS.md
T

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;
},

推荐行动

短期(立即)

  1. 运行修复脚本清除缓存
  2. 禁用 optimizeCss 实验性功能
  3. 如果问题持续,使用生产模式开发

中期(1-2周)

  1. 考虑升级到Next.js 15
  2. 或降级到React 18
  3. 监控Next.js的React 19支持更新

长期(1个月)

  1. 等待Next.js官方修复React 19兼容性
  2. 评估是否需要调整技术栈
  3. 建立更稳定的开发环境

监控和反馈

如果问题持续,请:

  1. 记录错误发生的频率和场景
  2. 检查是否有特定的文件或组件触发问题
  3. 在Next.js GitHub提交issue
  4. 关注Next.js的更新日志

相关资源