__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不存在。