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

Node.js 10实验性ESM模块中__dirname未定义问题求助

解决Node.js 10 ESM模块中__dirname未定义的问题

你遇到的报错是因为ES模块(ESM)不像CommonJS(CJS)那样默认注入__dirname、__filename这类内置变量。Node.js处理.mjs文件时会启用ESM模式,而ESM基于URL规范设计,没有这些CJS专属的路径变量。

针对Node.js 10.0.0的解决方案

Node.js 10.0.0到10.11.x版本还没有url.fileURLToPath方法,所以我们需要用原生的URL API来手动转换模块路径:

import path from 'path';

// 获取当前模块的URL对象
const moduleURL = new URL(import.meta.url);
// 处理Windows系统下的路径格式(URL的pathname会带额外的开头斜杠,比如/C:/xxx)
const filePath = moduleURL.pathname.replace(/^\/([A-Za-z]:)/, '$1');
// 转换为文件系统绝对路径
const __filename = path.resolve(filePath);
// 得到模块所在目录(即__dirname)
const __dirname = path.dirname(__filename);

console.log(__dirname);

如果你的Node.js版本升级到了10.12.0及以上,可以用更简洁的方式:

import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

console.log(__dirname);

运行命令说明

你之前的启动命令是正确的,因为Node.js 10的ESM是实验性特性,必须加上--experimental-modules参数:

node --experimental-modules index.mjs

关键注意点

  • 别用process.cwd()替代__dirname:前者是终端执行命令时的工作目录,后者是当前模块文件所在的目录,两者可能完全不同,不能混用。
  • ESM的import.meta.url是每个模块的专属URL,格式类似file:///MyFolderPath/node-10/index.mjs,我们通过它来推导文件系统路径。

内容的提问来源于stack exchange,提问作者deadcoder0904

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:52:51