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