__dirname和./在node.js中有什么区别?
当在Node.js中编程并引用与当前目录相关的文件时,是否有理由使用__dirname
variables而不是常规的./
? 我一直在使用./到目前为止在我的代码,只是发现__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
,这__dirname
parsing的。
但是,如果您从/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
不存在。