前言路径模块是nodejs中内置的一个处理文件/目录路径的模块。它可以看作是一个工具箱,提供了很多方法供我们使用。当然,它们都与路径处理有关。.同时,path模块在前端开发中出现频率很高,比如在配置webpack的时候。本文是对本模块中一些常用方法的介绍,一起去学习吧。需要注意的是,nodejs中的所有模块(内置和自定义)都需要使用requier导入,一般导入位置在文件顶部。constpath=require('路径');APIbasename(getpathbasename)path.basename(path[,ext])path:文件/目录路径ext:(可选)文件扩展名如.js.css等返回值:path最后一部分路径注意:如果path不是字符串或者给定的ext参数不是字符串,将抛出TypeError。如果有ext参数,当ext后缀匹配文件名时,返回的文件名将省略文件后缀如果路径末尾有目录分隔符,则忽略constpath=require("path");path.basename('./ext/test.js')//test.jspath.basename('./ext/test.js','.js')//test(返回的文件名会省略文件suffixwhenthesuffixnamematchesthefilename)path.basename('./ext/test.js','.html')//test.js(不匹配则返回文件全名)路径。basename('./ext/foo/')//foo(忽略尾随目录分隔符)dirname(获取路径目录名)path.dirname(path)path:文件/目录路径返回值:path目录名注意:如果path不是字符串,如果path末尾有目录分隔符,则会抛出TypeError,忽略constpath=require("path");path。目录名('./foo/bar/baz');//./foo/bar(相对路径或绝对路径均可)path.dirname('/foo/bar/baz/');///foo/bar(忽略尾随目录分隔符)path.dirname('/foo/bar/baz/test.js');///foo/bar/bazextname(getpathextension)path.extname(path)path:file/目录路径返回值:path路径的扩展名,从最后一次出现的'.'开始path最后部分字符串的末尾字符,如果没有扩展名,返回空注意:如果path不是字符串,会抛出TypeErrorconstpath=require("path");path.extname('foo/bar/baz/test.js');//.jspath.extname('foo/bar/baz');//''(没有返回扩展名'')path.extname('foo/bar/baz/.');//''path.extname('foo/bar/baz/test.');//'.'path.extname('foo/bar/baz/.test');//''path.extname('foo/bar/baz/.test.js');//'.js'parse(parsepath)path.parse(path)(str=>obj)path:文件/目录路径返回值:具有属性(dir,root,base,name,ext)的对象root:the根目录dir:文件所在的文件夹base:完整文件(index.js)name:文件名ext:文件扩展名注意:如果path不是字符串,末尾有目录分隔符会抛出TypeError,会被忽略一张图顶一千字┌──────────────────────────────┬────────────────┐│目录│基础│├────────┬├────────┬──────────────┤│根││名字│ext│"/foo/bar/baz/index.js"constpath=require("path");path.parse('/foo/bar/baz/index.js')//{//root:'/',//dir:'/foo/bar/baz',//base:'index.js',//ext:'.js',//name:'index'//}path.parse('/foo/bar/baz')//省略尾随目录分隔符//{//root:'/',//dir:'/foo/bar',//base:'baz',//ext:'',//name:'baz'//}path.parse('./foo/bar/baz/index.js')//当路径是相对路径./或../时,根解析结果的(代表根目录,绝对路径有值)为''//{//root:'',//dir:'./foo/bar/baz',//base:'index.js',//ext:'.js',//name:'index'//}format(序列化路径)path.format(pathObj)序列化路径路径,与path.parse()pathObj正好相反:pathobject返回值:sequence优化后的字符串路径(obj=>string)注:如果pathObject不是对象,会抛出TypeError。pathObject中的属性需要注意优先级:当dir属性存在时,root属性被忽略;当base属性存在时,忽略name和ext属性给定路径字符串长度为0会抛出,返回false参考nodejs进阶视频讲解:进入学习constpath=require("path");path.isAbsolute('//foo');//truepath.isAbsolute('\\\\foo');//真实路径。isAbsolute('C:/foo/..');//truepath.isAbsolute('C:\\foo\\..');//truepath.isAbsolute('./bar\\baz');//falsepath.isAbsolute('../bar/baz');//falsepath.isAbsolute('.');//falsepath.isAbsolute('');//falsejoin(连接路径片段)path.join([...paths])paths:paths片段返回值:通过使用平台特定的定界符作为定界符将所有给定路径片段连接在一起并规范化而生成的路径。注意:如果paths不是字符串片段,则TypeError零长度路径片段将被忽略。如果加入后的路径字符长度为0,则返回'.',表示当前工作目录的目录分隔符存在平台差异。Windows返回'\'constpath=require("path");path.join('')//'.'path.join('./')//'.\'path.join('../')//'..\'path.join('/foo/','bar','baz','../','index.js')//'\foo\bar\index.js'path.join('./bar','baz','/','../','',index.js')//'bar\index.js'path.join('foo',{},'酒吧');//'TypeError:路径必须是一个字符串。Received{}'normalize(规范化路径)path.normalize(path)path:文件/目录路径返回值:规范化后的路径字符串注意:如果path不是字符串片段,如果后面的分隔符会保留,则会抛出typeerrorpathstring如果长度为0,返回'.',表示当前工作目录路径中的目录分隔符将被替换为平台特定的目录分隔符,windows系统将'/'或''替换为''连续路径中的多个定界符会归一化为一条路径。最好不要有单独的'\',因为它和字母在一起时会被用作转义符。constpath=require("path");path.normalize('')//'.'path.normalize('temp//foo//bar//..//');//temp\foo\path.normalize('C:////temp\\\\/\\/\\/foo/bar')//C:\temp\foo\barpath.normalize('..////foo//\bar/baz/')//..\fooar\baz\(出现转义字符)path.normalize('temp//foo/\bar')//temp\fooar(出现转义字符)relative(获取从from到to的相对路径)path.relative(from,to)from,to:文件/目录路径返回值:fromtototo的相对路径(to是相对于表单的相对路径)注:如果from和to指向同一个路径,则返回''如果from或to为空,使用当前工作目录替换其空路径constpath=require("path");//当前工作目录为\Stone\node\node\path_modulepath.relative('/foo/bar/baz','/foo/bar/dir/file.js')//..\dir\file.jspath.relative('/foo/bar/baz','/foo/bar/baz')//''path.relative('/foo/bar/baz/files.js','')//..\..\..\..\Stone\node\node\path_modulepath.relative('','/foo/bar/baz/files.js')//..\..\..\..\foo\bar\baz\files.jspath.relative('','./foo/bar/baz/files.js')//foo\bar\baz\files.js这里对于from或to都是空的,然后使用当前工作目录而不是它的空路径例如,如果当前工作目录是\Stone\node\node\path_module,您可以看到path.relative('/foo/bar/baz/files.js','')的输出是..\。.\..\..\Stone\node\node\path_module,此时to就是\Stone\node\node\path_module,要输出to相对于from的相对路径,那么from需要是这样的形式../逐层退出检索to的共同父目录,直到遇到共同父目录或停在根目录,再cd进入to目录。这是因为对方是绝对路径,如果对方是相对路径,则直接是对方的当前路径。resolve(将一系列路径或路径片段解析为绝对路径)path.resolve([...paths])路径:一系列路径或路径片段返回值:解析为绝对路径的路径或路径片段序列。(路径分片解析后生成的绝对路径)注意:如果给定路径分片,必须是字符串类型,否则给定的路径序列从右到左处理,后面的每条路径都在前面加上,直到构造返回一个绝对路径。如果在处理所有给定的路径片段后还没有生成绝对路径,则生成的路径加上当前工作目录都会被规范化,并且删除尾随的斜杠零,除非路径被解析为根目录。路径段的长度将被忽略如果没有传入路径段,path.resolve()将返回当前工作目录的绝对路径constpath=require("path");//当前工作目录为\Stone\node\node\path_modulepath.resolve('/foo/bar','./baz');//'/foo/bar/baz'path.resolve('/foo/bar','','/tmp/file/');//'/tmp/file'path.resolve('root','foo/baz/','../fun/bar')//'\Stone\node\node\path_module\root\foo\fun\bar'path.resolve()//'\Stone\node\node\path_module'path.resolve方法解析路径片段时,会从右向左解析,直到构造出绝对路径,否则为当前工作目录被添加到路径中。所以resolve分析生成的路径一定是绝对路径。这个方法用的很多,应该很熟悉了。是的,我们在前端配置webpack的时候会经常用到它,它经常和__dirname一起使用。__dirname,__filename__dirname:在nodejs中可以看成是一个全局变量,它总是表示当前执行文件所在目录的完整目录名(绝对路径)__filename:在nodejs中可以看成是一个全局变量,它总是表示当前执行文件的完整性文件名(完整的绝对路径)我们先在path_module目录下运行nodetest.js命令constpath=require("path");console.log(__dirname);//\Stone\node\node\path_moduleconsole.log(__filename);//\Stone\node\node\path_module\test.js而我们在\Stone\node\节点目录下运行nodepath_module\test.js,你会发现输出和上面一样,所以这个意思是__dirname和__filename总是与当前执行文件有关,与启动脚本所在目录无关。./.././和../我们都知道是相对路径的写法,但是require()和require()结合使用的结果是不一样的。执行fs_module目录下的nodetest.jsconstfs=require('fs')fs.readFileSync('./ext/test1.js',(err,data)=>{console.log('ok')})通常会打印出ok\Stone\node\nodeExecutenodefs_module\test.jsconstfs=require('fs')fs.readFile('./ext/test1.js',(err,data)=>{console.log('ok')})会报错nosuchfileordirectory,open'./ext/test1.js'。为什么是这样?原因是'./'和'../'的路径代表的意思视情况而定,与require()结合使用时,是相对于当前执行文件的。如果不和require()结合使用,会相对于当前启动脚本的目录,所以写成相对路径(./,../),其他地方使用绝对路径,这必须引起重视。结语关于nodejs路径模块,今天到这里就说完了。虽然api不多,但是path模块在前端用的还是很频繁的,觉得还是值得学习的。由于认知有限,本文如有不准确之处,还望各位路过的兄弟及时指正,吃瓜吃瓜。
