ts-node启用ES模块时遇.ts扩展名错误,绝对路径配置受阻
解决Express ES模块+绝对路径的两难问题
场景1:修复ts-node开发模式的扩展名报错
你遇到的TypeError [ERR_UNKNOWN_FILE_EXTENSION]是配置冲突导致的,按以下步骤调整:
- 修改tsconfig的模块解析策略
把moduleResolution从bundler改为node——bundler是给webpack/vite这类打包工具设计的,Node.js环境下的ES模块需要用node解析规则,同时补充目标版本确保兼容性:
"compilerOptions": { // ...其他原有配置 "moduleResolution": "node", "target": "ES2020" }
- 调整dev脚本参数
修正nodemon和ts-node的执行参数,避免转义问题并明确ES模块模式:
"scripts": { // ...其他原有脚本 "dev": "nodemon --watch src/**/*.ts --exec ts-node --esm --experimental-specifier-resolution=node src/index.ts" }
同时保留tsconfig里的ts-node配置:
"ts-node": { "swc": true, "esm": true, "experimentalSpecifierResolution": "node" }
- 检查依赖完整性
确保安装了ts-node、@swc/core、@types/node、@types/express这些核心依赖,避免因缺失依赖导致的隐性报错。
场景2:修复tsc编译后绝对路径失效问题
如果想用concurrently + tsc watch + nodemon的方案,需要解决TSC不自动替换路径别名的问题:
- 安装路径转换工具
npm install tsconfig-paths --save-dev
- 修改运行脚本
在start和dev脚本中加入路径注册,让Node.js识别TS里配置的别名:
"scripts": { "build": "npx tsc", "start": "node -r tsconfig-paths/register dist/index.js", "dev": "concurrently \"npx tsc --watch\" \"nodemon -q -r tsconfig-paths/register dist/index.js\"", // ...其他原有脚本 }
- 补充tsconfig配置
添加rootDir指定源码目录,确保编译后的文件结构和路径映射匹配:
"compilerOptions": { // ...其他原有配置 "rootDir": "./src" }
通用注意事项
- ES模块模式下,所有导入语句必须写全文件扩展名(比如
.js),即使是TS文件也需要——编译后会自动转为对应JS文件,可在tsconfig中开启allowImportingTsExtensions仅用于开发阶段简化写法。 - 把package.json的
main字段改为编译后的入口文件,更符合生产环境规范:
"main": "./dist/index.js"
内容的提问来源于stack exchange,提问作者kriptonian
相关产品推荐
相关产品推荐

