path.join和path.resolve的区别
1、path.join
path.join([path1][, path2][, ...])
方法只是将每个路径片段进行拼接,并规范化生成一个路径。
- windows下路径拼接符为" \ ",Linux下路径拼接符为" / ",以下为windows下示例:
const path = path.join('a', 'b', 'c')
console.log(path) // a\b\c
const path1 = path.join('/a', '/b', '/c')
console.log(path1) // \a\b\c
const path2 = path.join('/a', '/b', '\c')
console.log(path2) // \a\b\c
const path2 = path.join('/a', '/b', 'c\')
console.log(path2) // \a\b\c\
- 路径参数必须是字符串,不然会报错。
// 打印path的时候会报错:Uncaught NodeError TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received an instance of Object
const path = path.join('/a', '/b', {})
console.log(path)
- 如果路径中出现" .. ",相当于返回上一层目录,拼接结果中它前面的路径片段会被丢失。
const path = path.join('/a', '/b', '/c', '../d')
console.log(path) // \a\b\d
const path1 = path.join('/a', '/b', '..', '/c/d')
console.log(path1) // \a\c\d
const path2 = path.join('/a', '/b', '../', '/c/d')
console.log(path2) // \a\c\d
如果是" . "或者" / " 的话,则对拼接结果无影响。
const path = path.join('/a', '/b', '.', '/d')
console.log(path) // \a\b\d
const path1 = path.join('/a', '/b', '/', '/d')
console.log(path1) // \a\b\d
const path2 = path.join('/a', '/b', './', '/d')
console.log(path2) // \a\b\d
- 长度为0的路径片段会被忽略,如果拼接后的路径字符串为0,则返回' . ',代表当前工作目录。
const path = path.join('a', '', 'c')
console.log(path) // a\c
const path1 = path.join('a', 'b', '..', '..')
console.log(path1) // .
2、path.resolve
path.resolve([path1][, path2][, ...])
方法会把一个路径或路径片段的序列解析为一个绝对路径。
以下示例的工作目录为 D:\test
。
-
路径拼接符同
path.join
。 -
路径参数也必须是字符串,否则会报错。
-
如果路径中出现" .. ",跟
path.join
是一样的处理方式。 -
如果路径在出现" . ",对拼接结果也无影响。如果路径中出现" / " ,出现在路径片段的最前面的话,则会当成是绝对路径;如果出现在路径片段的最后面,则会被去掉(因为生成的路径是规范化后的)。
-
给定的路径的序列是从右往左被处理的,从右往左解析每个
path
,直到构造完成一个绝对路径。
const path = path.resolve('/a', '/b', '/c')
console.log(path) // d:\c
const path1 = path.resolve('/a', '/b', 'c')
console.log(path1) // d:\b\c
const path2 = path.resolve('/a', 'b', 'c')
console.log(path2) // d:a\b\c
const path2 = path.resolve('/a', 'b', 'c', '/')
console.log(path2) // d:\
const path = path.resolve('/a', '/b', '/c', '../d')
console.log(path) // d:\d
const path2 = path.resolve('/a', 'b', 'c', '.', 'd')
console.log(path2) // d:\a\b\c\d
const path2 = path.resolve('/a', 'b', 'c', 'd/')
console.log(path2) // d:\a\b\c\d
- 如果从右往左处理完所有的路径片段都没有得到一个绝对路径的话,则会拼接上当前工作目录。
const path = path.resolve('a', 'b', 'c')
console.log(path) // d:\test\a\b\c
- 长度为0的路径片段会被忽略,如果拼接后的路径字符串为0,或者没有传入路径片段,则返回当前工作目录
const path = path.resolve('a', '', 'c', )
console.log(path) // d:\test\a\c
const path1 = path.resolve('a', 'b', '..', '..')
console.log(path1) // d:\test
const path2 = path.resolve()
console.log(path2) // d:\test
path.resolve
也相当于是我们进行cd
操作。从左依次对我们的路径片段进行cd
,最终返回最后的工作目录。