path.resolve和join的用法和区别

576 阅读2分钟

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只是做路径拼接,想要绝对路径还需要传入参数。