在Node.js中編程並引用位於與當前目錄相關的文件時,是否有任何理由使用__dirname
變量而不單單是常規./
? 到目前爲止,我一直在使用./而且剛剛發現了__dirname
的存在,而且基本上想知道將./'轉換爲是否聰明,若是是這樣,爲何這將是一個聰明的理念。 node
在Node.js中, __dirname
始終是當前正在執行的腳本所在的目錄( 請參閱此內容 )。 因此,若是你鍵入__dirname
到/d1/d2/myscript.js
,該值會/d1/d2
。 編程
相比之下, .
當您使用path
和fs
等庫時,將爲您提供在終端窗口(即工做目錄)中運行node
命令的目錄。 從技術上講,它最初是做爲您的工做目錄,但能夠使用process.chdir()
進行更改。 json
您使用時例外.
with require()
。 require
內部的路徑始終相對於包含require
的文件。 函數
假設你的目錄結構是 ui
/dir1 /dir2 pathtest.js
和pathtest.js
包含 spa
var path = require("path"); console.log(". = %s", path.resolve(".")); console.log("__dirname = %s", path.resolve(__dirname));
你也是 code
cd /dir1/dir2 node pathtest.js
你獲得 ip
. = /dir1/dir2 __dirname = /dir1/dir2
你的工做目錄是/dir1/dir2
,這就是什麼.
解決了。 因爲pathtest.js
位於/dir1/dir2
,這__dirname
解析的內容。 get
可是,若是從/dir1
運行腳本 it
cd /dir1 node dir2/pathtest.js
你獲得
. = /dir1 __dirname = /dir1/dir2
在這種狀況下,您的工做目錄是/dir1
,這就是什麼.
已解決,但__dirname
仍解析爲/dir1/dir2
。
.
裏面require
...... 若是裏面dir2/pathtest.js
你有一個require
調用到包括內部文件dir1
你老是作
require('../thefile')
由於require
內部的路徑始終相對於您調用它的文件。 它與您的工做目錄無關。
./
引用當前工做目錄,但require()
函數除外。 使用require()
,它會將./
轉換爲當前文件的目錄。 __dirname
始終是當前文件的目錄。
例如,使用如下文件結構
/home/user/dir/files/config.json
{ "hello": "world" }
/home/user/dir/files/somefile.txt
text file
/home/user/dir/dir.js
var fs = require('fs'); console.log(require('./files/config.json')); console.log(fs.readFileSync('./files/somefile.txt', 'utf8'));
若是我cd
到/home/user/dir
並運行node dir.js
我會獲得
{ hello: 'world' } text file
可是當我從/home/user/
運行相同的腳本時,我獲得了
{ hello: 'world' } Error: ENOENT, no such file or directory './files/somefile.txt' at Object.openSync (fs.js:228:18) at Object.readFileSync (fs.js:119:15) at Object.<anonymous> (/home/user/dir/dir.js:4:16) at Module._compile (module.js:432:26) at Object..js (module.js:450:10) at Module.load (module.js:351:31) at Function._load (module.js:310:12) at Array.0 (module.js:470:10) at EventEmitter._tickCallback (node.js:192:40)
使用./
使用require
但不使用fs.readFileSync
。 這是由於對於fs.readFileSync
,。 ./
轉換爲cwd(在本例中爲/home/user/
)。 而且/home/user/files/somefile.txt
不存在。