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

thi*_*ami 469 node.js

在Node.js中编程并引用位于与当前目录相关的文件时,有没有理由使用__dirname变量而不仅仅是常规变量./?到目前为止,我一直在我的代码中使用./并且刚刚发现它的存在__dirname,并且基本上想要知道将./的转换为是否聪明,如果是这样,为什么这将是一个聪明的想法.

d51*_*512 768

要旨

在Node.js中,__dirname始终是当前正在执行的脚本所在的目录(请参阅此内容).所以,如果你键入__dirname/d1/d2/myscript.js,该值会/d1/d2.

相比之下,当您使用和的库时,.为您提供node在终端窗口(即工作目录)中运行命令的目录.从技术上讲,它最初是作为您的工作目录,但可以使用更改.pathfsprocess.chdir()

例外情况是你使用.require().内部路径require始终相对于包含调用的文件require.

例如...

假设你的目录结构是

/dir1
  /dir2
    pathtest.js
Run Code Online (Sandbox Code Playgroud)

pathtest.js包含

var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
Run Code Online (Sandbox Code Playgroud)

你也是

cd /dir1/dir2
node pathtest.js
Run Code Online (Sandbox Code Playgroud)

你得到

. = /dir1/dir2
__dirname = /dir1/dir2
Run Code Online (Sandbox Code Playgroud)

你的工作目录是/dir1/dir2这样,这就是.解析.既然pathtest.js位于/dir1/dir2那也是__dirname解决的问题.

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

cd /dir1
node dir2/pathtest.js
Run Code Online (Sandbox Code Playgroud)

你得到

. = /dir1
__dirname = /dir1/dir2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你的工作目录是/dir1这样,这就是.决心,但__dirname仍解析/dir1/dir2.

.在里面使用require......

如果dir2/pathtest.js你在里面require打电话包含一个文件,dir1你会一直这样做

require('../thefile')
Run Code Online (Sandbox Code Playgroud)

因为里面的路径require总是相对于你调用它的文件.它与您的工作目录无关.

  • IMO,这个解释比接受答案中的解释更清楚(你知道,"当前目录"在那里有点模棱两可). (38认同)
  • 值得注意的是`./`并不总是*是从中启动节点的目录.它以这种方式开始,但可以通过`process.chdir()`进行更改.因此,`./`始终是当前工作目录,通常是从中启动的目录节点,除非您的代码显式更改了工作目录. (14认同)
  • 我同意.我会改变接受的答案.请记住,这个答案是在原来的一个被接受后的两年内添加的,我现在才注意到它(另外2年后).:) 迟到总比不到好! (5认同)
  • 我对使用有点困惑.inside require part,如果require里面的路径总是相对于你正在调用的文件,那路径应该是require('../ thefile')而不是require('../ dir1/thefile')?我认为...已经将路径的当前位置从dir2返回到dir1.你还需要把dir1放在路上还是我想念一些东西? (3认同)

fen*_*ent 152

./指的是当前工作目录,require()函数除外.使用时require(),它会转换./为当前文件的目录.__dirname始终是当前文件的目录.

例如,使用以下文件结构

/home/user/dir/files/config.json

{
  "hello": "world"
}
Run Code Online (Sandbox Code Playgroud)

/home/user/dir/files/somefile.txt

text file
Run Code Online (Sandbox Code Playgroud)

/home/user/dir/dir.js

var fs = require('fs');

console.log(require('./files/config.json'));
console.log(fs.readFileSync('./files/somefile.txt', 'utf8'));
Run Code Online (Sandbox Code Playgroud)

如果我cd进去/home/user/dir跑,node dir.js我会得到

{ hello: 'world' }
text file
Run Code Online (Sandbox Code Playgroud)

但是当我从同一个脚本运行时,/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)
Run Code Online (Sandbox Code Playgroud)

使用./与工作require,但不适合fs.readFileSync.这是因为fs.readFileSync,./转换为cwd(在这种情况下/home/user/).而且/home/user/files/somefile.txt不存在.

  • 你可以使用 `./` 或 `process.cwd()`。见 http://nodejs.org/api/process.html#process_process_cwd (2认同)