Wednesday, July 3, 2019

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

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.






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.

No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...