- 相同點:對於 ./ 和 ../ 處理方式相同,按照常規相對路徑理解就可以
- 不同點:
- resolve會返回一個絕對路徑,join會返回一個路徑字符串,我把它理解爲相對路徑吧;
- 對於 / 的處理方式不同,resolve把 / 當作根路徑處理,join把 / 忽略。
通過實例說明一下(以下是windows系統測試,蘋果和Linux會有些不一樣,理解原理即可)
path.join
/* 測試常規用法 */
path.join('a', 'b', 'c')
// 過程 \\a -> \\a\\b -> \\a\\b\\c
// 結果 \\a\\b\\c
/* 測試一堆 / 的處理 */
path.join('/a//', '//b//', '///c')
// 過程 \\a -> \\a\\b -> \\a\\b\\c
// 結果 \\a\\b\\c
// 解釋:和上一個結果相同,因爲不管多少個/都會被忽略
/* 測試 ./ 的處理 */
path.join('a', './b', './c')
// 過程 \\a -> \\a\\b -> \\a\\b\\c
// 結果 \\a\\b\\c
// 解釋:和第一個結果仍相同,因爲./代表當前路徑,有沒有./含義都是一樣的
/* 測試 ../ 的處理 */
path.join('a', 'b', '../c')
// ps:可以把它看作這樣的形式:path.join('a', 'b', '../', 'c')
// 過程 \\a -> \\a\\b -> \\a(遇到../變成上一級目錄,所以又回到\\a) -> \\a\\c
// 結果 \\a\\c
path.resolve
先聲明,當前命令行窗口在E:\Books目錄下,如下圖
/* 常規用法 */
path.resolve('a', 'b', 'c')
// 過程 E:\\Books -> E:\\Books\\a -> E:\\Books\\a\\b -> E:\\Books\\a\\b\\c
// 結果 E:\\Books\\a\\b\\c
// 解釋:和join相比,就是以當前路徑爲絕對路徑,依次向後拼接
/* / 的處理,這裏和join有區別 */
path.resolve('a', '/b', 'c')
// ps:可以看作這樣形式:path.resolve('a', '/', 'b', 'c')
// 過程 E:\\Books -> E:\\Books\\a -> E:(遇見/,直接回到磁盤根路徑,當前是E盤) -> E:\\b -> E:\\b\\c
// 結果 E:\\b\\c
// 解釋:本人用的win系統,遇見/直接回到盤符位置,蘋果系統可自行測試
/* ./ 的處理 */
path.resolve('./a', './b', './c')
// 過程 E:\\Books -> E:\\Books\\a -> E:\\Books\\a\\b -> E:\\Books\\a\\b\\c
// 結果 E:\\Books\\a\\b\\c
// 解釋:和第一種結果相同,./被看作當前路徑,寫不寫效果一樣
/* ../ 的處理 */
path.resolve('a', '../b', 'c')
// ps:可看作這種形式:path.resolve('a', '../', 'b', 'c')
// 過程 E:\\Books -> E:\\Books\\a -> E:\\Books(遇見../,變成上一級目錄) -> E:\\Books\\b -> E:\\Books\\b\\c
// 結果 E:\\Books\\b\\c