Node.js中path.resolve与path.join的区别与作用详解

 更新时间:2023年03月17日 14:37:40   作者:HBerlin  
path.resolve和path.join都是属于path核心模块下的方法,用来拼接路径,下面这篇文章主要给大家介绍了关于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-Case\path
// 输出:E:\Berlin-Case\path
// 输出:E:\Berlin-Case\path

案例二:

演示字符以 ./ 开头或者没有字符时,得到的结果是加不加 ./ 都不影响路径的拼接;

// 引入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-Case\path
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\path\a\b
// 输出:E:\Berlin-Case\path\c\b\a
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\path\a\b
// 输出:E:\Berlin-Case\path\c\b\a

案例三: 

演示字符以 / 开头,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-Case\path
// 输出:E:\a
// 输出:E:\a\b\c
// 输出:E:\b\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-Case\path
// 输出:E:\Berlin-Case\
// 输出:E:\Berlin-Case\a
// 输出:E:\Berlin-Case\a\b
// 输出:E:\Berlin-Case\path\b
// 输出:E:\Berlin-Case\path\c\a
// 输出:E:\Berlin-Case\c\b\a

 案例五:

演示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-Case\path\a
// 输出:E:\Berlin-Case\path
// 输出:E:\Berlin-Case\path\a\b
// 输出:E:\a\b
// 输出:E:\Berlin-Case\a\b
// 输出:E:\Berlin-Case\path\b
// 输出:E:\Berlin-Case\path

 从案例五例子可以看出,__dirname变量需放在第一个,否则会覆盖在它之前的'path'路径,包括斜杠' / ',还有个要注意的点,__dirname之后也不能出现' / ',不然也覆盖之前的路径;

总结:

path.resolve("./path")的特性有以下几点:

  1. 从右往左读取"path"路径,并开始拼接,本身就自带绝对路径参数 "to" ;
  2. 当"path"路径为空时,则会直接获取当前文件所在的绝对路径;
  3. 当遇到字符以 ./ 开头或者没有字符,则正常拼接,所以可省略不加字符;
  4. 当遇到字符以 / 开头,则不会拼接到前面的路径并以自身所在盘为根路径加以拼接;
  5. 当遇到字符以 ../ 开头,则会将下一个要拼接"path"路径给覆盖,然后继续往左拼接;
  6. 搭配__dirname时,需将放置第一位,且与 ' / ' 有互相覆盖的冲突;

关于 path.join() 的使用

语法:path.join([path1][, path2][, ...])

案例一:

演示当"path"路径为无或空时,得到的结果是" . ",只有传入__dirname的时候,才能得到绝对路径

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.join());
console.log(path.join(''));
console.log(path.join(__dirname));
// 输出:.
// 输出:.
// 输出:E:\Berlin-Case\path

案例二:

演示字符以 ./ 开头或者 / 和没有字符,得到的结果是加不加都不影响路径的拼接,此时你应该发现跟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\b
// 输出:c\b\a
// 输出:a
// 输出:a\b
// 输出:c\b\a
// 输出:\a
// 输出:a\b
// 输出:\c\b\a

案例三:

演示以 ../ 开头的字符,此时你会发现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
// 输出:b
// 输出:c\a
// 输出:..\c\b\a

案例四:

演示path.join()搭配__dername变量,为什么一定要把它放在第一位?

// 引入path模块
const path = require('path');
 
// 此处直接打印
console.log(path.join(__dirname,'a'));
console.log(path.join('a',__dirname));
 
// 输出:E:\Berlin-Case\path\a
// 输出:a\E:\Berlin-Case\path

看出区别了吗?对的,没错,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-Case\path\a
// 输出:E:\Berlin-Case\path\a
// 输出:E:\Berlin-Case\
// 输出:E:\Berlin-Case\a
// 输出:E:\Berlin-Case\a\b

以上示例可以看出,'/'  './' 这两个字符在path.join()的方法中是不起作用的,不加也是一样的效果,只有 '../ ' 才有返回上级目录的作用,所以使用path.join()时,加个__dirname,拼上你要的"path"路径即可;(不加会很麻烦哦)

总结:

  • 在path.join()方法中,'/' 与 './' 一般情况下可以不用(特殊情况的拼接除外哈);
  • 在path.join()方法中,最好与__dirname变量搭配使用;
  • path.join()方法也是从右到左依次被解析排列组成路径的;

path.resolve与path.join的区别

结合上面两个方法的演示后的总结,它们之间的区别如下:

  1. path.resolve()自带to参数,也就是当前输出文件的路径,而path.join()没有;
  2. path.resolve()遇到 ' / ' 则会跳转到根目录(E:\),而path.join()则没效果;
  3. path.resove()搭配__dirname变量使用时,就算__dirname在最右边,resolve()会把左边的"path"路径给覆盖掉,形成正确的路径,而path.join()正常拼接,无论对错;

到此这篇关于Node.js中path.resolve与path.join的区别与作用的文章就介绍到这了,更多相关Node.js path.resolve与path.join内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Node.js服务器开启Gzip压缩教程

    Node.js服务器开启Gzip压缩教程

    开启网站的 gzip 压缩功能,通常可以高达70%,也就是说,如果你的网页有30K,压缩之后就变成9K, 对于大部分网站,显然可以明显提高浏览速度(注:需要浏览器支持)。
    2017-08-08
  • 详解nodejs 开发企业微信第三方应用入门教程

    详解nodejs 开发企业微信第三方应用入门教程

    这篇文章主要介绍了详解nodejs 开发企业微信第三方应用入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • nodejs前端自动化构建环境的搭建

    nodejs前端自动化构建环境的搭建

    本文这里给大家介绍的是nodejs中前端自动化构建环境的搭建方法,非常的细致全面,有需要的小伙伴可以参考下
    2017-07-07
  • Node.js连接MySQL数据库的操作步骤

    Node.js连接MySQL数据库的操作步骤

    在现代 Web 开发中,与数据库的交互是不可避免的一部分,Node.js提供了许多库和模块,使得连接和操作 MySQL 数据库变得相对简单,本文将介绍如何使用Node.js连接MySQL数据库,并进行一些基本的操作,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 详解Node.js如何开发命令行工具

    详解Node.js如何开发命令行工具

    追求更高的效率是码农不断的追求。选择合适的工具,合理搭配使用,既能提高一部分开发效率,又能改善写代码时的心情。使用Node.js开发命令行工具是开发者应该掌握的一项技能,适当编写命令行工具以提高开发效率。
    2016-08-08
  • 详解nodejs 配置文件处理方案

    详解nodejs 配置文件处理方案

    这篇文章主要介绍了详解nodejs 配置文件处理方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 使用 NodeJS+Express 开发服务端的简单介绍

    使用 NodeJS+Express 开发服务端的简单介绍

    这篇文章主要介绍了使用 NodeJS+Express 开发服务端的简单介绍,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • 浅谈Node.js之异步流控制

    浅谈Node.js之异步流控制

    本篇文章主要介绍了浅谈Node.js之异步流控制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 从零开始学习Node.js系列教程四:多页面实现的数学运算示例

    从零开始学习Node.js系列教程四:多页面实现的数学运算示例

    这篇文章主要介绍了Node.js多页面实现的数学运算,涉及nodejs请求响应、数值传递、运算等相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • 在Node.js中处理CORS问题的解决方案

    在Node.js中处理CORS问题的解决方案

    当今的网络应用程序越来越多地涉及跨域资源共享(CORS)问题,这是因为现代浏览器实施了安全策略,限制了跨源HTTP请求,什么是CORS?如何在Node.js中处理CORS问题,需要的朋友可以参考下
    2024-07-07

最新评论