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()
中使用是跟 __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');