TypeScript+Node.js中如何无后缀用ES6语法导入模块?
解决Node.js + TypeScript ES模块目录导入报错问题
问题根源
Node.js 的 ES 模块解析规则中,直接导入目录(如./config)时,不会自动查找目录下的index.js文件,除非目录内存在package.json并指定入口文件,或者导入时明确指定文件名(如./config/index.js)。你的 TypeScript 编译后生成的代码保留了./config的导入路径,导致 Node 抛出ERR_UNSUPPORTED_DIR_IMPORT错误。
解决方案
1. 给目标目录添加package.json
在src/config目录下创建package.json文件,内容如下:
{ "type": "module", "main": "./index.js" }
TypeScript 编译时会将该文件复制到dist/config目录下,Node 解析./config目录时,会读取这个package.json并自动加载index.js。
2. 调整tsconfig.json的模块解析配置
修改tsconfig.json中的module和moduleResolution字段,使其严格遵循 Node.js 的 ES 模块解析规则:
{ "compilerOptions": { // ... 其他原有配置 "module": "nodenext", "moduleResolution": "nodenext" } }
nodenext模式会让 TypeScript 完全对齐 Node.js 的模块解析行为,确保编译后的导入路径能被 Node 正确识别,同时允许你在源码中使用无后缀的导入语法。
3. 验证开发与生产环境
- 生产环境:执行
npm run start,编译后的代码会配合目录下的package.json完成正确导入。 - 开发环境:
ts-node/esm配合nodenext的模块解析配置,能直接识别无后缀的目录导入,无需额外修改启动命令。
注意:避免使用
--experimental-specifier-resolution=node启动 Node,该参数为实验性特性,不推荐用于生产环境。
内容的提问来源于stack exchange,提问作者Pluto
相关产品推荐
相关产品推荐

