__filename和__dirname不是真正的全局变量,而是CommonJS模块加载时动态注入的模块级变量;在REPL和ES Modules环境中因无模块上下文而不可用。

因为 __filename 和 __dirname 不是 Node.js 真正的全局变量,而是 CommonJS 模块系统在加载每个文件时**动态注入的模块级变量**。REPL 运行环境不隶属于任何模块,没有“当前脚本文件”的概念,所以这两个变量自然不可用。
REPL 没有模块上下文
Node.js 的 REPL 是一个独立的交互式执行环境,它不对应任何物理文件,也不被包裹在 CommonJS 模块函数中(即不是形如 (function(exports, require, module, __filename, __dirname) { ... }) 的封装)。而 __filename 和 __dirname 正是这个封装函数的参数,只在模块加载时由 Node 内部传入。REPL 里没有这层封装,也就没有这些参数。
ES Module 环境下同样不可用
即使你用 .mjs 或 "type": "module" 启用了 ES Modules,__filename 和 __dirname 依然不可用——因为 ES Modules 标准本身不定义它们。Node.js 只在 CommonJS 模块中提供这两个变量。这也是为什么你在 ES 模块中直接写 console.log(__filename) 会报 ReferenceError。
ZenHeart zenlink 与 zenlink-mcp 为 OpenClaw,涵盖安装、MCP 注册、钩子接线、入站轮询及升级维护。
如何在 REPL 中模拟它们
虽然不能直接访问,但你可以手动构造:
- 用
process.cwd()获取当前工作目录,近似替代__dirname(注意:不是严格等价,因为__dirname是“脚本所在目录”,而 REPL 没有脚本) - 用
require.main?.filename查看主模块路径(如果有的话),但 REPL 通常没有require.main - 若想测试路径逻辑,可临时创建一个
test.js文件,在里面使用__filename,再用require('./test')加载它
其他类似变量也受限
同理,require、module、exports 在纯 REPL 中虽可用,但行为与模块内不同(例如 module 是 REPL 自己创建的空模块对象);而 global 和 process 这类真正的全局对象始终可用。

















