path.resolve和path.resolve的用法
前言:要搞清楚path.join()和path.resolve的具体作用,最好自己搞个文件,用node跑一遍去测试一下。只有自己亲自动手实践了,才知道具体是怎么回事,才能真正的理解
一、path.join()
使用平台特定的分隔符(unix系统是 / ,windows系统是 \ )把全部给定的path片段连接到一起,并规范化生成的路径。若任意一个路径片段类型错误,会报错。
__dirname // __dirname返回当前文件所在的绝对路径 const path = require('path'); const path1 = path.join(__dirname, '/foo'); const path2 = path.join(__dirname, './foo/bar'); const path3 = path.join('/foo', 'bar', '/baz/apple', 'aaa', '..'); const path4 = path.join('foo', 'bar', 'baz'); const path5 = path.join(__dirname,'../public') //Users/xiao/work/public join碰到../也会跳出 console.log(path1); console.log(path2); console.log(path3); console.log(path4); // 输出结果 /Users/xiao/work/test/foo /Users/xiao/work/test/foo/bar /foo/bar/baz/apple foo/bar/baz
二、path.resolve
path.resolve方法是把一个路径或路径片段的序列解析为一个绝对路径。例如
const path = require('path'); const path1 = path.resolve('/a/b', '/c/d'); // 结果: /c/d const path2 = path.resolve('/a/b', 'c/d'); // 输出: /a/b/c/d const path3 = path.resolve('/a/b', '../c/d'); // 输出: /a/c/d const path4 = path.resolve('a', 'b'); // 输出: /Users/xiao/work/test/a/b
resolve把 ' / ' 当成根目录,path.resolve()方法可以将多个路径解析为一个规范化的绝对路径。其处理方式类似于对这些路径逐一进行cd操作。
path.resolve('www', 'static', '../public', 'src', '..'); // cd www /Users/xiao/work/test/www // cd static /Users/xiao/work/test/www/static // cd ../public /Users/xiao/work/test/www/public 碰到../会跳出 // cd src /Users/xiao/work/test/www/public/src // cd .. /Users/xiao/work/test/www/public .. 的意思似乎是取消
三、区别
1、join是把各个path片段连接在一起,resolve把' / ' 当成根目录
path.join('/a', '/b'); // /a/b path.resolve('/a', '/b'); // /b
2.resolve在传入非 / 路径时,会自动加上当前目录形成一个绝对路径,而join仅仅用于路径拼接
// 当前路径为 /Users/xiao/work/test path.join('a', 'b', '..', 'd'); // a/d path.resolve('a', 'b', '..', 'd'); // /Users/xiao/work/test/a/d
可以看出resolve在传入的第一个参数为非根路径时,会返回一个带当前目录的绝对路径。
__dirname 表示当前文件所在的目录的绝对路径
process.cwd() 返回运行当前脚本的工作目录的路径
参考:path.join()和path.resolve()的区别
node中__dirname、__filename、process.cwd()、process.chdir()表示的路径