Node.js的__dirname,__filename,process.cwd()

Node.js中的文件路徑大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三個都是絕對路徑,為了便於比較,./../ 我們通過 path.resolve('./')來轉換為絕對路徑。

簡單說一下這幾個路徑的意思,:

__dirname:    獲得當前執行文件所在目錄的完整目錄名
__filename:   獲得當前執行文件的帶有完整絕對路徑的文件名
process.cwd():獲得當前執行node命令時候的文件夾目錄名 
./:           文件所在目錄

先看一看我電腦當前的目錄結構:

syntax/
    -nodejs/
        -1.findLargest.js
        -2.path.js
        -3.fs.js
    -regs
        -regx.js
        -test.txt

在 path.js 裡面我們寫這些代碼,看看輸出是什麼:

const path = require('path')
console.log('__dirname:', __dirname)
console.log('__filename:', __filename)
console.log('process.cwd():', process.cwd())
console.log('./:', path.resolve('./'))

在當前目錄下也就是nodejs目錄運行node path.js,我們看看輸出結果:

__dirname:     /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs
__filename:    /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs/2.path.js
process.cwd(): /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs
./:            /Users/jawil/Desktop/nodejs/demo/ES6-lottery/syntax/nodejs

答案顯而易見?我們可以通過上面的例子對比,暫時得出表面的結論:

  • __dirname: 總是返回被執行的 js 所在文件夾的絕對路徑
  • __filename: 總是返回被執行的 js 的絕對路徑
  • process.cwd(): 總是返回運行 node 命令時所在的文件夾的絕對路徑
  • ./: 跟 process.cwd() 一樣,返回 node 命令時所在的文件夾的絕對路徑

require() 源碼解讀

那麼關於./正確的結論是:
require() 中使用是跟 __dirname 的效果相同,不會因為啟動腳本的目錄不一樣而改變,在其他情況下跟 process.cwd() 效果相同,是相對於啟動腳本所在目錄的路徑。

總結:

  • __dirname: 獲得當前執行文件所在目錄的完整目錄名
  • __filename: 獲得當前執行文件的帶有完整絕對路徑的文件名
  • process.cwd():獲得當前執行node命令時候的文件夾目錄名
  • ./: 不使用require時候,./與process.cwd()一樣,使用require時候,與__dirname一樣

只有在 require() 時才使用相對路徑(./, ../)的寫法,其他地方一律使用絕對路徑,如下:

// 當前目錄下
 path.dirname(__filename) + '/path.js'; 
// 相鄰目錄下
 path.resolve(__dirname, '../regx/regx.js');

results matching ""

    No results matching ""