Node16下如何强制TypeScript生成带.js后缀的导出/导入?
解决TypeScript编译ESM时自动添加.js后缀的问题
要让TypeScript自动为ESM模块的导入/导出语句添加.js后缀,你需要调整tsconfig.json的配置,适配Node.js的ESM模块解析规则:
- 修改
module和moduleResolution配置项为NodeNext(或Node16,两者功能一致,NodeNext是更通用的命名) - 确保
package.json中"type": "module"的配置保持不变
具体配置修改示例
将你的tsconfig.json调整为如下内容:
{ "compilerOptions": { "target": "ES2020", "module": "NodeNext", "moduleResolution": "NodeNext", "outDir": "./lib", // 保留你原有的其他配置(如strict、declaration等) }, "include": ["src/**/*"] }
为什么原配置不生效?
你之前使用的module: ES2020 + moduleResolution: node组合,TypeScript会遵循ES模块的语法标准,但不会自动添加Node.js ESM要求的文件后缀——Node.js的ESM系统强制要求导入路径必须包含完整的文件扩展名(如.js),而旧的node模块解析模式不处理这个后缀补全逻辑。
切换到NodeNext/Node16模式后,TypeScript会完全对齐Node.js的模块解析规则:
- 对于ESM模块(配合
package.json的type: module),编译后的导入/导出语句会自动添加.js后缀 - 同时支持混合CJS/ESM模块的场景,兼容更多Node.js版本的模块系统
修改配置后重新编译,你的index.js中的导出语句会自动变为:
export { Spig } from './spig.js';
此时Node CLI程序就能正确找到依赖模块,无需手动修改后缀。
内容的提问来源于stack exchange,提问作者igr
相关产品推荐
相关产品推荐

