path-文件路径处理
path是NodeJS中用于处理文件路径的核心模块,它提供了一系列实用的工具函数来操作文件路径字符串。在跨平台开发中,path模块尤为重要,因为不同操作系统的路径分隔符不同(Windows使用\,而Linux使用/),使用path模块可以帮助我们编写出兼容各平台的代码。
导入模块
在ESM模块机制下,我们可以通过以下方式导入path模块。
import path from "node:path";
路径拼接
path.join()
path.join()用于将多个路径片段拼接成一个完整的路径,它会自动处理路径分隔符和.、..等相对路径符号。
import path from "node:path";
// 基本拼接
const p1 = path.join("/home", "user", "documents");
console.log(p1); // /home/user/documents
// 处理相对路径
const p2 = path.join("/home", "user", "..", "admin");
console.log(p2); // /home/admin
// 处理多余的斜杠
const p3 = path.join("/home/", "/user/", "/file.txt");
console.log(p3); // /home/user/file.txt
path.resolve()
path.resolve()用于将路径片段解析为绝对路径,它从右向左依次处理路径片段,直到构造出一个绝对路径。如果处理完所有片段后仍未得到绝对路径,则会使用当前工作目录。
import path from "node:path";
// 解析为绝对路径
const p1 = path.resolve("src", "index.js");
console.log(p1); // /当前工作目录/src/index.js
// 遇到绝对路径会重新开始
const p2 = path.resolve("/home", "user", "/admin", "file.txt");
console.log(p2); // /admin/file.txt
// 结合__dirname使用
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const p3 = path.resolve(__dirname, "config", "app.json");
console.log(p3); // /当前文件所在目录/config/app.json
路径解析
path.parse()
path.parse()用于将路径字符串解析为一个包含各部分信息的对象。
import path from "node:path";
const pathInfo = path.parse("/home/user/documents/file.txt");
console.log(pathInfo);
返回对象pathInfo中的各属性含义如下表。
| 属性 | 说明 |
|---|---|
| root | 根路径 |
| dir | 文件所在目录 |
| base | 文件名(含扩展名) |
| ext | 文件扩展名 |
| name | 文件名(不含扩展名) |
path.format()
path.format()是path.parse()的逆操作,它将路径对象格式化为路径字符串。
import path from "node:path";
const pathStr = path.format({
dir: "/home/user/documents",
name: "file",
ext: ".txt",
});
console.log(pathStr); // /home/user/documents/file.txt
获取路径信息
path.dirname()
path.dirname()用于获取路径中的目录部分。
import path from "node:path";
const dir = path.dirname("/home/user/documents/file.txt");
console.log(dir); // /home/user/documents
path.basename()
path.basename()用于获取路径中的文件名部分,可选第二个参数用于去除扩展名。
import path from "node:path";
const filename1 = path.basename("/home/user/documents/file.txt");
console.log(filename1); // file.txt
// 去除扩展名
const filename2 = path.basename("/home/user/documents/file.txt", ".txt");
console.log(filename2); // file
path.extname()
path.extname()用于获取路径中的扩展名部分。
import path from "node:path";
const ext1 = path.extname("/home/user/documents/file.txt");
console.log(ext1); // .txt
const ext2 = path.extname("/home/user/documents/file.config.js");
console.log(ext2); // .js
const ext3 = path.extname("/home/user/documents/file");
console.log(ext3); // 空字符串
路径判断与转换
path.isAbsolute()
path.isAbsolute()用于判断路径是否为绝对路径。
import path from "node:path";
console.log(path.isAbsolute("/home/user")); // true
console.log(path.isAbsolute("./src/index.js")); // false
console.log(path.isAbsolute("src/index.js")); // false
path.relative()
path.relative()用于计算从一个路径到另一个路径的相对路径。
import path from "node:path";
const rel1 = path.relative("/home/user/documents", "/home/user/pictures");
console.log(rel1); // ../pictures
const rel2 = path.relative("/home/user", "/home/user/documents/file.txt");
console.log(rel2); // documents/file.txt
path.normalize()
path.normalize()用于规范化路径,处理其中的.、..和多余的分隔符。
import path from "node:path";
const p1 = path.normalize("/home/user/../admin/./documents//file.txt");
console.log(p1); // /home/admin/documents/file.txt
const p2 = path.normalize("src//components/../utils/./index.js");
console.log(p2); // src/utils/index.js
平台相关
path.sep
path.sep属性返回当前操作系统的路径分隔符。Windows会返回\,Linux则会返回/。
import path from "node:path";
console.log(path.sep);
path.delimiter
path.delimiter属性返回当前操作系统的环境变量路径分隔符。Windows中通常是;,Linux下则是:。
import path from "node:path";
console.log(path.delimiter);
// 解析PATH环境变量
const paths = process.env.PATH.split(path.delimiter);
console.log(paths);
跨平台路径处理
path模块还提供了path.posix和path.win32两个子模块,用于在任意平台上使用特定平台的路径处理逻辑。
import path from "node:path";
// 强制使用POSIX风格(Linux/macOS)
const posixPath = path.posix.join("home", "user", "file.txt");
console.log(posixPath);
// 强制使用Windows风格
const win32Path = path.win32.join("home", "user", "file.txt");
console.log(win32Path);