__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
运行下面的代码:
执行结果:
结果分析:
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 片段连接到一起,并规范化生成的路径。就是把多个参数字符串合并为一个路径字符串