Nodejs Path模块必知必会

1,086 阅读4分钟

Nodejs Path模块必知必会

近期从事Nodejs服务开发过程中,频繁地使用path模块,特此进行总结。

获取文件路径

  • __dirname 变量获取当前执行脚本所在的目录的绝对路径

    __dirname 是一个全局变量,用于表示当前模块的目录名

  • process.cwd() 返回Node.js进程的当前工作目录的绝对路径。

console.log(__dirname);
console.log(process.cwd());

__dirname返回的是当前模块的目录路径,而process.cwd()返回的是Node.js进程的当前工作目录路径。在大多数情况下,它们是相同的,但在一些特殊情况下可能会有不同。

通过代码不同执行路径来对比一下两者的区别

在项目 test 文件夹下创建 path.js

// project/test/path.js
console.log(__dirname);
console.log(process.cwd());

使用 node 执行 path.js, 输出结果如下

$ cd /Users/admin/workspace
$ node ./project/test/path.js

# 输出结果
/Users/admin/workspace/project/test
/Users/admin/workspace
$ cd /Users/admin/workspace/project
$ node ./test/path.js

# 输出结果
/Users/admin/workspace/project/test
/Users/admin/workspace/project
$ cd /Users/admin/workspace/project/test
$ node ./path.js

# 输出结果
/Users/admin/workspace/project/test
/Users/admin/workspace/project/test

对比三个不同路径下使用 node 执行的 js 文件所输出的结果可知

process.cwd() 返回的是Node.js进程的当前工作目录路径 `,即执行 node 命令所在的目录。

__dirname返回的是当前模块的目录路径。无论在哪里执行 node 命令,总会返回当前模块的绝对路径。

拼接路径和解析路径

使用path.join()拼接路径。

const path = require('path');

const fullPath = path.join(__dirname, 'folder', 'file.txt');

console.log(fullPath);

// => /Users/admin/workspace/project/test/folder/file.txt

输出指定文件的绝对路径包含文件及扩展名

const resolvedPath = path.resolve('folder', 'file.txt');

console.log(`解析路径`, resolvedPath);
// => /Users/admin/workspace/project/test/folder/file.txt

解析指定文件输出文件路径

两者之间的区别

path.join()path.resolve() 之间的区别可能需要考虑它们在处理相对路径和绝对路径时的行为

const joinedPath = path.join('/folder', 'file.txt');
// 在类Unix系统上,结果为 '/folder/file.txt'
// 在Windows系统上,结果为 '\folder\file.txt'
const resolvedPath = path.resolve('/folder', 'file.txt');
// 在类Unix系统上,结果为 '/folder/file.txt'
// 在Windows系统上,结果为 'C:\folder\file.txt'(假设当前工作目录为 C:\
  • 处理方式:
    • path.join() 只是简单地拼接路径片段,不考虑绝对路径。
    • path.resolve() 解析路径并返回绝对路径。
  • 基础路径:
    • path.join() 不考虑基础路径,只是简单地将路径片段拼接在一起。
    • path.resolve() 的路径解析是基于当前工作目录的,因此返回的是绝对路径。
  • 用途:
    • 通常,path.join() 用于构建路径,而不考虑其是否是绝对路径。
    • path.resolve() 用于获取一个绝对路径,可以用于构建绝对路径。

路径解析和格式化

**应用场景 **

  • 文件操作: 在进行文件读写、复制、移动等操作时,路径解析和格式化有助于获取和处理文件的信息。
  • 路由处理: 在Web应用中,路径解析和格式化有助于处理URL路径,提取路由信息。
  • 构建工具: 在构建工具、打包工具中,可以使用路径解析和格式化来处理文件路径,确保文件被正确引用和定位。

使用 path.parse() 将路径字符串解析成对象。

const fullPath = path.join(__dirname, 'folder', 'file.txt');
const pathObj = path.parse(fullPath)
console.log(pathObj);
/**
 * {
 *   root: '/',
 *   dir: '/Users/admin/workspace/project/test/folder',
 *   base: 'file.txt',
 *   ext: '.txt',
 *   name: 'file'
 * }
 */

获取路径信息:

使用 path.parse() 将路径字符串解析为一个包含路径信息的对象,其中包括目录、基础名称、扩展名等。

const filePath = '/root/folder/file.txt';
const pathObject = path.parse(filePath);
console.log(pathObject);
// 输出:{ root: '/', dir: '/root/folder', base: 'file.txt', ext: '.txt', name: 'file' }

提取文件信息:

从路径对象中提取所需的信息,如文件名、扩展名等,用于生成文件列表或进行其他操作。

const fileName = pathObject.name;
const fileExtension = pathObject.ext;

使用 path.format 将文件解析成路径字符串


const formattedPath = path.format(pathObj);
console.log(formattedPath);
// /Users/admin/workspace/project/test/folder/file.txt

生成路径字符串:

使用 path.format() 将包含路径信息的对象格式化为路径字符串。

const formattedPath = path.format({
  root: '/',
  dir: '/root/folder',
  base: 'file.txt',
  ext: '.txt',
  name: 'file'
});
console.log(formattedPath);
// 输出:'/root/folder/file.txt

路径构建

将路径的各个部分以对象的形式组织,然后使用 path.format() 将其格式化为完整的路径。这在构建文件路径时很有用。

const pathObject = {
  dir: '/root/folder',
  base: 'file.txt'
};
const fullPath = path.format(pathObject);
// fullPath 的值为 '/root/folder/file.txt'

获取路径信息

可以通过 path 的 basename() 、dirname()、extname() 获取路径的基础名称、目录名和扩展名

const baseName = path.basename('/root/folder/file.txt');
const dirName = path.dirname('/root/folder/file.txt');
const extension = path.extname('/root/folder/file.txt');

console.log({baseName, dirName, extension})


// 输出:{ baseName: 'file.txt', dirName: '/root/folder', extension: '.txt' }

路径规范化

使用path.normalize()规范化路径。

const normalizedPath = path.normalize('/root//folder/file.txt');

获取相对路径

使用path.relative()获取两个路径之间的相对路径。

const relativePath = path.relative('/root/folder', '/root/file.txt');

检查路径

使用path.isAbsolute()检查路径是否是绝对路径。

const isAbsolute = path.isAbsolute('/root/folder/file.txt');