前言我在做webpack配置的时候,多次使用到路径相关的内容。最近在写项目的时候,有一个文件需要上传到阿里云oss。同时,本地服务器也需要保留一份文件备份。文件路径相关内容和Node核心API的路径模块我都用过很多次,所以系统研究了一下,整理了这篇文章。node中的路径分类node中的路径大致分为5类,dirname、filename、process.cwd()、./、../,其中dirname、filename、process.cwd()的绝对路径是针对各分类通过代码说明:文件目录结构如下:);console.log(__filename);console.log(process.cwd());console.log(path.resolve('./'));运行代码pra中的命令nodenodecoreAPI/path.js目录,我们可以看到如下结果:/koala/Desktop/ProgrammerGrowthGuide/Codepra/nodeCoreAPI/koala/Desktop/ProgrammerGrowthGuide/Codepra/nodeCoreAPI/path.js/koala/Desktop/Programmer成长指南/Codepra/koala/Desktop/ProgrammerGrowthGuide/Codepra然后我们就可以在node核心API目录下运行这个文件,nodepath.js,运行结果如下:/koala/Desktop/ProgrammerGrowthGuide/codepra/node核心API/koala/Desktop/程序员成长指南/codepra/node核心API/path.js/koala/Desktop/程序员成长指南/codepra/nodecoreAPI/koala/Desktop/程序员成长指南/codepra/node核心API对比输出结果,暂时得出的结论是__dirname:总是返回执行的js所在文件夹的绝对路径__filename:总是返回执行的js进程的绝对路径。cwd():始终返回运行node命令的文件夹的绝对路径。/:同process.cwd(),返回node命令所在文件夹的绝对路径。为什么说上面是暂时的结论呢,因为有错误,我们再看一段代码:我们在path.js中加入这段代码exports.A=1;之前直接通过readFile读取文件路径,报错,fs.readFile('./path.js',function(err,data){});现在在刚才报错的fs.js中加入这两行代码:consttest=require('./path.js');console.log(test)runnodenodecoreAPI/fs.js中codepra/目录,最后查看结果,说明可以访问:{A:1}那么关于./的正确结论是:在require()中使用和__dirname效果一样,不会因到启动脚本的不同目录。在其他情况下,它与process.cwd()的作用相同,是相对于启动脚本所在目录的path路径知识的总结。:__dirname:获取当前执行文件所在目录的完整目录名__filename:获取当前执行文件完整绝对路径的文件名process.cwd():获取node命令时的文件夹目录名currentlyexecuted./:No当使用require时,./与process.cwd()相同。使用require时,它??与__dirname相同。使用require()时只使用相对路径(./,../),其他地方使用绝对路径。如下://当前目录下的path.dirname(__filename)+'/path.js';//相邻目录中的path.resolve(__dirname,'../regx/regx.js');路径在路径前面已经说明了,接下来我们单独说说路径模块。这个模块在很多地方都很常用。所以,对于我们来说,掌握它对我们以后的发展更有好处,不用每次都去找webpack的配置文件。查看这个api是干什么用的,会影响我们的效率。这是api官网地址:https://nodejs.org/api/path.html个人认为没必要掌握官网所有的api,下面会介绍一些常用的API来说明一下,我经常用到,或者作为前端开发工程师,在配置webpack等项目的时候经常用到。path.normalize说明constpath=require('path');console.log(path.normalize('/koala/Desktop//程序员成长指南//Codepra/..'));归一化后的结果/koala/Desktop/程序员成长指南/代码pra的作用是对标准化路径进行归一化,对非标准路径进行归一化。path.join说明constpath=require('path');console.log(path.join('src','task.js'));constpath=require('path');console.log(path.加入(''));转换后的结果src/task.js。函数概要path.join([...paths])传入的参数是字符串的路径段,可以是一个也可以是多个第一个返回是拼接的路径,但是根据平台的不同,会规范化路径不同的。比如Unix系统是/,Windows系统是\,那么你在两个系统中看到的返回结果是不一样的。如果返回的路径字符串的长度为零,那么他将返回一个.代表当前文件夹。如果传入的参数有一个不是字符串,则直接报错path.parseexampleconstpath=require('path');North/codepra/nodecoreAPI'));Runresult{root:'/',dir:'/koala/Desktop/程序员成长指南North/codepra',base:'nodecoreAPI',ext:'',name:'nodecoreAPI'}函数概要他返回的是一个对象,下面我们来熟悉一下这几个名词:root:代表根目录dir:代表文件所在的文件夹base:代表整个文件名:代表thefilenameext:表示文件的后缀名path.basename例子constpath=require('path');console.log(path.basename('/koala/Desktop/程序员成长指南/Codepra/nodeCoreAPI'));console.log(path.basename('/koala/Desktop/程序员成长指南/codepra/node核心API/path.js','.js'));运行结果看上面的代码例子,我想我应该知道basename的结果,呵呵。Node核心API路径函数概要basename接收两个参数,第一个是path,第二个是ext(可选参数)。输入第二个参数时,打印结果中不会出现后缀path.dirname。例子constpath=require('path');console.log(path.dirname('/koala/Desktop/程序员成长指南/Codepra/node核心API'));运行结果/koala/Desktop/程序员成长指南/代码pra函数总结返回文件目录的完整地址path.extname例子constpath=require('path');path.extname('index.html');path.extname('index.coffee.md');path.extname('index.');path.extname('index');path.extname('.index');运行result.html.md.''''函数总结返回后缀名,但是在end在这两种情况下,返回'',请注意。path.resolve说明constpath=require('path');console.log(path.resolve('/foo/bar','/bar/faa','..','a/../c'));输出结果/bar/c函数概要path.resolve([...paths])path.resolve相当于shell下的cd操作,从左到右运行cd路径命令,最终得到绝对路径/的文件名,该接口返回的结果。不过resolve操作和cd操作还是有区别的。解析路径可能会丢失,最后一个条目可能是一个文件。具体cd步骤如下cd/foo/bar///这是第一步,当前位置是/foo/bar/cd/bar/faa//这是第二步,和第一步不同,是从/进入,也是根目录,当前位置是/bar/faacd..//第三步,从faa退出,当前位置是/barcda/../c//第四步步骤,输入a,然??后启动,输入c,最后位置是/bar/cpath.relative例子constpath=require('path');console.log(path.relative('/data/orandea/test/aaa','/data/orandea/impl/bbb'));console.log(path.relative('/data/demo','/data/demo'));console.log(path.relative('/data/演示',''));运行结果../../impl/bbb""../../koala/Desktop/程序员成长指南/代码pra/node核心API函数总结path.relative(from,to)说明:相对路径从从路径到路径。边界:如果from和to指向相同的路径,则返回一个空字符串。如果from和to中有一个为空,则返回当前工作路径。以上就是对本文关于路径知识的总结。基础很重要,可以节省开发时间,减少报错。今天就分享这么多,如果你对分享的内容感兴趣,可以关注公众号《程序员成长指南》,或者加入技术交流群,一起探讨。加入我们,学习先进的技术路线!
