本文小编为大家详细介绍“Node.js中path.resolve与path.join的区别与作用是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js中path.resolve与path.join的区别与作用是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
前言:
讲解之前,大致的讲解一下所涉及的知识点;
path 模块:用于处理文件和目录的路径的实用工具,使用前需先引入模块;
path.join():用于链接路径,并且会自动转换当前系统路径的分隔符"/"或"";
path.resolve():也是用于链接路径,但却和path.join()方法却很多不同,而且path.resolve()方法本身就自带一个to的绝对路径参数,也会自动转换分隔符,在某些场景用起来也方便很多;
__dirname:是node的一个全局变量,获得当前文件所在目录的完整目录名,搭配path一起使用;
关于 path.resolve() 的使用
语法:path.resolve([from ...], to)
案例一:
演示当"path"路径为空时,得到结果是当前文件所在的绝对路径,类似 __dirname ;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.resolve()); console.log(path.resolve('')); console.log(path.resolve(__dirname); // 输出:E:Berlin-Casepath // 输出:E:Berlin-Casepath // 输出:E:Berlin-Casepath
案例二:
演示字符以 ./ 开头或者没有字符时,得到的结果是加不加 ./ 都不影响路径的拼接;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.resolve()); console.log(path.resolve('a')); console.log(path.resolve('a','b')); console.log(path.resolve('c','b','a')); console.log(path.resolve('./a')); console.log(path.resolve('a','./b')); console.log(path.resolve('./c','b','./a')); // 输出:E:Berlin-Casepath // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Casepathca // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Casepathca
案例三:
演示字符以 / 开头,path.resolve()的特点之一就是碰到"/"斜杆则会直接跳转到E盘的根路径(在哪个盘运行就是哪个盘),这里跟在终端输出cd /是一样的原理,也会跳转到E盘的根路径;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.resolve()); console.log(path.resolve('/a')); console.log(path.resolve('/a','b','c')); console.log(path.resolve('a','/b','c')); console.log(path.resolve('c','b','/a')); // 输出:E:Berlin-Casepath // 输出:E:a // 输出:E:ac // 输出:E:c // 输出:E:a
案例四:
演示字符以../开头,也就是上一层的意思,path.resolve()会把下个要拼接的"path"路径给覆盖掉;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.resolve()); console.log(path.resolve('../')); console.log(path.resolve('../a')); console.log(path.resolve('../a','b')); console.log(path.resolve('a','../b')); console.log(path.resolve('c','b','../a')); console.log(path.resolve('../c','b','a')); // 输出:E:Berlin-Casepath // 输出:E:Berlin-Case // 输出:E:Berlin-Casea // 输出:E:Berlin-Casea // 输出:E:Berlin-Casepath // 输出:E:Berlin-Casepathca // 输出:E:Berlin-Caseca
案例五:
演示path.resolve()搭配__dername变量
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.resolve(__dirname,'a')); console.log(path.resolve('a','b',__dirname)); console.log(path.resolve(__dirname,'./a','b')); console.log(path.resolve(__dirname,'/a','b')); console.log(path.resolve(__dirname,'../a','b')); console.log(path.resolve(__dirname,'a','../b')); console.log(path.resolve('a','/b',__dirname)); // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Casepath // 输出:E:Berlin-Casepatha // 输出:E:a // 输出:E:Berlin-Casea // 输出:E:Berlin-Casepath // 输出:E:Berlin-Casepath
从案例五例子可以看出,__dirname变量需放在第一个,否则会覆盖在它之前的'path'路径,包括斜杠' / ',还有个要注意的点,__dirname之后也不能出现' / ',不然也覆盖之前的路径;
总结:
path.resolve("./path")的特性有以下几点:
从右往左读取"path"路径,并开始拼接,本身就自带绝对路径参数 "to" ;
当"path"路径为空时,则会直接获取当前文件所在的绝对路径;
当遇到字符以 ./ 开头或者没有字符,则正常拼接,所以可省略不加字符;
当遇到字符以 / 开头,则不会拼接到前面的路径并以自身所在盘为根路径加以拼接;
当遇到字符以 ../ 开头,则会将下一个要拼接"path"路径给覆盖,然后继续往左拼接;
搭配__dirname时,需将放置第一位,且与 ' / ' 有互相覆盖的冲突;
关于 path.join() 的使用
语法:path.join([path2][, path3][, ...])
案例一:
演示当"path"路径为无或空时,得到的结果是" . ",只有传入__dirname的时候,才能得到绝对路径
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.join()); console.log(path.join('')); console.log(path.join(__dirname)); // 输出:. // 输出:. // 输出:E:Berlin-Casepath
案例二:
演示字符以 ./ 开头或者 / 和没有字符,得到的结果是加不加都不影响路径的拼接,此时你应该发现跟path.resolve()的有所不同了,因为resolve()只会单纯的去拼接你写入的"path"路径,而不会像path.resolve()那样用cd去运作;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.join()); console.log(path.join('a')); console.log(path.join('a','b')); console.log(path.join('c','b','a')); console.log(path.join('./a')); console.log(path.join('a','./b')); console.log(path.join('./c','b','./a')); console.log(path.join('/a')); console.log(path.join('a','/b')); console.log(path.join('/c','b','/a')); // 输出:. // 输出:a // 输出:a // 输出:ca // 输出:a // 输出:a // 输出:ca // 输出:a // 输出:a // 输出:ca
案例三:
演示以 ../ 开头的字符,此时你会发现join()不仅是单纯的去拼接路径,而且也是从右到左去拼接的,../之后还有"path"路径的话,也是会被覆盖掉;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.join()); console.log(path.join('../')); console.log(path.join('../a')); console.log(path.join('../a','b')); console.log(path.join('a','../b')); console.log(path.join('c','b','../a')); console.log(path.join('../c','b','a')); // 输出:. // 输出:.. // 输出:..a // 输出:..a // 输出:b // 输出:ca // 输出:..ca
案例四:
演示path.join()搭配__dername变量,为什么一定要把它放在第一位?
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.join(__dirname,'a')); console.log(path.join('a',__dirname)); // 输出:E:Berlin-Casepatha // 输出:aE:Berlin-Casepath
看出区别了吗?对的,没错,join会不管对错,直接把你写入的路径都拼接到一块,这也是为什么要放在第一位的原因,当然resolve()就没这种问题,接下来继续演示,与字符的搭配;
// 引入path模块 const path = require('path'); // 此处直接打印 console.log(path.join(__dirname,'/a')); console.log(path.join(__dirname,'./a')); console.log(path.join(__dirname,'../')); console.log(path.join(__dirname,'../a')); console.log(path.join(__dirname,'../a','b')); // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Casepatha // 输出:E:Berlin-Case // 输出:E:Berlin-Casea // 输出:E:Berlin-Casea
以上示例可以看出,'/' './' 这两个字符在path.join()的方法中是不起作用的,不加也是一样的效果,只有 '../ ' 才有返回上级目录的作用,所以使用path.join()时,加个__dirname,拼上你要的"path"路径即可;(不加会很麻烦哦)
总结:
在path.join()方法中,'/' 与 './' 一般情况下可以不用(特殊情况的拼接除外哈);
在path.join()方法中,最好与__dirname变量搭配使用;
path.join()方法也是从右到左依次被解析排列组成路径的;
path.resolve与path.join的区别
结合上面两个方法的演示后的总结,它们之间的区别如下:
path.resolve()自带to参数,也就是当前输出文件的路径,而path.join()没有;
path.resolve()遇到 ' / ' 则会跳转到根目录(E:),而path.join()则没效果;
path.resove()搭配__dirname变量使用时,就算__dirname在最右边,resolve()会把左边的"path"路径给覆盖掉,形成正确的路径,而path.join()正常拼接,无论对错。