
如何在 zx ESM 脚本中使用 __filename 和 __dirname【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx写.mjs脚本时经常需要定位脚本自身的路径——比如读取与脚本同目录的配置文件、fixture 文件。但 Node.js 的 ESM 模块并不提供__filename和__dirname这两个 CJS 时代的全局变量直接引用会报错。zx 在通过 CLI 执行脚本时把这两个全局变量注入到脚本环境中你在.mjs脚本里可以直接使用无需任何 import。本文给出从准备到验证的完整操作路径。ESM 中缺失的这两个全局变量CLI 文档 明确说明了这个背景和 zx 的补全方式In ESM modules, Node.js does not provide__filenameand__dirnameglobals. As such globals are really handy in scripts, zx provides these for use in.mjsfiles (when using thezxexecutable).也就是说这两个全局变量是zx 的可执行文件CLI在加载脚本时注入的适用条件是.mjs文件且通过zx命令运行。从 src/cli.ts 的实现可以看到注入的具体取值export function injectGlobalRequire(origin: string): void { const __filename path.resolve(origin) const __dirname path.dirname(__filename) const require createRequire(origin) Object.assign(globalThis, { __filename, __dirname, require }) }__filename是脚本文件路径经path.resolve解析后的绝对路径__dirname是该路径的目录部分即脚本所在目录注入目标是globalThis与脚本内同时提供的require()来自同一次注入。准备条件按 docs/setup.md 的要求准备环境操作系统Linux、macOS 或 WindowsJavaScript 运行时Node.js 12.17.0或 Bun 1.0.0、Deno 1.x/2.x、GraalVM Node.jsbash 或 PowerShell。安装 zxnpm install zx编写使用这两个全局变量的脚本新建script.mjs使用.mjs扩展名见 docs/getting-started.md内容如下import path from node:path console.log(__filename) console.log(__dirname) // 以脚本所在目录为基准定位同目录文件 const configPath path.join(__dirname, config.json) console.log(configPath)__filename和__dirname不需要从任何包导入也不需要在脚本里import zx/globals——它们由 zx CLI 注入全局作用域。运行与验证用 zx CLI 执行zx script.mjsnpx zx script.mjs同样有效见 docs/cli.md。预期输出三行第一行是script.mjs的绝对路径即__filename第二行是它所在目录的绝对路径即__dirname第三行是拼接出的config.json路径。仓库自带了可对照的验证方式。测试 test/cli.test.js 中的用例__filename __dirname are defined执行 test/fixtures/filename-dirname.mjs该脚本断言strict.equal(path.basename(__filename), filename-dirname.mjs) strict.equal(path.basename(__dirname), fixtures)即__filename的 basename 应等于脚本文件名、__dirname的 basename 应等于脚本所在目录名断言全部通过即说明这两个全局变量已正确定义。你可以按同样思路验证自己的脚本检查path.basename(__filename)是否等于你的脚本文件名、path.basename(__dirname)是否等于脚本所在目录名。边界与限制必须通过 zx 可执行文件运行。文档将适用范围限定为 when using thezxexecutable直接用node script.mjs启动时Node 的 ESM 环境不会提供这两个变量。Markdown 脚本中的指向通过zx运行.md脚本时__filename指向该markdown.md文件本身见 docs/markdown.mdconsole.log(chalk.yellowBright(__filename))取值基于脚本路径而非调用方式__filename由脚本路径经path.resolve解析而来因此用__dirname拼接同目录文件如config.json时不依赖脚本被从哪个工作目录启动。与__filename/__dirname配套注入的require()同样只在经 zx CLI 运行.mjs时可用文档在 docs/cli.md 的 require() 一节有独立说明本文不再展开。如果执行zx script.mjs后__filename未定义先确认两点脚本扩展名是否为.mjs以及是否确实用 zx 的 CLI而不是裸node启动脚本。【免费下载链接】zxA tool for writing better scripts项目地址: https://gitcode.com/GitHub_Trending/zx/zx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考