关于node.js:process.cwd()与__dirname有什么区别?

What's the difference between process.cwd() vs __dirname?

之间有什么区别

1
console.log(process.cwd())

1
console.log(__dirname);

我已经看到两者都用在相似的上下文中。


process.cwd()返回当前工作目录,

即您从其中调用node命令的目录。

__dirname返回包含JavaScript源代码文件的目录的目录名称


根据节点js文档
process.cwd()

cwd是全局对象process的方法,返回一个字符串值,该字符串值是Node.js进程的当前工作目录。

根据节点js文档
__dirname

当前脚本的目录名称,作为字符串值。 __dirname实际上不是全局变量,而是每个模块的局部变量。

让我举例说明,

假设我们有一个main.js文件驻留在C:/Project/main.js内部
并运行node main.js这两个值都返回相同的文件

或仅使用以下文件夹结构

1
2
3
4
Project
├── main.js
└──lib
   └── script.js

main.js

1
2
3
4
5
6
console.log(process.cwd())
// C:\Project
console.log(__dirname)
// C:\Project
console.log(__dirname===process.cwd())
// true

假设我们在项目的子目录(即C:/Project/lib/script.js)中有另一个文件script.js,并运行node main.js,它们需要script.js

main.js

1
2
3
4
5
6
7
require('./lib/script.js')
console.log(process.cwd())
// C:\Project
console.log(__dirname)
// C:\Project
console.log(__dirname===process.cwd())
// true

script.js

1
2
3
4
5
6
console.log(process.cwd())
// C:\Project
console.log(__dirname)
// C:\Project\lib
console.log(__dirname===process.cwd())
// false


了解每个范围可以使事情更容易记住。

processnode的全局对象,并且.cwd()返回节点运行的位置。

__dirnamemodule的属性,代表模块的文件路径。在节点中,一个模块驻留在一个文件中。

同样,__filename是另一个module的属性,它保存模块的文件名。


$ find proj

1
2
3
proj
proj/src
proj/src/index.js

$ cat proj/src/index.js

1
2
console.log("process.cwd() =" + process.cwd());
console.log("__dirname =" + __dirname);

$ cd proj; node src/index.js

1
2
process.cwd() = /tmp/proj
__dirname = /tmp/proj/src