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,最终返回最后的工作目录。

posted @ 2022-09-22 16:40  SummerSatr  阅读(129)  评论(0编辑  收藏  举报