使用nodemon运行TypeScript文件时出现ERR_UNKNOWN_FILE_EXTENSION错误
环境配置
- 生产依赖:cors、express、mongodb、mongoose
- 开发依赖:@types/cors、@types/express、@types/node、typescript、ts-node、nodemon
- package.json已设置
"type": "module" - 自定义scripts:
"dev": "nodemon --watch \"src/**/*.ts\" --exec \"ts-node src/index.ts\" --delay 2", "start": "ts-node src/index.ts"
错误信息
TypeError: Unknown file extension ".ts" for D:\projects of frontend\My Project\MERN PROJECT\backend\src\index.ts
at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:160:9)
at defaultGetFormat (node:internal/modules/esm/get_format:203:36)
at defaultLoad (node:internal/modules/esm/load:143:22)
at async ModuleLoader.load (node:internal/modules/esm/loader:396:7)
at async ModuleLoader.moduleProvider (node:internal/modules/esm/loader:278:45)
at async link (node:internal/modules/esm/module_job:78:21) {
code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
[nodemon] app crashed - waiting for file changes before starting...
测试代码
import express, {Request, Response} from 'express'; import cors from 'cors'; import 'dotenv/config'; const app = express(); app.use(express.json()) app.use(express.urlencoded({extended: true})) app.use(cors()) app.get("/api/test", async (req: Request, res: Response) => { res.json({ message: "hello from express endpoint!"}) }); app.listen(7000, ()=>{ console.log("server runnig on localhost 7000"); });
解决方案
问题核心是启用ESM模式后,ts-node默认未适配ESM解析规则,导致无法识别.ts文件。以下是两种解决方式:
方式1:配置ts-node适配ESM
- 创建/修改tsconfig.json
确保配置符合Node.js ESM规范:
{ "compilerOptions": { "target": "ES2020", "module": "NodeNext", "moduleResolution": "NodeNext", "esModuleInterop": true, "skipLibCheck": true, "strict": true, "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"], "exclude": ["node_modules"] }
- 更新package.json的scripts
在ts-node命令中添加--esm参数,强制启用ESM模式:
"scripts": { "dev": "nodemon --watch \"src/**/*.ts\" --exec \"ts-node --esm src/index.ts\" --delay 2", "start": "ts-node --esm src/index.ts", "build": "tsc" }
方式2:使用tsx替代ts-node(推荐)
tsx对ESM的支持更原生,无需额外复杂配置:
- 安装tsx开发依赖:
npm install tsx --save-dev
- 更新scripts:
"scripts": { "dev": "nodemon --watch \"src/**/*.ts\" --exec \"tsx src/index.ts\" --delay 2", "start": "tsx src/index.ts" }
内容的提问来源于stack exchange,提问作者hasan khan

