Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between __dirname and ./ in node.js?

Tags:

node.js

When programming in Node.js and referencing files that are located somewhere in relation to your current directory, is there any reason to use the __dirname variable instead of just a regular ./? I've been using ./ thus far in my code and just discovered the existence of __dirname, and essentially want to know whether it would be smart to convert my ./'s to that, and if so, why that would be a smart idea.

like image 511
thisissami Avatar asked Nov 15 '11 04:11

thisissami


People also ask

What is __ Dirname in node js?

__dirname: It is a local variable that returns the directory name of the current module. It returns the folder path of the current JavaScript file. Difference between process.cwd() vs __dirname in Node.js is as follows: process.cwd()

Where is __ Dirname defined?

The __dirname or __filename global variables are not available in ECMAScript module files. To solve the "__dirname is not defined in ES module scope" error, import and use the dirname() method from the path module. The dirname method takes a path as a parameter and returns the directory name of the path.

What is __ Dirname in Webpack?

The __dirname is set to / by webpack, that's why you end up with /views/index. html which is the root of your file system, that happens to be D:\ in your case. You can set node. dirname to false in your webpack config to not inject it and defer it to runtime.

What does path dirname do?

The path. dirname() method returns the directories of a file path.


1 Answers

The gist

In Node.js, __dirname is always the directory in which the currently executing script resides (see this). So if you typed __dirname into /d1/d2/myscript.js, the value would be /d1/d2.

By contrast, . gives you the directory from which you ran the node command in your terminal window (i.e. your working directory) when you use libraries like path and fs. Technically, it starts out as your working directory but can be changed using process.chdir().

The exception is when you use . with require(). The path inside require is always relative to the file containing the call to require.

For example...

Let's say your directory structure is

/dir1   /dir2     pathtest.js 

and pathtest.js contains

var path = require("path"); console.log(". = %s", path.resolve(".")); console.log("__dirname = %s", path.resolve(__dirname)); 

and you do

cd /dir1/dir2 node pathtest.js 

you get

. = /dir1/dir2 __dirname = /dir1/dir2 

Your working directory is /dir1/dir2 so that's what . resolves to. Since pathtest.js is located in /dir1/dir2 that's what __dirname resolves to as well.

However, if you run the script from /dir1

cd /dir1 node dir2/pathtest.js 

you get

. = /dir1 __dirname = /dir1/dir2 

In that case, your working directory was /dir1 so that's what . resolved to, but __dirname still resolves to /dir1/dir2.

Using . inside require...

If inside dir2/pathtest.js you have a require call into include a file inside dir1 you would always do

require('../thefile') 

because the path inside require is always relative to the file in which you are calling it. It has nothing to do with your working directory.

like image 54
d512 Avatar answered Oct 14 '22 20:10

d512