在 Node.js 的 ES Modules (ESM) 环境中,传统的 CommonJS 全局变量 __dirname
和 __filename
不再直接可用。这是因为 ES Modules 采用不同的模块解析策略,更加符合 ECMAScript 标准。因此,如果在使用 ES Modules 格式编写 Node.js 代码,需要使用不同的方法来获取当前模块的文件路径和目录路径。
这段代码演示了如何在使用 ES Modules 的 Node.js 应用中创建和使用 __dirname
和 __filename
这两个全局变量:
import { fileURLToPath } from 'url'; // 引入 url 模块的 fileURLToPath 方法
import { dirname } from 'path'; // 引入 path 模块的 dirname 方法
// 将当前模块的 URL (`import.meta.url`) 转换为本地文件系统路径,并赋值给全局变量 `__filename`
globalThis.__filename = fileURLToPath(import.meta.url);
// 使用 path.dirname 方法获取 __filename 的目录路径,并赋值给全局变量 `__dirname`
globalThis.__dirname = dirname(__filename);
import.meta.url
:
import.meta
是一个提供当前模块信息的对象,import.meta.url
返回当前模块的绝对 URL
。file://
开头。fileURLToPath(import.meta.url)
:
fileURLToPath()
函数将 URL 字符串转换为对应的本地文件系统路径。这是必须的转换,因为文件系统 API(如 Node.js 的 fs
模块)需要文件路径而不是 URL。dirname(__filename)
:
dirname()
函数接受一个文件路径作为参数,返回该路径的目录部分。globalThis.__filename
和 globalThis.__dirname
,这段代码创建了与 CommonJS 环境中相同的全局变量。globalThis
是一个包含所有全局变量的全局对象,它在所有 JavaScript 环境中可用,包括浏览器和 Node.js。__dirname
和 __filename
的现有 Node.js 代码。通过这种方式,你可以在 Node.js 的 ES Modules 项目中,便捷地使用传统的目录和文件名路径变量,保持代码的可读性和可维护性。