Express实现React SSR时导入App.jsx报ERR_MODULE_NOT_FOUND错误
React SSR 报 ERR_MODULE_NOT_FOUND 排查及解决方案
这个报错和你用 CommonJS 还是 ES Module 没有直接关系,核心是 Node.js 原生环境不支持 JSX/TSX 语法解析,也不会自动补全这类 React 组件文件的后缀,按以下顺序排查即可:
- 首先补全导入语句的完整文件后缀
ESM 模式下 Node 不会自动补全.js/.jsx/.ts/.tsx后缀,你当前写的导入路径'../client/src/App'会被Node直接判定为不存在。先去本地目录确认App文件的实际后缀,把导入语句改成完整路径:
CommonJS 模式下的// 实际是jsx就写jsx,是tsx就替换成tsx import App from '../client/src/App.jsx'require语句同理,必须写全后缀,不要依赖前端构建工具那套自动补全后缀的解析逻辑。 - 配置服务端源码转译规则
Node 本身无法直接运行 JSX 语法,直接导入未转译的React组件就算路径写对了也会报错,两种成熟方案选一个就行:- 开发环境快速调试可以用babel实时转译:在服务端入口文件(express.js)的最顶部加入以下注册代码,提前处理所有jsx/tsx文件:
注意这段代码必须放在所有React组件导入语句之前,否则转译不生效。require('@babel/register')({ presets: [ '@babel/preset-env', ['@babel/preset-react', { runtime: 'automatic' }] ], extensions: ['.js', '.jsx', '.ts', '.tsx'] }) - 生产环境直接用构建工具(Webpack/Vite/Rollup)分别打包客户端代码和服务端SSR代码,输出Node可直接执行的纯JS产物,后续运行打包后的服务端文件即可,不需要运行原始源码。
- 开发环境快速调试可以用babel实时转译:在服务端入口文件(express.js)的最顶部加入以下注册代码,提前处理所有jsx/tsx文件:
- 核对路径准确性
手动打开文件资源管理器进入F:\ReactApp\client\src\目录,确认App文件的实际文件名没有拼写错误,再核对相对路径层级:express.js 位于 server 目录下,向上返回一级到项目根目录,再进入 client/src 目录,../client/src/这个层级本身是正确的,重点排查文件名大小写、后缀名问题即可。 - TypeScript 项目额外检查配置
如果项目用TS编写,检查 tsconfig.json 里的moduleResolution字段:用ESM规范时要设置为node16或者nodenext,不要设置为bundler,bundler配置仅适配Vite/Webpack等构建工具,Node原生运行时无法识别该解析规则。
注意:不要直接导入客户端入口的原始源码,客户端代码里如果直接调用了 window、document 等浏览器专属API,就算模块找到也会在服务端运行时报错,SSR场景下要把浏览器相关逻辑全部放到 useEffect 或者客户端专属生命周期里执行。
内容的提问来源于stack exchange,提问作者Firas SCMP
相关产品推荐
相关产品推荐

