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
相关产品推荐
相关产品推荐

