resolve
关于resolve方法,看Node官网愣是没看明白是什么意思,后来自己尝试了才明白。
path.resolve('a', '/b'); // '/b'
path.resolve('/a', '/b'); // '/b'
path.resolve('/a', 'b'); // '/a/b'
path.resolve('a', 'b'); // '/Users/li/test/a/b'
resolve方法是为了可以生成绝对路径而产生的,那怎么判断你传入的路径参数是不是绝对路径呢?就是靠/
来判断,给定的路径序列从右到左处理。
看上面的例子,第一行和第二行因为/b
里带有/
,得出的地址都是/b
,第三行因为/a
,所以得出的绝对地址是/a/b
,第四行,如果你传递的参数都没有/
,那就用你当前运行文件的在电脑里的绝对地址作为最终的地址,第四行也等价于我们经常写的path.resolve(__dirname, 'a', 'b'); // '/Users/li/test/a/b'
。总之要找到/
作为绝对地址。
下面来看几个带有..
和.
OS操作符的路径是怎么解析的:
path.resolve('/a', '../b'); // '/b'
解析:按照从右到左的顺序,首先是../b
不是绝对路径所以不会返回,然后再到/a
就变为/a/../b
,../
表示上一级,而从/a/../b
分析可得b
的上一级路径是a
,所以a/../b
等价为b
,进而最终结果就变为/b
,它含有/
已经是绝对地址,所以最终的返回结果是/b
。
path.resolve('a', '../b'); // '/b'
同理,如果传递的路径参数a没有/
的话,a/../b
变成b
之后不是绝对路径,就要靠当前文件的绝对地址来补了,所以最终结果是/Users/li/test/b
。
path.resolve('/a', './b'); // '/a/b'
解析:按照从右到左的顺序,得到/a/./b
,./
表示当前文件夹,最终变为/a/b
,所以这就是返回的最终的结果。
join
join和resolve相比就非常不同了,join是为了拼接路径地址而产生,所以它根本不会管什么绝不绝对,直接将你传的路径参数无脑拼接就返回了。
path.join('a', '/b'); // 'a/b'
path.join('/a', '/b'); // '/a/b'
path.join('/a', 'b'); // '/a/b'
path.join('a', 'b'); // 'a/b'
无脑拼接返回就行了。
下面也来看几个带有..
和.
OS操作符的路径是怎么解析的:
path.join('/a', '../b'); // '/b'
解析:先无脑拼接/a/../b
,../
表示上一级,上一级是a
,则最后结果变成/b
。
path.join('a', '../b'); // 'b'
解析:先无脑拼接a/../b
,../
表示上一级,上一级是a
,则最后结果变成b
。
path.join('/a', './b'); // '/a/b'
解析:先无脑拼接/a/./b
,./
表示当前这一级,则最后结果变成/a/b
。
如果我们想使用join得到带有绝对路径的路径结果,就必须用__dirname参数去拼接了join(__dirname, 'path')
。
总结
对比resolve和join的区别就是resolve自动的去找绝对路径,哪怕没有传绝对路径的参数;而join只是做路径拼接,想要绝对路径还需要传入参数。