path.resolve 和 path.join 的区别
path.join
和path.resolve
函数都允许传入多个字符串,将参数拼接后返回一个路径字符串。
但是在使用他们时,要考虑到其中的区别。
一、path.resolve()方法
我们可以将path.resolve
方法解析路径的起点是执行Node命令的工作目录,跟path.resolve方法执行的位置无关,我们且将工作目录称作root
。
path.resolve(subpath0, subpath1, subpath2, ...)
返回一个路径,该路径相当于不断地执行cd
命令,
基于root
,先cd subpath0
,然后cd subpath1
,再不断cd
,最后返回切换到的所在目录。
❗ 需要注意的是,如果参数中有以磁盘X:
或/
开头的字符串,则将会切换到平台的根目录下。
当然 path.resolve方法不会真的去切换目录,上面这段话会帮助我们理解path.resolve的算法。
⭐ 例子:
假设当前工作目录为E:\
, 同时E:\test\index.js
中的内容如下:
console.log( path.resolve() );
console.log( path.resolve('foo', 'bar') );
console.log( path.resolve('foo', '.') );
console.log( path.resolve('foo', '/bar'));
console.log( path.resolve('foo', 'bar', '..'));
console.log( path.resolve('C:\\dist', 'img'));
执行 node ./test/index.js
,输出结果如下:
console.log( path.resolve() ); // 输出👉 "E:\\"
console.log( path.resolve('foo', 'bar') ); // 输出👉 "E:\\foo\\bar"
console.log( path.resolve('foo', '.') ); // 输出👉 "E:\\foo"
console.log( path.resolve('foo', '/bar')); // 输出👉 "E:\\bar"
console.log( path.resolve('foo', 'bar', '..')) // 输出👉 "E:\\foo"
console.log( path.resolve('C:\\dist', 'img')); // 输出👉 "C:\\dist\\img"
二、path.join()方法
该方法只是将参数中的路径进行智能拼接,每个字符串参数最前面的/
不起作用,会被认为是上一级目录。
path.join
方法解析的起点会变化:
如果第一个参数是以磁盘根路径开头的绝对路径,则path.join
解析的起点为第一个参数路径。
如果第一个参数是以根路径/
开头的绝对路径,则path.join
解析的起点为第一个参数路径。
如果第一个参数不是以根路径开头的绝对路径,则path.join
解析的起点为当前目录,即"."
。
// 没有参数
console.log( path.join() ); // 输出👉 "."
// 以相对路径foo作为第一个参数
console.log( path.join('foo', 'bar') ); // 输出👉 "foo\\bar"
// "/bar" 前的斜杠无效
console.log( path.join('foo/', '/bar') ); // 输出👉 "foo\\bar"
// 以linux下根路径/foo/作为第一个参数。
console.log( path.join('/foo/', 'bar') ); // 输出👉 '\\foo\\bar'
// 以点号作为第一个参数
console.log( path.join('.', 'foo') ); // 输出👉 "foo"
// 以上一级目录作为第一个参数
console.log( path.join('..', 'foo')); // 输出👉 "..\\foo"
// 以上一级目录作为参数
console.log( path.join('foo/', '/bar', '..')) // 输出👉 "foo"
// windows下绝对路径作为参数
console.log( path.join('C:\\dist', 'img')); // 输出👉 "C:\dist\img"
console.log( path.join('foo', 'C:\\')); // 输出👉 "foo\\C:\\"