ts-node运行.ts文件报未知.ts扩展名及ES模块语法错误如何解决
问题根因
两个报错循环出现是ESM模式与ts-node默认配置不匹配导致的:
- 保留
package.json中"type": "module"配置时,Node.js会默认以ESM规范加载所有.js/.ts文件,但ts-node默认启动的是CommonJS加载器,无法识别ESM模式下的.ts文件扩展名,直接抛出ERR_UNKNOWN_FILE_EXTENSION错误 - 删除
"type": "module"配置后,Node.js会切回CommonJS加载模式,但代码使用了ESM规范的import语法,且安装的chalk v5+是纯ESM包,不支持CommonJS环境,因此抛出Cannot use import statement outside a module错误
可行解决方案
二选一即可,推荐优先用方案1,匹配当前依赖的ESM特性。
方案1:保留原生ESM模式
- 保留
package.json中的"type": "module"配置,不要删除 - 修改
tsconfig.json,补充ts-node的ESM支持配置,修正后的完整配置如下:
{ "compilerOptions": { "target": "esnext", "module": "esnext", "moduleResolution": "node", "esModuleInterop": true }, "ts-node": { "esm": true } }
- 不要直接用
ts-node index.ts命令启动,改用Node自定义加载器参数执行:
node --loader ts-node/esm index.ts
执行后即可正常输出蓝色的Hello world!结果。
方案2:切回CommonJS模式
如果不需要使用ESM特性,可以切回CommonJS规范,注意需要同步降级不支持CommonJS的依赖:
- 删除
package.json中的"type": "module"配置项 - 卸载当前的高版本chalk,安装支持CommonJS的v4稳定版:
npm uninstall chalk && npm install chalk@4
- 修改
tsconfig.json,将模块规范改为CommonJS,修正后配置如下:
{ "compilerOptions": { "target": "esnext", "module": "CommonJS", "moduleResolution": "node", "esModuleInterop": true } }
- 直接执行
ts-node index.ts即可正常运行代码。
避坑提示:使用ESM模式时不要手动把.ts后缀改为.mjs,会导致ts-node的类型解析失效;如果提示加载器找不到,优先使用项目本地安装的ts-node依赖执行,避免全局版本与项目版本不一致的问题。
内容的提问来源于stack exchange,提问作者martins16321
相关产品推荐
相关产品推荐

