__dirname和./在node.js中有什么区别?

当在Node.js中编程并引用与当前目录相关的文件时,是否有理由使用__dirnamevariables而不是常规的./ ? 我一直在使用./到目前为止在我的代码,只是发现__dirname的存在,本质上想知道是否是聪明的转换我的./'s,如果是这样,为什么这将是一个聪明的理念。

要点

在Node.js中, __dirname始终是当前正在执行的脚本所在的目录( 请参阅此 )。 因此,如果您将__dirname键入__dirname ,则值将为/d1/d2

相比之下. 为您提供在terminal窗口中运行node命令的目录(即您的工作目录)。

例外是当你使用.require()require的path总是相对于包含require调用的文件。

例如…

假设你的目录结构是

 /dir1 /dir2 pathtest.js 

pathtest.js包含

 var path = require("path"); console.log(". = %s", path.resolve(".")); console.log("__dirname = %s", path.resolve(__dirname)); 

而你呢

 cd /dir1/dir2 node pathtest.js 

你得到

 . = /dir1/dir2 __dirname = /dir1/dir2 

你的工作目录是/dir1/dir2所以这是什么. 解决。 由于pathtest.js位于/dir1/dir2 ,这__dirnameparsing的。

但是,如果您从/dir1运行脚本

 cd /dir1 node dir2/pathtest.js 

你得到

 . = /dir1 __dirname = /dir1/dir2 

在这种情况下,你的工作目录是/dir1所以这是什么. 解决了,但__dirname仍然parsing为/dir1/dir2

使用. 内部require

如果在dir2/pathtest.js你有一个require调用,包括一个文件在dir1里面,你总是会这么做的

 require('../thefile') 

因为内部require的path总是相对于你调用它的文件。 它与你的工作目录无关。

./指的是当前的工作目录,除了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不存在。