当在Node.js中编程并引用与当前目录相关的文件时,是否有任何理由使用__dirname变量而不是常规的。/?到目前为止,我一直在我的代码中使用。/,只是发现了__dirname的存在,本质上是想知道它是否将我的./转换为它是聪明的,如果是这样,为什么这将是一个聪明的想法。
当前回答
要点
在Node.js中,__dirname始终是当前执行脚本所在的目录(参见此)。因此,如果你在/d1/d2/myscript.js中输入__dirname,其值将是/d1/d2。
相比之下,。当你使用像path和fs这样的库时,给出你在终端窗口中运行node命令的目录(即你的工作目录)。从技术上讲,它开始作为您的工作目录,但可以使用process.chdir()进行更改。
例外是当你使用。与要求()。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 . xml运行脚本
cd /dir1
node dir2/pathtest.js
你得到
. = /dir1
__dirname = /dir1/dir2
在这种情况下,你的工作目录是/dir1。解析为,但__dirname仍然解析为/dir1/dir2。
使用。里面需要……
如果在dir2/pathtest.js中有一个require调用,在dir1中包含一个文件,你总是会这样做
require('../thefile')
因为require里面的路径总是相对于调用它的文件。它与您的工作目录无关。
其他回答
要点
在Node.js中,__dirname始终是当前执行脚本所在的目录(参见此)。因此,如果你在/d1/d2/myscript.js中输入__dirname,其值将是/d1/d2。
相比之下,。当你使用像path和fs这样的库时,给出你在终端窗口中运行node命令的目录(即你的工作目录)。从技术上讲,它开始作为您的工作目录,但可以使用process.chdir()进行更改。
例外是当你使用。与要求()。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 . xml运行脚本
cd /dir1
node dir2/pathtest.js
你得到
. = /dir1
__dirname = /dir1/dir2
在这种情况下,你的工作目录是/dir1。解析为,但__dirname仍然解析为/dir1/dir2。
使用。里面需要……
如果在dir2/pathtest.js中有一个require调用,在dir1中包含一个文件,你总是会这样做
require('../thefile')
因为require里面的路径总是相对于调用它的文件。它与您的工作目录无关。
./指当前工作目录,require()函数除外。当使用require()时,它将./转换为当前被调用的文件的目录。__dirname始终是当前文件的目录。
例如,使用下面的文件结构
/ home /用户文件/目录配置json。
{
"hello": "world"
}
/ home /用户目录/文件somefile . txt。
text file
/ home /用户dir - dir js。
var fs = require('fs');
console.log(require('./files/config.json'));
console.log(fs.readFileSync('./files/somefile.txt', 'utf8'));
如果我cd到/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, ./转换为cwd(在本例中为/home/user/)。/home/user/files/somefile.txt不存在。
推荐文章
- npm install和npm run build有什么区别?
- 使用async/await尝试/捕获块
- 有没有办法修复包锁。json lockfileVersion所以npm使用特定的格式?
- 如何使用npm全局安装一个模块?
- 实时http流到HTML5视频客户端的最佳方法
- 使用node.js下载图像
- Node.js Express中的HTTP GET请求
- Node.js:将文本文件读入数组。(每一行都是数组中的一项。)
- npm犯错!错误:EPERM:操作不允许,重命名
- Node Sass还不支持当前环境:Linux 64位,带false
- 我如何添加环境变量启动。VSCode中的json
- 解析错误:无法读取文件“…/tsconfig.json”.eslint
- 在Node.js中'use strict'语句是如何解释的?
- 当WebSockets可用时,为什么要使用AJAX ?
- 使用过程。TypeScript中的env