path.join()

path.join() 方法使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径

零长度的 path 片段会被忽略。 如果连接的路径字符串是零长度的字符串,则返回 '.',表示当前工作目录。

  1. path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
  2. // 返回: '/foo/bar/baz/asdf'
  3. path.join('foo', {}, 'bar');
  4. // 抛出 'TypeError: Path must be a string. Received {}'

path.resolve()

path.resolve()> 方法将路径或路径片段的序列解析为绝对路径。

path.join & path.resolve 区别:

  1. 对于以/开始的路径片段,path.join只是简单的将该路径片段进行拼接,而path.resolve将以/开始的路径片段作为根目录,在此之前的路径将会被丢弃,就像是在terminal中使用cd命令一样。
  2. path.resolve总是返回一个以相对于当前的工作目录(working directory)的绝对路径。

🌰:

  1. path.join('/foo', './bar', './baz/asdf', 'quux', '..'); // 返回 /foo/bar/baz/asdf
  2. path.join('/foo', 'bar', 'baz/asdf', '.', '.'); // 返回 /foo/bar/baz/asdf
  3. path.join('/foo', 'bar', 'baz/asdf', 'quux'); // 返回 /foo/bar/baz/asdf/quux
  4. path.join('/foo', 'bar', 'baz/asdf', '..', '..'); // 返回 /foo/bar
  5. path.resolve(); // F:/1/2/task6/test 当前工作目录的绝对路径
  6. path.resolve('./a'); // F:/1/2/task6/test/a
  7. path.resolve('../a'); // F:/1/2/task6/a
  8. path.resolve('.'); // F:/1/2/task6/test
  9. path.resolve('..'); // F:/1/2/task6
  10. path.resolve('/')); // F:/
  11. path.resolve('./a','../c/d'); // F:/1/2/task6/test/c/d
  12. path.resolve('./a','./c/d'); // F:/1/2/task6/test/a/c/d
  13. path.resolve('/a','../c/d'); // F:c/d
  14. path.resolve('/a','./c/d'); // F:/a/c/d
  15. path.resolve('./a','/b','./c/d'); // F:/b/c/d
  16. path.resolve('a','b','c/d'); // F:/1/2/task6/test/a/b/c/d
  17. path.resolve('./a','./b','c/d'); // F:/1/2/task6/test/a/b/c/d
  18. path.resolve('./a','/b','c/d'); // F:/b/c/d
  19. path.resolve('./a/b','..','c/d'); // F:/1/2/task6/test/a/c/d
  20. path.resolve('./a','..','c/d'); // F:/1/2/task6/test/c/d