thisissami thisissami - 6 months ago 79
Node.js Question

What is the difference between __dirname and ./ in 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.

Answer

The gist

In Node.js, __dirname is always the directory in which the currently executing script resides (see this). In other words, you typed __dirname into one of your script files and value would be that file's directory.

By contrast, . gives you the directory from which you ran the node command in your terminal window (i.e. your working directory).

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

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 ..
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('..\dir1\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.