ES模块导入省略扩展名失败求助:./app无法导入但./app.js可行
解决ES模块导入时省略扩展名报错ERR_MODULE_NOT_FOUND的问题
我之前也踩过这个坑,折腾了好一阵才搞明白来龙去脉,给你梳理清楚:
首先核心原因是当package.json里设置了"type": "module"时,Node.js会严格遵循ES模块规范,要求导入路径必须指定完整的文件扩展名——这和Node默认的CommonJS模块系统不一样,CommonJS会自动尝试补全.js、.json这类扩展名,但ES模块不会,这是Node官方的规范要求,和Babel本身无关。
那为什么教程里用./app就能正常导入?大概率是教程里的项目没开启"type": "module",还是用的CommonJS模块系统,或者额外配置了自动补全扩展名的工具。
针对你的情况,有两个可行的解决方案:
方案一:保持使用完整扩展名(最推荐)
就像你现在成功运行的写法import app from "./app.js",这完全符合Node ES模块的规范,没有兼容性问题,也是最省心的做法。
方案二:配置Babel插件自动补全扩展名
如果你实在想省略扩展名,可以借助babel-plugin-module-resolver插件实现:
- 先安装插件:
npm install babel-plugin-module-resolver --save-dev
- 修改你的
babel.config.json,添加插件配置:
{ "presets": ["@babel/preset-env"], "plugins": [ ["module-resolver", { "extensions": [".js", ".json"] }] ] }
- 之后用
@babel/node运行项目时,它会在编译阶段自动为你补全导入路径的扩展名,这样你就能用import app from "./app"了。
另外提一句,你的Node版本v13.60应该是笔误吧?应该是v13.6.0?早期Node的ES模块支持确实有一些细节差异,但核心的扩展名要求是一直存在的。
内容的提问来源于stack exchange,提问作者Leonard
相关产品推荐
相关产品推荐

