主题
path
模块
path
模块提供了用于处理文件和目录路径的实用功能,帮助开发者在不同操作系统之间处理文件路径时保持一致性。
__filename
& __dirname
虽然在 ESM 语法下,不存在 __filename
和 __dirname
全局变量,但是可以通过如下方式获取:
js
import.meta.filename // C:\Users\xxx\src\main.js
import.meta.dirname // C:\Users\xxx\src
import.meta.url // file://C:/Users/xxx/src/main.js
js
import { fileURLToPath, URL } from 'node:url'
import path from 'node:path'
// 最佳实践:先将 URL 转换为文件系统路径
// => __filename
fileURLToPath(import.meta.url) // C:\Users\xxx\src\main.js
// => __dirname
path.dirname(fileURLToPath(import.meta.url)) // C:\Users\xxx\src
// 不推荐!
// 获取当前目录路径
fileURLToPath(new URL('./', import.meta.url)) // C:\Users\xxx\src\
// 慎用,可能会报错
path.dirname(import.meta.url) // file://Users/xxx/src
路径操作
path.basename(p[, ext])
返回路径的最后一部分,即文件名。可选的ext
参数可以从结果中去除扩展名。jsconst path = require('path') console.log(path.basename('/foo/bar/baz.txt')) // 'baz.txt' console.log(path.basename('/foo/bar/baz.txt', '.txt')) // 'baz'
path.dirname(p)
返回路径的目录部分,不包括文件名。jsconsole.log(path.dirname('/foo/bar/baz.txt')) // '/foo/bar'
path.extname(p)
返回路径的扩展名,包括点号(.
)。如果没有扩展名,返回空字符串。jsconsole.log(path.extname('/foo/bar/baz.txt')) // '.txt' console.log(path.extname('/foo/bar/baz')) // ''
path.format(pathObject)
将一个路径对象转回为路径字符串。pathObject
可以是一个包含root
,dir
,base
,ext
,name
的对象。jsconst pathObj = { root: '/', dir: '/foo/bar', base: 'baz.txt', ext: '.txt', name: 'baz', } console.log(path.format(pathObj)) // '/foo/bar/baz.txt'
path.isAbsolute(p)
判断给定的路径是否是绝对路径。如果是,返回true
,否则返回false
。jsconsole.log(path.isAbsolute('/foo/bar')) // true console.log(path.isAbsolute('foo/bar')) // false
path.join([...paths])
将多个路径片段连接起来,并返回一个规范化的路径。会自动处理路径分隔符(如/
或\\
)。jsconsole.log(path.join('/foo', 'bar', 'baz.txt')) // '/foo/bar/baz.txt' console.log(path.join('/foo', '/bar', 'baz.txt')) // '/bar/baz.txt'
path.normalize(p)
规范化路径,解析..
和.
,并返回规范化后的路径。jsconsole.log(path.normalize('/foo/bar//baz/asdf/quux/..')) // '/foo/bar/baz/asdf'
path.parse(p)
解析给定的路径,返回一个对象,包含root
,dir
,base
,ext
,name
等属性。jsconsole.log(path.parse('/foo/bar/baz.txt')) // { // root: '/', // dir: '/foo/bar', // base: 'baz.txt', // ext: '.txt', // name: 'baz' // }
path.relative(from, to)
计算从from
到to
的相对路径。jsconsole.log(path.relative('/foo/bar', '/foo/baz/quux')) // 'baz/quux'
path.resolve([...paths])
通过将路径片段从右到左连接,解析并返回绝对路径。如果路径片段中包含相对路径(如.
或..
),则会被解析为绝对路径。jsconsole.log(path.resolve('foo', 'bar', 'baz.txt')) // '/current/dir/foo/bar/baz.txt' console.log(path.resolve('/foo/bar', './baz')) // '/foo/bar/baz'
path.sep
返回平台特定的路径分隔符,Linux 和 macOS 返回'/'
,Windows 返回'\\'
。jsconsole.log(path.sep) // '/' 在 Linux 和 macOS,'\\' 在 Windows
常量
path.delimiter
返回平台特定的路径分隔符,用于多个路径值之间的分隔。Linux 和 macOS 返回':'
,Windows 返回';'
。jsconsole.log(path.delimiter) // ':' 在 Linux 和 macOS,';' 在 Windows
实用函数
path.isAbsolute(p)
判断路径是否是绝对路径。jsconsole.log(path.isAbsolute('/foo/bar')) // true console.log(path.isAbsolute('foo/bar')) // false
path.win32
和path.posix
用于处理 Windows 和 POSIX 系统的路径方法(与上述方法相似)。通常无需显式使用,除非需要在跨平台代码中做路径处理。jsconsole.log(path.win32.join('foo', 'bar')) // Windows 系统下使用 '\\' 分隔符 console.log(path.posix.join('foo', 'bar')) // Linux/macOS 系统下使用 '/' 分隔符