node.js中__dirname和./有什麼區別?

在Node.js中編程並引用位於與當前目錄相關的文件時,是否有任何理由使用__dirname變量而不單單是常規./ ? 到目前爲止,我一直在使用./而且剛剛發現了__dirname的存在,而且基本上想知道將./'轉換爲是否聰明,若是是這樣,爲何這將是一個聰明的理念。 node


#1樓

要旨

在Node.js中, __dirname始終是當前正在執行的腳本所在的目錄( 請參閱此內容 )。 因此,若是你鍵入__dirname/d1/d2/myscript.js ,該值會/d1/d2編程

相比之下, . 當您使用pathfs等庫時,將爲您提供在終端窗口(即工做目錄)中運行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內部的路徑始終相對於您調用它的文件。 它與您的工做目錄無關。


#2樓

./引用當前工做目錄,但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不存在。

相關文章
相關標籤/搜索