如何将Node.js 16的TypeScript项目转为ES Module并解决运行报错
解决TypeScript Node.js项目转ES Module后nodemon启动报错问题
问题根源
当在package.json中设置"type": "module"后,Node.js切换到ES模块加载模式,但该模式默认无法识别.ts文件扩展名,常规ts-node调用未配置对应ES模块加载器,因此触发ERR_UNKNOWN_FILE_EXTENSION错误。
解决方案步骤
1. 补全依赖安装
确保安装ts-node及Node.js类型依赖(未安装则执行):
npm install ts-node @types/node --save-dev
2. 完善tsconfig.json配置
在已有配置基础上补充ES模块解析规则:
{ "compilerOptions": { "module": "ES2020", "target": "ES2020", "moduleResolution": "node", "esModuleInterop": true, "outDir": "./dist", "strict": true, "skipLibCheck": true }, "include": ["**/*.ts"], "exclude": ["node_modules"] }
moduleResolution: "node":让TypeScript遵循Node.js的ES模块路径解析规则outDir:指定编译产物输出目录,区分源码与编译文件
3. 配置nodemon的ES模块启动方式
方式一:命令行直接启动
替换原启动命令为:
nodemon --exec "node --loader ts-node/esm app.ts"
--loader ts-node/esm用于告知Node.js使用ts-node的ES模块加载器处理.ts文件。
方式二:使用nodemon配置文件
创建nodemon.json文件并写入:
{ "watch": ["**/*.ts"], "ext": "ts,json", "exec": "node --loader ts-node/esm app.ts" }
之后直接运行启动命令:
nodemon
4. 修正源码导入路径
ES模块要求导入时使用完整文件扩展名,示例:
// 错误写法 import { someFunc } from './utils'; // 正确写法 import { someFunc } from './utils.ts';
ts-node/esm会在编译阶段自动将.ts替换为.js扩展名。
验证
启动nodemon后,若不再出现ERR_UNKNOWN_FILE_EXTENSION错误且项目正常运行,说明配置生效。
内容的提问来源于stack exchange,提问作者jcubic
相关产品推荐
相关产品推荐

