You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:05:00