node.js中的_dirname和./有什么区别?

node.js中的_dirname和./有什么区别?,node.js,Node.js,在Node.js中编程并引用与当前目录相关的文件时,是否有理由使用\uuu dirname变量而不是常规的/?到目前为止,我一直在我的代码中使用.,刚刚发现存在\uuu dirname,我想知道将我的./”转换为它是否明智,如果是,为什么这是一个明智的想法。/指的是当前的工作目录,除了require()函数之外。使用require()时,它会将/转换为当前调用的文件的目录\uu dirname始终是当前文件的目录 例如,使用以下文件结构 /home/user/dir/files/config.j

在Node.js中编程并引用与当前目录相关的文件时,是否有理由使用
\uuu dirname
变量而不是常规的
/
?到目前为止,我一直在我的代码中使用.,刚刚发现存在
\uuu dirname
,我想知道将我的./”转换为它是否明智,如果是,为什么这是一个明智的想法。

/
指的是当前的工作目录,除了
require()
函数之外。使用
require()
时,它会将
/
转换为当前调用的文件的目录
\uu 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)
{你好:'world'}
错误:enoint,没有这样的文件或目录。'/files/somefile.txt'
在Object.openSync(fs.js:228:18)
在Object.readFileSync(fs.js:119:15)
反对。(/home/user/dir/dir.js:4:16)
在模块处编译(Module.js:432:26)
at Object..js(module.js:450:10)
在Module.load(Module.js:351:31)
at功能。加载(module.js:310:12)
在Array.0中(module.js:470:10)
在EventEmitter上进行回调(node.js:192:40)
使用
/
一起工作需要
但不适用于
fs.readFileSync
。这是因为对于
fs.readFileSync
/
转换为cwd(在本例中为
/home/user/
)。而且
/home/user/files/somefile.txt
不存在。

要点 在Node.js中,
\uuu dirname
始终是当前正在执行的脚本所在的目录()。因此,如果在
/d1/d2/myscript.js
中键入
\uuu dirname
,则值将为
/d1/d2

相比之下,
为您提供了在终端窗口中运行
节点
命令的目录(即工作目录),当您使用
path
fs
等库时。从技术上讲,它一开始是您的工作目录,但可以使用
process.chdir()
进行更改

例外情况是将
require()
一起使用时。
require
中的路径始终与包含调用
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
__dirname = /dir1/dir2
您的工作目录是
/dir1/dir2
,这就是
的解析。由于
pathtest.js
位于
/dir1/dir2
中,这也是
\uu dirname
解决的问题

但是,如果从
/dir1

cd /dir1
node dir2/pathtest.js
你得到

. = /dir1/dir2
__dirname = /dir1/dir2
. = /dir1
__dirname = /dir1/dir2
在这种情况下,您的工作目录是
/dir1
,这就是
解析为的目录,但是
\uu dirname
仍然解析为
/dir1/dir2

中使用
需要
。。。
如果inside
dir2/pathtest.js
您有一个
require
调用,在
dir1
中包含一个文件,您将始终这样做

require('../thefile')

因为
require
中的路径始终与调用它的文件相关。它与您的工作目录无关。

哦,我以为\uuuu dirname是当前的工作目录。。。谢谢你的澄清!有没有办法用fs引用应用程序的工作目录?例如,我试图从工作目录
/movies
加载一个文件,但由于我的模块位于文件
/custom\u modules/
中,
\u dirname
尝试从中获取电影,
/custom\u modules/movies
您可以使用
//code>或
process.cwd()
。请参阅值得注意的内容在require语句中使用_dirname over./不是一个好主意,因为尽管它们在节点中的行为相同,但它可能会导致包的browserify构建出现问题,而这些问题很容易避免。在我看来,这一解释比公认答案(您知道,“当前目录”)中的解释要清楚一些我同意。我将更改已接受的答案。请记住,这个答案是在最初的答案被接受2.5年后添加的,我只是在现在才注意到它(另外2年后)。:)迟到总比不做好值得注意的是,
/
并不总是启动节点的目录。它是这样开始的,但可以通过
process.chdir()
进行更改。因此,
/
始终是当前工作目录,通常是启动目录节点的位置,除非您的代码显式更改了工作目录。我对使用有点困惑。在require部分内部,如果require内部的路径始终与正在调用的文件相关,那么路径不应该是require(“../thefile”)而不是require(“../dir1/thefile”)吗?我以为。。将路径的当前位置从dir2返回到dir1一级。您仍然需要将dir1放在路径中,还是我没有理解某些内容?如果您需要在某些脚本中使用
。/someDir
,并且要从其他文件夹运行命令,您会怎么做?tl;dr:因此,基本上,区别在于“/”和“process.cwd()”指调用脚本的终端的当前目录,“\uu dirname”指存储脚本的目录。除非在
require
中使用
require
中的路径始终相对于包含ca的文件