使用TypeScript+nodemon+ts-node时,添加'type: module'至package.json后出现.ts文件未知扩展名错误求助
问题原因分析
当你在package.json中添加"type": "module"后,Node.js会默认把所有文件当作ES模块来处理,但Node本身并不认识.ts文件扩展名——它只会尝试解析.js、.mjs等原生支持的ES模块格式。
之前没加这个配置时,Node默认使用CommonJS模块系统,ts-node会自动把.ts文件转译为CommonJS格式的代码交给Node执行,所以一切正常。但切换到ES模块模式后,ts-node需要明确收到“要处理ES模块类型的.ts文件”的指令,否则Node会直接尝试读取.ts文件,从而抛出ERR_UNKNOWN_FILE_EXTENSION错误。
哪怕你清空.ts文件只留console.log,只要"type": "module"存在,Node就会以ES模块模式处理文件,它不认识.ts扩展名,自然报错。
解决方案
你可以通过以下两种方式解决这个问题:
方式一:在启动命令中给ts-node添加--esm参数
修改你的nodemon启动命令,明确告诉ts-node要启用ES模块支持:
nodemon --exec ts-node --esm src/file.ts
这个参数会让ts-node在ES模块模式下处理.ts文件,和package.json中的"type": "module"配置适配。
方式二:在tsconfig.json中配置ts-node的ES模块模式
如果你不想每次命令行加参数,可以在tsconfig.json中添加ts-node的配置块,指定启用ES模块:
{ "compilerOptions": { // 确保TypeScript输出ES模块格式 "module": "ESNext", "moduleResolution": "NodeNext", "target": "ES2020", // 至少ES2020以上,支持ES模块特性 // 你的其他编译配置 }, "ts-node": { "esm": true } }
这样配置后,直接运行原来的nodemon命令即可,ts-node会自动以ES模块模式处理文件。
额外注意事项
- 确保你的
tsconfig.json中的module和moduleResolution设置和ES模块兼容,比如"module": "ESNext"+"moduleResolution": "NodeNext"是比较推荐的组合。 - 如果你使用的是较新版本的ts-node,可能已经默认支持ES模块,但还是需要明确配置来和
package.json的"type": "module"对齐。
内容的提问来源于stack exchange,提问作者Timmiej93
相关产品推荐
相关产品推荐

