Node 20.10+TypeScript5构建生产代码运行报错,求助解决
问题核心
你遇到的是TypeScript编译输出的模块格式与Node.js模块系统不兼容的问题:
- 初始报错是因为Node默认将.js文件视为CommonJS模块,但编译后的代码用了ES模块的
import语法,却没在package.json里声明模块类型。 - 添加
"type": "module"后报错,说明编译产物中仍存在CommonJS的exports语法,和ES模块环境冲突。
解决方案
方案一:统一使用ES模块(推荐,适配Node20+)
1. 调整package.json配置
确保package.json包含以下关键配置:
{ "type": "module", "scripts": { "build": "tsc", "start": "node dist/你的入口文件名.js" // 替换为实际的编译后入口路径 } }
2. 修改tsconfig.json适配ES模块
更新编译选项,让TypeScript输出纯ES模块代码:
{ "compilerOptions": { "module": "ESNext", // 或ES2020及以上版本,确保输出ES模块语法 "moduleResolution": "bundler", // Node20+推荐使用该配置,也可选择Node16 "target": "ES2020", // 匹配Node20原生支持的ES版本 "outDir": "./dist", "esModuleInterop": true, "skipLibCheck": true, "strict": true, "resolveJsonModule": true }, "include": ["src/**/*"], "exclude": ["node_modules"] }
⚠️ 注意:module字段不能设为CommonJS,否则编译后会生成exports语法,和"type": "module"冲突。
3. 检查迁移文件语法
确保src/migrations/6204401116637-InitDatabase.ts只使用ES模块的import/export语法,不要混用module.exports或require。如果用了第三方迁移工具(比如TypeORM),需确认工具支持ES模块,同时工具的配置文件也要遵循ES模块规范。
4. 重新构建并运行
清理旧编译产物后重新构建:
rm -rf dist npm run build npm start
方案二:改用CommonJS(兼容旧代码场景)
如果不想切换到ES模块,移除package.json中的"type": "module",并修改tsconfig.json:
{ "compilerOptions": { "module": "CommonJS", "moduleResolution": "Node", "target": "ES2020", // 其余选项保持不变 } }
这样TypeScript会把代码中的import/export编译成CommonJS的require/exports,Node就能正常识别运行。
内容的提问来源于stack exchange,提问作者HP . Htet Phyo Naing
相关产品推荐
相关产品推荐

