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