Nodejs REPL模式与运行.js文件的区别(比如说__dirname)的问题

Nodejs REPL模式与运行.js文件的区别(比如说__dirname)的问题

The name of the directory that the currently executing script resides in.

from http://nodejs.org/api/globals.html#globals_dirname

首先你得是个 script

REPL其实也可以得到:

PS C:\mongodb\bin> node
> process.cwd()
'C:\\mongodb\\bin'

3 回复

Node.js REPL模式与运行.js文件的区别(比如说__dirname

背景介绍

在Node.js中,__dirname 是一个全局变量,它表示当前执行的脚本所在的目录。这在编写模块化代码时非常有用,特别是在处理文件路径或读取资源文件时。

REPL模式与运行.js文件的区别

1. __dirname 在REPL模式中的表现

当你在REPL(Read-Eval-Print Loop)模式下启动Node.js时,__dirname 表示的是你启动Node.js命令时所在的目录。例如:

PS C:\Users\example> node
> console.log(__dirname);
C:\Users\example

在这个例子中,__dirname 返回的是你在命令行中启动Node.js的目录。

2. __dirname 在运行.js文件时的表现

当你运行一个 .js 文件时,__dirname 返回的是该文件所在的目录。例如,假设你的项目结构如下:

/project
  /src
    app.js

如果你在 /project 目录下运行 src/app.js,那么 __dirname 将返回 /project/src

// src/app.js
console.log(__dirname); // 输出: C:\path\to\your\project\src

示例代码

让我们通过一些简单的示例来说明这一点。

REPL模式示例

PS C:\Users\example> node
> console.log(__dirname);
C:\Users\example

运行.js文件示例

假设我们有以下目录结构:

/project
  /src
    app.js

app.js 中:

console.log(__dirname);

在命令行中运行:

PS C:\Users\example> node C:\path\to\your\project\src\app.js
C:\path\to\your\project\src

总结

  • 在REPL模式下,__dirname 返回的是你启动Node.js命令时所在的目录。
  • 在运行.js文件时,__dirname 返回的是该文件所在的目录。

理解这些区别有助于更好地管理和组织你的Node.js项目,特别是在处理文件路径和资源文件时。


这个并没有如此简单吧,我在学习这篇的时候 mongoose教程 在REPL下会抛出

> personEntity.speak();
TypeError: Object { name: 'Krouky', _id: 52f48d9dba3964b539a9acff } has no method 'speak'
    at repl:1:14
    at REPLServer.self.eval (repl.js:110:21)
    at repl.js:249:20
    at REPLServer.self.eval (repl.js:122:7)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)

在Node.js中,__dirname 是一个全局变量,表示当前执行脚本所在的目录名。在REPL模式下和通过运行 .js 文件时,__dirname 的表现形式有所不同。

在 .js 文件中使用 __dirname

当你在一个 .js 文件中使用 __dirname 时,它会返回该文件所在目录的绝对路径。例如:

// script.js
console.log(__dirname);

假设 script.js 位于 C:\myproject\src 目录下,那么输出将是:

C:\myproject\src

在REPL模式下使用 __dirname

在REPL模式下,__dirname 的值取决于你启动REPL时的当前工作目录。REPL默认使用 process.cwd() 来确定当前工作目录,而不是特定文件的目录。例如:

PS C:\mongodb\bin> node
> console.log(__dirname);
C:\mongodb\bin
> process.cwd();
'C:\\mongodb\\bin'

示例代码

.js 文件中使用 __dirname

创建一个简单的 .js 文件:

// script.js
console.log('The directory is:', __dirname);

运行该文件:

PS C:\myproject\src> node script.js
The directory is: C:\myproject\src

在REPL模式下使用 __dirname

启动REPL并检查 __dirnameprocess.cwd()

PS C:\mongodb\bin> node
> console.log(__dirname);
C:\mongodb\bin
> process.cwd();
'C:\\mongodb\\bin'

总结

  • .js 文件__dirname 返回的是该文件所在的目录。
  • REPL模式__dirname 返回的是启动REPL时的当前工作目录(即 process.cwd() 的值)。

理解这些区别有助于更好地管理文件路径和处理不同的应用场景。

回到顶部