Node 20中ESM省略.js扩展名导入失效问题求助
Node 20中省略.js扩展名导入ES模块失效问题(Node 16可正常运行)
问题背景
项目已在package.json中设置"type": "module",Node 16环境下执行node --experimental-specifier-resolution=node index.js,可省略.js扩展名导入sayHello模块;但升级到Node 20.10.0后,该命令不再生效,无法找到对应模块。
相关代码:
package.json
{ "name": "test", "engines": { "node": "20.10.0" }, "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "type": "module", "author": "", "license": "ISC" }
sayHello.js
export function sayHello() { console.log('hello'); }
index.js
import { sayHello } from "./sayHello"; sayHello() console.log(process.version);
问题原因
Node 20正式移除了--experimental-specifier-resolution=node这个实验性命令行参数。该参数原本是为了让ES模块兼容CommonJS的导入习惯(省略扩展名),但从Node 17开始就被标记为废弃,Node 20彻底移除该特性,转而严格遵循ES模块标准规范——ES模块要求导入时必须显式指定文件扩展名。
解决方案
1. 遵循ES模块标准(推荐)
直接在导入语句中添加.js扩展名,这是最符合标准的做法,无需额外配置:
import { sayHello } from "./sayHello.js";
2. 使用导入映射(Import Maps)
若需批量管理模块导入路径,可在项目根目录创建importmap.json文件:
{ "imports": { "./sayHello": "./sayHello.js" } }
执行命令时指定导入映射:
node --experimental-import-maps=importmap.json index.js
注:--experimental-import-maps在Node 20中仍为实验性特性,后续可能有调整。
3. 使用自定义加载器
通过第三方加载器实现省略扩展名的解析,比如@node-loader/esm:
先安装依赖:
npm install @node-loader/esm --save-dev
再执行命令:
node --experimental-loader @node-loader/esm index.js
内容的提问来源于stack exchange,提问作者Yaron Levi
相关产品推荐
相关产品推荐

