在 Node.js 编程时,如果引用的文件与当前目录有关联,是否有理由使用 __dirname
变量而不是普通的 ./
呢?到目前为止,我一直在我的代码中使用 ./
,刚刚发现了 __dirname
的存在,想知道将我的 ./'s 转换为 __dirname
是否明智,如果是,为什么这是一个明智的想法。
在 Node.js 编程时,如果引用的文件与当前目录有关联,是否有理由使用 __dirname
变量而不是普通的 ./
呢?到目前为止,我一直在我的代码中使用 ./
,刚刚发现了 __dirname
的存在,想知道将我的 ./'s 转换为 __dirname
是否明智,如果是,为什么这是一个明智的想法。
在Node.js中,__dirname
始终代表当前正在执行的脚本所在的目录(参见此处)。因此,如果在 /d1/d2/myscript.js
文件中键入 __dirname
,则其值将为 /d1/d2
。
相比之下,.
会给出你在终端窗口中使用 node
命令时的目录(即你的工作目录),当你使用像 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/dir2
,所以.
代表的就是这个目录。由于pathtest.js
位于/dir1/dir2
中,因此__dirname
也会被解析为该目录。
但是,如果你从/dir1
运行脚本
cd /dir1
node dir2/pathtest.js
你得到了什么
. = /dir1
__dirname = /dir1/dir2
在这种情况下,您的工作目录是/dir1
,因此.
解析为该目录,但__dirname
仍然解析为/dir1/dir2
。
require
中的.
...如果在dir2/pathtest.js
中,您有一个require
调用以包括dir1
内的文件,则始终应执行以下操作:
require('../thefile')
require
中的路径始终相对于调用它的文件,与您的工作目录无关。
./
并不总是Node.js启动时当前的目录。它最初确实是这样,但是可以通过process.chdir()
更改。因此,./
始终是当前工作目录,通常是Node.js启动时的目录,除非您的代码显式更改了工作目录。 - gilly3../someDir
,并且您将从不同的文件夹运行该命令,那么您该怎么做呢? - cbdeveloper__dirname
全局变量已经被移除,但可以通过import { dirname } from "path";
进行替换。 - Robin Métral./
表示当前工作目录,但在 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'));
如果我进入/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
,./
会被解析为当前工作目录(在本例中为/home/user/
)。而/home/user/files/somefile.txt
并不存在。
/movies
加载文件,但由于我的模块在文件/custom_modules/
中,__dirname
会尝试从/custom_modules/movies
获取电影。 - user3818284./
或process.cwd()
。参见http://nodejs.org/api/process.html#process_process_cwd - fent
require
中使用.
,否则require
中的路径始终相对于调用require
的文件。 - Govind Rai