要点
在 Node.js 中,__dirname 始终是当前执行脚本所在的目录 (see this)。因此,如果您在/d1/d2/myscript.js 中键入__dirname,则值将是/d1/d2。
相比之下,. 为您提供了在您使用 path 和 fs 等库时在终端窗口中运行 node 命令的目录(即您的工作目录)。从技术上讲,它最初是您的工作目录,但可以使用 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 中的路径总是相对于你调用它的文件。它与您的工作目录无关。