• 如何在使用 ES Modules 的 Node.js 应用中创建和使用 __dirname 和 __filename 这两个全局变量


    在 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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    代码详解

    1. import.meta.url:

      • 在 ES Modules 中,import.meta 是一个提供当前模块信息的对象,import.meta.url 返回当前模块的绝对 URL
      • 对于本地文件,这个 URL 会以 file:// 开头。
    2. fileURLToPath(import.meta.url):

      • fileURLToPath() 函数将 URL 字符串转换为对应的本地文件系统路径。这是必须的转换,因为文件系统 API(如 Node.js 的 fs 模块)需要文件路径而不是 URL。
    3. dirname(__filename):

      • dirname() 函数接受一个文件路径作为参数,返回该路径的目录部分。
      • 这里使用它来获取当前模块文件所在的目录路径。

    全局变量设置

    • 通过设置 globalThis.__filenameglobalThis.__dirname,这段代码创建了与 CommonJS 环境中相同的全局变量。globalThis 是一个包含所有全局变量的全局对象,它在所有 JavaScript 环境中可用,包括浏览器和 Node.js。

    使用场景

    • 这种设置通常用于需要在 ES Modules 环境中迁移或复用依赖于 __dirname__filename 的现有 Node.js 代码。
    • 它允许开发者在不大幅修改代码的情况下,使用模块路径相关功能,如读取相对路径的配置文件、访问相邻的模块或资源等。

    通过这种方式,你可以在 Node.js 的 ES Modules 项目中,便捷地使用传统的目录和文件名路径变量,保持代码的可读性和可维护性。

  • 相关阅读:
    欧科云链与HashKey Exchange达成合作,助力香港虚拟资产合规化
    考研C语言复习进阶(2)
    ThinkPHP高仿蓝奏云网盘系统源码/对接易支付系统程序
    电脑重做系统---win10
    汽车发动机电机右盖设计
    关于FlowUs这一款国民好笔记
    Matlab自学笔记二十三:字符串的提取、替换、插入和删除
    蓝牙核心规范(V5.4)11.2-LE Audio 笔记之LE Auido架构
    Mongodb介绍和安装(含安装包)
    动态格子算法
  • 原文地址:https://blog.csdn.net/u013190012/article/details/138182988