2016-08-23 38 views
37

path.resolve使用時是有區別兩者path.joinpath.resolve__dirname在Node.js的解決絕對路徑?path.join VS與__dirname

如果像這樣使用它們中的一個(絕對路徑分辨率是90%的用例),它們應該是首選嗎?

I.e.

const absolutePath = path.join(__dirname, some, dir); 

const absolutePath = path.resolve(__dirname, some, dir); 

兩種方法標準化路徑。

這不是this question的重複,因爲接受的答案是錯誤的。

回答

46

是的,功能之間存在差異,但在這種情況下如何使用它們將導致相同的結果。

path.join通過將兩條路徑合併在一起來返回歸一化路徑。它可以返回一個絕對路徑,但它不一定總是這樣做。

例如:

path.join('app/libs/oauth', '/../ssl') 

解析爲app/libs/ssl

path.resolve,在另一方面,將解析爲絕對路徑。

例如,當你運行:

path.resolve('bar', '/foo'); 

返回將/foo因爲這是可以建造的第一絕對路徑的路徑。

但是,如果你運行:

path.resolve('/bar/bae', '/foo', 'test'); 

返回值將是/foo/test再次因爲這是一個被從右到左形成的第一絕對路徑的路徑。

如果您沒有提供指定根目錄的路徑,則給予resolve函數的路徑會附加到當前工作目錄。所以,如果你的工作目錄是/home/mark/project/

path.resolve('test', 'directory', '../back'); 

解析

/home/mark/project/test/back

使用__dirname送給了你的當前工作目錄的絕對路徑。當您使用path.resolvepath.join時,如果您在__dirname之後給出相同的路徑,它們將返回相同的結果。在這種情況下,這只是一個偏好問題。

+10

Nit:'__dirname'是包含正在執行的源文件的目錄的絕對路徑,而不是*當前工作目錄*。前者總是一樣的(除非你移動文件);後者是[進程範圍參數](https://nodejs.org/docs/latest/api/process.html#process_process_cwd),根據您啓動節點的方式以及您是否[已更改] (https://nodejs.org/docs/latest/api/process.html#process_process_chdir_directory)。 – josh3736

+0

那麼''__dirname''和'''path.resolve(__ dirname)'''沒有區別嗎? – georaldc

2
const absolutePath = path.join(__dirname, some, dir); 

vs.

const absolutePath = path.resolve(__dirname, some, dir); 

path.join將串連__dirname其是與平臺特定的隔板

其中作爲

path.resolve將處理__dirnamesomedirsomedir值級聯當前文件的目錄名從左到右通過處理它。

如果任何somedir值的考慮它作爲根

中序,以更好地瞭解對應於一個根路徑,然後前面的路徑將被省略過程休息的概念讓我解釋一下這兩個有點詳細如下: -

path.joinpath.resolve是由nodejs提供的路徑模塊的兩種不同方法或功能。

如果兩者都接受路徑列表,但差異出現在結果中,即它們如何處理這些路徑。

path.join使用特定於平臺的分隔符作爲分隔符將所有給定的路徑段連接在一起,然後規範化結果路徑。而path.resolve()處理從右到左的路徑序列,每個後續路徑都被預置直到構建絕對路徑。

當沒有參數提供

下面的例子會幫助你清楚地瞭解兩個概念: -

我的文件名是index.js和當前工作目錄是E:\MyFolder\Pjtz\node

const path = require('path'); 

console.log("path.join() : ", path.join()); 
// outputs . 
console.log("path.resolve() : ", path.resolve()); 
// outputs current directory or equalent to __dirname 

結果

λ node index.js 
path.join() : . 
path.resolve() : E:\MyFolder\Pjtz\node 

path.resolve()方法將輸出絕對路徑,其中path.join()返回。代表當前工作目錄,如果當某根路徑作爲參數傳遞

const path=require('path'); 

console.log("path.join() : " ,path.join('abc','/bcd')); 
console.log("path.resolve() : ",path.resolve('abc','/bcd')); 

結果,我

λ node index.js 
path.join() : abc\bcd 
path.resolve() : E:\bcd 

path.join()只有串接輸入列表與特定的平臺沒有提供

分隔符,而path.resolve()處理從右到左的路徑序列,每個後續路徑p直到建立絕對路徑爲止。

+0

這個問題特別是關於* path.join與path.resolve **和__dirname ***。 – estus

+0

感謝您的更新,我根據您的意見更新了答案 –