TS编译输出导入缺.js扩展名报错,如何在ES6项目中免扩展名要求?
TS编译输出至Node ESM项目的扩展名缺失问题解决
优先方案:通过TS原生配置自动生成合规的导入语句
这套配置不需要额外工具、不需要手动修改编译产物,也不需要绕开Node ESM的硬约束,一次配置长期生效:
- 打开独立TS模块的
tsconfig.json,调整两个核心配置:- 将
module配置项设置为NodeNext - 将
moduleResolution配置项同步设置为NodeNext
- 将
- 编写TS模块源码时,所有本地相对路径的导入语句主动补上
.js后缀即可。TypeScript会自动把导入路径里的.js后缀映射到对应的.ts源文件完成类型检查,不会抛出类型不匹配的报错。 - 配合现有的
tsc -w监听编译流程,最终输出到目标ES6项目的JS文件中,导入语句会完整保留带.js后缀的写法,完全匹配Node运行时的解析要求。
示例:TS源码中写入
import { helper } from "./utils.js",编译输出的JS文件对应位置的导入语句为import { helper } from "./utils.js",无需二次修改。
备选方案:通过Node自定义加载器自动补全扩展名
你之前查到的“运行时配置忽略扩展名”的方法,原实现是针对Web静态资源服务场景的,不适用于Node本地ESM运行环境,对应适配Node的落地方法如下:
- 在目标ES6项目根目录新建
esm-loader.mjs文件,写入自定义解析逻辑,拦截所有不带扩展名的本地导入路径,自动补全.js后缀后完成加载。 - 调整现有nodemon启动命令,接入自定义加载器:
nodemon --exec "node --loader ./esm-loader.mjs src/index.js" - 调整完成后,哪怕TS编译输出的导入语句不带
.js后缀,Node运行时会在解析阶段自动补全,不会触发ERR_MODULE_NOT_FOUND错误。
注意:该方案仅适用于本地开发场景,不建议在生产环境使用,避免和原生ESM规则产生解析歧义。
内容的提问来源于stack exchange,提问作者Muhammed Aydogan
相关产品推荐
相关产品推荐

