Node.js中__filename、__dirname、path.dirname()、process.cwd()、url.fileURLToPath等区别详解

246 阅读5分钟
  1. __filename

    __filename 是一个全局变量,返回当前模块的绝对路径(包括文件名)。

    返回值类型:string

    假设当前目录结构如下:

    /project
      ├── app.js
      ├── folder
          └── script.js
    

    在上面的 script.js 文件中使用 __filename

    // 输出当前文件 /project/folder/script.js
    console.log(__filename)
    
  2. __dirname

    __dirname 是一个全局变量,返回当前模块所在目录的绝对路径,返回值不受调用代码的位置影响。

    返回值类型:string

    假设当前目录结构如下:

    /project
      ├── app.js
      ├── folder
          └── script.js
    

    在上面的 script.js 文件中使用 __dirname

    // 输出当前文件所在的目录 /project/folder
    console.log(__dirname)
    
  3. path.dirname(path)

    path.dirname(path) 是 path 模块中的方法,用于对 给定路径 字符串进行解析,并返回路径的目录部分。

    返回值类型:string

    const path = require("path")
    const dirname = path.dirname("/project/folder/script.js")
    
    // 输出给定路径的目录部分 /project/folder
    console.log(dirname)
    
  4. process.cwd()

    process.cwd() 获取的是 当前工作目录(Current Working Directory),这个工作目录是指运行 Node.js 进程时所在的目录,通常与启动脚本的位置有关,常用于与命令操作相关的场景。

    返回值类型:string

    假设当前目录结构如下:

    /project
      ├── app.js
      ├── folder
          └── script.js
    

    app.js 的内容如下:

    consle.log(process.cwd())
    
    • 如果在 /project 目录下运行 node app.js,输出:

      /project
      
    • 如果在 /project/folder 目录下运行 node ../app.js,输出:

      /project/folder
      

    process 是 Node.js 的全局对象,可以在 Node.js 脚本中直接使用。

  5. path.resolve([...paths])

    path.resolve([...paths])方法将一系列路径或路径段解析为绝对路径。它会从右到左依次处理每个路径,每个后续路径都放在前面(左边),直到构造成第一个绝对路径。例如,path.resolve('/foo','/bar','baz')会返回 /bar/baz ,因为 baz 不是绝对路径,但 /bar/baz是。

    返回值类型:string

    • 如果在处理所有给定 path 段后尚未生成绝对路径,则使用当前工作目录

      const path = require("path")
      
      // 如果当前工作目录是 /root/mine;那么下面代码会返回 /root/mine/project/asset/gif/image.gif
      path.resolve("project", "asset/png", "../gif/image.gif")
      
    • 成的路径将被标准化,并且尾随斜杠将被删除,除非该路径被解析为根目录

      const path = require("path")
      
      // 路径 `/foo/bar/` 的尾随斜杠被移除
      path.resolve('/foo/bar/') // 输出:/foo/bar
      
      // 如果路径是根目录 “/”,尾随斜杠保留
      path.resolve('/') // 输出:/
      
    • 零长度 path 段将被忽略(零长度 path 段是指传入的路径字符串为空字符串 ""

      const path = require("path")
      
      path.resolve("/foo", "", "/bar") // 输出:/foo/bar
      
    • 如果没有传递path段, path.resolve()将返回当前工作目录的绝对路径

      const path = require("path");
      
      console.log(path.resolve()); // 输出:当前工作目录的绝对路径,比如 /Users/username/project
      
  6. path.join([...paths])

    path.join([...paths]) 方法使用 特定平台的分隔符 作为分隔符,将所有给定的路径段连接在一起,然后对生成的路径进行规范化处理。

    返回值类型:string

    • 零长度的路径段将被忽略

      const path = require('path');
      
      console.log(path.join('/foo', '', 'bar')); // 输出:/foo/bar
      
    • 如果连接的路径字符串是零长度字符串,则将返回“.”,代表当前工作目录

      const path = require('path');
      
      console.log(path.join('', '')); // 输出:.
      console.log(path.join()); // 输出:.
      

    特定平台的分隔符,是指操作系统使用的路径分隔符,不同操作系统的路径分隔符是不同的。

    • Windows:路径分隔符是反斜杠(\
    • POSIX(Linux、macOS 等类 Unix 系统):路径分隔符是正斜杠(/
  7. url.fileURLToPath(url[,options])

    url.fileURLToPath(url[,options]) 方法用于将文件 URL 字符串或者 URL 对象(通过 new URL() 创建)转换为本地文件系统的路径字符串。第二个参数 options 是一个可选参数,用于指定返回的路径格式(Windows 或 POSIX)。

    options 参数是一个可选对象,有以下属性:

    • windows(布尔值):设置为 true,返回 Windows 风格的路径(例如,C:\path\to\file);设置为 false,返回 POSIX 风格的路径(例如,/path/to/file
    • 默认值:undefined,表示使用系统的默认路径格式

    返回值类型:string

    1. 基本用法(不传 options 参数)

      const { fileURLToPath } = require('url');
      
      const fileUrl = new URL('file:///C:/path/to/file.txt');
      console.log(fileURLToPath(fileUrl));
      // 在 Windows 上,输出:C:\path\to\file.txt
      // 在 POSIX 系统上(如 Linux),输出:/C:/path/to/file.txt
      
    2. 指定返回 Windows 风格路径

      const { fileURLToPath } = require('url');
      
      const fileUrl = new URL('file:///C:/path/to/file.txt');
      console.log(fileURLToPath(fileUrl, { windows: true }));
      // 强制输出:C:\path\to\file.txt(即使在 POSIX 系统上运行)
      
    3. 指定返回 POSIX 风格路径

      const { fileURLToPath } = require('url');
      
      const fileUrl = new URL('file:///C:/path/to/file.txt');
      console.log(fileURLToPath(fileUrl, { windows: false }));
      // 强制输出:/C:/path/to/file.txt(即使在 Windows 系统上运行)
      
  8. url.pathToFileURL(path[, options])

    url.pathToFileURL(path[, options]) 方法用于将文件系统的路径字符串转换为文件 URL 对象。第二个参数 options 是一个可选参数,用于控制如何解释传入的 path

    options 参数是一个可选对象,有以下属性:

    • windows(布尔值):设置为 true,将 path 按照 Windows 文件路径规则解析;设置为 false,将 path 按照 POSIX 文件路径规则解析
    • 默认值:undefined,自动根据运行环境选择默认规则

    返回值类型:URL 对象

    1. 基本用法(不传 options 参数)

      让 Node.js 自动根据当前操作系统选择路径解析规则:

      const { pathToFileURL } = require("url")
      
      const filePath = __dirname;
      const fileUrl = pathToFileURL(filePath)
      
      console.log(fileRul.href) // 根据操作系统解析成文件 URL
      
    2. path 按照 Windows 文件路径规则解析

      强制将路径视为 Windows 文件路径,即使当前环境是 POSIX 系统:

      const { pathToFileURL } = require('url');
      
      const filePath = "C:\\path\\to\\file";
      const fileUrl = pathToFileURL(filePath, { windows: true });
      
      console.log(fileUrl.href); // file:///C:/path/to/file
      
    3. path 按照 POSIX 文件路径规则解析

      强制将路径视为 POSIX 文件路径,即使当前环境是 Windows 系统:

      const { pathToFileURL } = require("url")
      
      const filePath = "/path/to/file";
      const fileUrl = pathToFileURL(filePath, { windows: false });
      
      console.log(fileUrl.href); // file:///path/to/file
      

[!NOTE]

为什么上面的 file 协议有三个斜杠?

如:file:///C:/path/to/file

按照 RFC 3986 标准,URL 的通用格式为:

<scheme>://<authority>/<path>
  • scheme 是协议名称,例如 httpfile
  • authority 通常包括主机名,例如 example.com 或文件系统的主机表示
  • path 是资源的位置

对于 file:// 协议:

  • schemefile
  • authority 通常是空的(或是 localhost,但省略时以空值处理)
  • path 表示绝对路径