如何在Node.js中导入不带扩展名的ES模块
如何在Node.js中实现无扩展名导入ES模块
在Node.js的ES模块(ESM)规范里,默认确实要求导入时必须带上完整文件扩展名,但可以通过以下几种方式实现无扩展名导入:
1. 借助TypeScript/构建工具处理
你提到的示例是TypeScript项目,这类场景下的无扩展名导入主要靠TS编译器或构建工具自动处理:
- 编写TS代码时可以直接用
import { xxx } from './utils'这种无扩展名写法 - TypeScript编译器(
tsc)在将TS编译为JS文件时,会自动补全正确的扩展名(比如.js) - 像ESBuild、Vite这类现代构建工具,也会在开发或构建阶段自动解析无扩展名的导入,内部补全符合ESM规范的扩展名后再输出文件
2. 使用Node.js实验性解析标志
Node.js提供了实验性的解析选项,能让ESM使用类似CommonJS的扩展名自动补全逻辑,启动项目时添加该标志即可:
node --experimental-specifier-resolution=node your-entry-file.js
注意这个特性目前仍处于实验阶段,行为可能会在后续版本中变化,不建议在生产环境随意使用。
3. 配置package.json的imports字段
在项目根目录的package.json中配置imports字段,通过路径别名映射隐式补全扩展名,比如:
{ "imports": { "#utils/*": "./src/utils/*.js" } }
之后就可以用import foo from '#utils/foo'替代import foo from './src/utils/foo.js',实现无扩展名导入。
4. 自定义模块加载器
Node.js允许编写自定义加载器,拦截模块解析流程,自动为无扩展名的导入尝试补全常见扩展名(如.js、.mjs、.ts)。不过这种方式需要编写额外的加载器代码,复杂度较高,仅适合特殊场景。
内容的提问来源于stack exchange,提问作者yuanzui_cf
相关产品推荐
相关产品推荐

