跳到主要内容

path 模块

文档

可以处理文件和目录路径。

方法

方法描述
path.resolve解析为规范的绝对路径
path.parse解析路径并返回对象
path.sep获取操作系统的路径分隔符
path.basename获取路径的基础名称
path.dirname获取路径的目录名
path.extname获取路径的扩展名
path.join拼接路径
const path = require('path');

// 结果:Windows下是反斜杠 \ ,linux下是正斜杠 /
console.log(path.sep);

console.log(path.resolve(__dirname, '1.txt')); // 结果:/Users/zgh/code/blog/1.txt

const pathName = '/Users/zgh/code/blog/1.txt';

console.log(path.basename(pathName)); // 1.txt
console.log(path.basename(pathName, '.txt')); // 第二个参数表示去掉后缀,结果是1

console.log(path.dirname(pathName)); // 结果:/Users/zgh/code/blog

console.log(path.extname(pathName)); // .txt

console.log(path.join('/Users/zgh/code/blog', '1.txt')); // 结果:/Users/zgh/code/blog/1.txt

console.log(path.parse(pathName));
// {
// root: '/',
// dir: '/Users/zgh/code/blog',
// base: '1.txt',
// ext: '.txt',
// name: '1'
// }

路径变量

  • __dirname 当前模块的目录名,绝对路径
  • __filename 当前模块的文件名,绝对路径
  • process.cwd() 当前工作目录,即执行 node 命令时所在的目录

假设有 /Users/code/src/foo/index.js,内容如下:

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

1、 在 /Users/code/src/foo 目录下执行 node index.js,结果如下:

/Users/code/src/foo
/Users/code/src/foo/index.js
/Users/code/src/foo

2、 在 /Users/code/src 目录下执行 node foo/index.js,结果如下:

/Users/code/src/foo
/Users/code/src/foo/index.js
/Users/code/src

可以看到,不管 node 在哪个目录执行命令,__dirname__filename的结果都一样,即绝对路径。而process.cwd()的结果是执行 node 命令时所在的目录。

path.resolve()

path.resolve()可以传入多个参数,会从右往左解析路径,直到解析为绝对路径。

1、如果path.resolve()没有参数,则返回当前工作目录的绝对路径。

// 假设路径为 /a/b/c ,在c目录下执行命令:
node main.js

// 假设路径为 /a/b ,在b目录下执行命令:
node c/main.js

// 工作目录不同,则 path.resolve() 获取的路径也不同

2、path.resolve()的第二个参数可以写'1.txt'或者'./1.txt',但是不能写'/1.txt',即可以写相对路径

path.resolve(__dirname, '1.txt'); // 结果:/Users/zgh/code/blog/1.txt

path.resolve(__dirname, './1.txt'); // 结果:/Users/zgh/code/blog/1.txt

path.resolve(__dirname, '/1.txt'); // 结果:/1.txt

3、下面的例子中,因为从右往左解析路径,碰到/bar就解析为绝对路径,所以/foo会被忽略。

path.resolve('/foo', '/bar', 'baz'); // 结果:/bar/baz

path.resolve('/foo', 'bar', 'baz'); // 结果:/foo/bar/baz
path.resolve('/foo', './bar', 'baz'); // 结果:/foo/bar/baz

path.join()

path.join()拼接路径,可以传入多个参数,会自动处理路径分隔符

// 结果都是 /foo/bar
path.join('/foo', 'bar');
path.join('/foo', '/bar');
path.join('/foo', './bar');

构建路径变量

如果在项目的 package.json 中配置了"type": "module",则无法使用__dirname__filename,需要自己构建这两个变量。

import { fileURLToPath } from 'node:url';
import { dirname, resolve } from 'node:path';

const __filename = fileURLToPath(import.meta.url); // 当前文件的绝对路径
const __dirname = dirname(__filename); // 当前文件所在的文件夹的绝对路径

import.meta.url 是 ESModule 的一个属性,表示当前模块的 URL。如:file:///Users/zgh/project/index.js?1730857880251,通过 fileURLToPath可以将其转换为:/Users/zgh/porject/index.js