使用TypeScript与Express的Node.js应用启动时遇多种错误的解决咨询
TypeScript与Express的Node.js应用启动时遇多种错误的解决咨询
看起来你在启动TypeScript + Express的Node.js应用时碰到了几个典型的配置冲突问题,我来帮你一步步拆解原因并解决:
先理清每个错误的根源
TypeError: Unknown file extension '.ts'(运行npm run dev或ts-node src/app.ts时)
你的package.json里设置了"type": "module",这让Node默认采用ES模块规范来解析文件,但ts-node默认是按CommonJS模式运行的,两者不兼容就导致了无法识别.ts文件的扩展名错误。Error: Cannot find module(运行ts-node dist/app.js时)
首先,dist目录里是TypeScript编译后的.js文件,根本不需要用ts-node来运行——直接用node命令就行;其次你的package.json里start脚本写错了(写的是node dist/app.ts),dist里根本没有.ts文件;另外如果没执行过npm run build,dist目录可能是空的,自然找不到模块。
分步修复方案
1. 修正package.json的核心配置
- 先把错误的
start脚本改对:"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node dist/app.js", // 改成运行编译后的js文件 "dev": "nodemon", "build": "tsc" }, - 如果你不想每次都给ts-node加参数,可以在
package.json里直接配置ts-node启用ES模块:"ts-node": { "esm": true }
2. 调整nodemon.json适配ES模块
因为项目用了ES模块,需要让nodemon调用ts-node时启用ES模式:
{ "watch": ["src"], "execMap": { "ts": "ts-node --esm" // 加上--esm参数 }, "ext": "ts", "ignore": ["src/**/*.spec.ts"] }
3. 优化tsconfig.json的模块解析配置
针对ES模块调整moduleResolution,同时补充一些实用配置:
{ "compilerOptions": { "module": "ESNext", "target": "ESNext", "moduleResolution": "bundler", // 替换原有的node,更适配ES模块 "esModuleInterop": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "outDir": "./dist", "rootDir": "./src", "resolveJsonModule": true, // 允许导入json文件(可选但常用) "allowSyntheticDefaultImports": true // 配合esModuleInterop更好地兼容CommonJS模块 } }
验证修复的步骤
- 先删掉现有的
dist目录(如果有),执行npm run build,检查dist目录下是否生成了app.js等编译后的文件; - 执行
npm run start,测试生产环境启动是否正常; - 执行
npm run dev,修改src目录下的代码,看nodemon是否能自动重启且无报错。
如果还是有问题,可以检查下是否全局安装了ts-node或者nodemon,尽量用项目本地的依赖(通过npx调用,比如npx ts-node --esm src/app.ts)来避免版本冲突。
备注:内容来源于stack exchange,提问作者M BHARATH
相关产品推荐
相关产品推荐

