Node v20.5.1运行npm run dev报.ts未知扩展名错误求助
解决Node.js 20.5.1下运行
npm run dev出现的.ts文件扩展名未知错误 问题背景
运行npm run dev时触发错误:TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts",当前Node版本为20.5.1。已尝试全局重装TypeScript、使用ts-node --esm启动,但问题仍未解决。
配置核心冲突分析
从提供的文件来看,问题根源在于模块系统配置不一致:
tsconfig.json中compilerOptions.module设为CommonJS,但ts-node配置开启了esm: true,两种模块规范混合导致TS文件解析异常。package.json的dev脚本直接调用nodemon src/server.ts,nodemon默认无法处理TypeScript文件,未指定TS执行器。
具体解决方案
1. 统一模块系统配置
修改tsconfig.json,消除CommonJS与ESM的冲突,二选一即可:
方案一:保持CommonJS规范
{ "compilerOptions": { "target": "es6", "module": "CommonJS", "outDir": "./dist", "rootDir": "src", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "moduleResolution": "node", "skipLibCheck": true, "plugins": [ { "transform": "typescript-transform-paths" } ] }, "include": ["src/**/*.ts"], // 修正路径范围,仅监听src目录下的TS文件 "exclude": ["node_modules"], "ts-node": { "esm": false // 关闭ESM模式,与CommonJS匹配 } }
方案二:切换为ESM规范
{ "compilerOptions": { "target": "es6", "module": "ESNext", // 改为ESM模块 "moduleResolution": "node16", // 适配Node.js 16+的ESM解析逻辑 "outDir": "./dist", "rootDir": "src", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "plugins": [ { "transform": "typescript-transform-paths" } ] }, "include": ["src/**/*.ts"], "exclude": ["node_modules"], "ts-node": { "esm": true } }
同时修改package.json,添加ESM声明:
{ "name": "name-project", "version": "1.0.0", "type": "module", // 声明项目采用ESM规范 "main": "server.js", // 其余配置不变 }
2. 调整dev脚本,让nodemon正确处理TS文件
修改package.json的scripts.dev,指定用ts-node执行TS文件:
- 若用CommonJS方案:
"scripts": { // 其余脚本不变 "dev": "nodemon --exec ts-node src/server.ts" }
- 若用ESM方案:
"scripts": { // 其余脚本不变 "dev": "nodemon --exec ts-node --esm src/server.ts" }
3. 验证依赖版本兼容性
当前ts-node@10.9.1兼容typescript@4.8.4,若问题仍存在,可尝试升级ts-node:
npm install ts-node@latest --save-dev
测试验证
修改完成后,重新运行npm run dev,检查错误是否消失。
内容的提问来源于stack exchange,提问作者João Pablo Vilanir De Melo
相关产品推荐
相关产品推荐

