You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用nodemon运行TypeScript文件时出现ERR_UNKNOWN_FILE_EXTENSION错误

解决ERR_UNKNOWN_FILE_EXTENSION错误(TypeScript + ESM + ts-node)

环境配置

  • 生产依赖: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

  1. 创建/修改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"]
}
  1. 更新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的支持更原生,无需额外复杂配置:

  1. 安装tsx开发依赖:
npm install tsx --save-dev
  1. 更新scripts:
"scripts": {
  "dev": "nodemon --watch \"src/**/*.ts\" --exec \"tsx src/index.ts\" --delay 2",
  "start": "tsx src/index.ts"
}

内容的提问来源于stack exchange,提问作者hasan khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:16:10