__dirname与./的区别

Node.js中,__dirname总是指向被执行js文件的绝对路径,所以当你在/d1/d2/myScript.js文件中写了__dirname,它的值就是/d1/d2

./会返回你执行node命令的路径,

比如你在目录D盘下执行d1/d2/myScript.js

__dirname是d:/d1/d2

./指的是d:/

有一个特殊情况在require()中使用./时,这时的路径就会是含有require()的脚本文件的相对路径

例如:

假如有如下目录结构:

/dir1

  /dir2

   /pathtest.js

pathtest.js

const path=require('path');
console.log('.= %s',path.resolve('__dirname'));
console.log('__dirname= %s',path.resolve('.'));

然后执行下面的代码:

cd /dir1/dir2

node pathtest.js

结果:

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

 

如果我们的工作目录是dir1

cd /dir1

node dir2/pathtest.js

结果:

. = /dir1
__dirname = /dir1/dir2

此时,.指向我们的工作目录,即/dir1,__dirname还是指向/dir1/dir2

在require中使用.

如果在dir2/pathtest.js中调用了require方法,去引入位于dir1目录的js文件,你需要写成

require('../pathtest.js')

因为require中的路径总是相对于包含它的文件,跟你的工作目录没有关系。

path.resolve([...paths])  根据参数解析出一个绝对路径

传入参数:.../paths是传入的字符串参数,是路径序列或者路径片段

返回值:字符串

 以应用程序为根目录

普通字符串代表子目录

/代表绝对路径根目录

使用方法:

1 path.resolve()方法可以将路径或者路径片段解析成绝对路径

2 传入的路径从右至左被处理,后面每个path被依次解析,直到构造完成一个绝对路径。例如:path.resolve(‘/foo’,‘/bar’,‘baz’),将返回:/bar/baz

3 如果处理完全部给定的path片段后还未生成一个绝对路径,则当前工作目录(绝对路径)会被用上。

4 当传入的参数没有/时,将被传入解析到当前根目录

5 零长度的路径将被忽略

6 如果没有传入参数,将返回当前根目录

事例代码:

path.resolve('/foo/bar', './baz')
// Returns: '/foo/bar/baz'
 

path.resolve('/foo/bar', '/tmp/file/')
// Returns: '/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif')
// if the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

1 传入的路径从右向左解析,遇到第一个绝对路径时完成解析

2 ‘../’方法向前跳了一个目录

path.resolve()是一个修改和整合文件路径的方法

__dirname

运行下面的代码:

nodejs function 声明参数类型_字符串

执行结果:

 

nodejs function 声明参数类型_绝对路径_02

结果分析:
1.只传入__dirname也可以自动调用path.resolve方法
2.可以拼接路径字符串,但是不调用path.resolve()方法拼接失败
3.__dirname代表的是当前文件(a.js)的绝对路径
4.从右至左解析,遇到了绝对路径/src,因此直接返回

 

path.resolve()与__dirname最便捷的地方在于,与webpack结合更快捷的访问常用的文件。说白了就是解决了"由于访问文件所在的目录不同,访问固定目录下的某个文件,必须使用烦人的../../"这个痛点;

比如当我们结合webpack为目录设置快捷的import方法的时候。

修改之前 import foo from '../../../util/foo'

修改之后import foo from 'util/foo'

webpack配置 build/webpack.dev.conf.js

resolve:{
  //解析扩展名
   extensions:[],
 alias:{
  // 快捷访问入口
  “util”:path.resolve(__dirname,'./src/util')
   }
}

path.join([...paths])

path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。就是把多个参数字符串合并为一个路径字符串

nodejs function 声明参数类型_根目录_03