node path配置,node命令行工具
本文带你聊聊Node中的path模块,介绍path的常见使用场景、执行机制、常用工具功能。希望对你有帮助!
node.js速度课程简介:进入学习
在开发过程中,经常使用Node.js,它利用V8提供的能力来扩展js的能力。在Node.js中,我们可以使用js中不存在的path模块。为了我们更熟悉的使用来了解一下吧~
本文中Node.js的版本为16.14.0,本文的源代码来自该版本。希望看完这篇文章,对你阅读源代码有所帮助。
path 的常见使用场景
Path用于处理文件和目录的路径。该模块提供了一些方便开发者开发的工具功能,帮助我们进行复杂的路径判断,提高开发效率。例如:
在项目中配置别名。别名的配置方便了我们更容易的查阅文件,避免了深层次的一步步向上查找。
reslove: {
别名:{
//__dirname当前文件所在的目录路径
src: path.resolve(__dirname,。/src ),
//process.cwd当前工作目录
@: path.join(process.cwd(), src ),
},
}在webpack中,文件的输出路径也可以由我们自己配置生成到指定位置。
模块.导出={
条目:。/path/to/my/entry/file.js ,
输出:{
path: path.resolve(__dirname, dist ),
文件名: my-first-webpack.bundle.js ,
},
};或者用于文件夹操作。
设fs=require( fs );
let path=require( path );
//删除文件夹
设deleDir=(src)={
//读取文件夹
let children=fs . readdirsync(src);
children.forEach(item={
let childpath=path.join(src,item);
//检查文件是否存在。
let file=fs.statSync(childpath)。is file();
如果(文件){
//如果文件存在,删除该文件
fs.unlinkSync(子路径)
}否则{
//继续检测文件夹
删除目录(子路径)
}
})
//删除空文件夹
fs.rmdirSync(src)
}
DeleDir(./floor’)简单了解一下path的使用场景。接下来,我们将研究它的执行机制,以及如何根据用法来实现它。
path 的执行机制
引入path模块,调用path的工具函数,就会进入原生模块的处理逻辑。
使用_load函数根据你作为ID引入的模块名称判断要加载的模块是原生JS模块,然后使用loadNativeModule函数从_source(原生JS模块的源代码字符串转换而来的ASCII代码)中找到对应的数据,加载原生JS模块。
执行lib/path.js文件,使用process判断操作系统。根据不同的操作系统,其文件处理可能会有操作字符的差异化处理,但方法大致相同。处理后,它将被返回给调用者。
常用工具函数简析
resolve 返回当前路径的绝对路径
Resolve依次拼接几个参数以生成新的绝对路径。
解决(.args) {
let resolved device=“”;
let resolved tail=“”;
设resolvedAbsolute=false
//从右向左检测参数
for(设I=args . length-1;I=-1;我- ) {
.
}
//规范化路径
resolved tail=normalizeString(resolved tail,resolvedAbsolute, \\ ,ispath separator);
返回resolvedAbsolute?
` { resolved device } \ \ { resolved tail } `:
` { resolved device } { resolved tail } ` ,;
}
根据参数获取路径,遍历接收到的参数。当参数长度大于或等于0时,拼接路径将被拼接,并执行非字符串检查。如果有不符合的参数,将抛出新的err _ invalid _ arg _ type (name, string ,value)。如果符合要求,则判断路径的长度;如果有值,那么下一个操作的值就是=path。
让路径;
如果(i=0) {
path=args[I];
//内部/验证器
validateString(path, path );
//如果路径长度为0,则直接跳出上面代码块的for循环。
if (path.length===0) {
继续;
}
} else if(resolved device . length===0){
//resolvedDevice的长度为0,给小路赋值为当前工作目录
路径=流程。CWD();
}否则{
//赋值为环境对象或者当前工作目录
路径=流程。env[`=$ {解析的设备} `] 进程。CWD();
如果(路径===未定义
(StringPrototypeToLowerCase(StringPrototypeSlice(path,0,2))!==
StringPrototypeToLowerCase(已解析的设备)
StringPrototypeCharCodeAt(path,2)===CHAR_BACKWARD_SLASH)) {
//对小路进行非空与绝对路径判断得出小路路径
path=` {解析的设备} \ \ `;
}
}
尝试匹配根路径,判断是否是只有一个路径分隔符(\) 或者小路为绝对路径,然后给绝对路径打标,并把根端截取标识设为1 (下标)。第二项若还是路径分隔符(\) ,就定义截取值为2 (下标),并用最后的保存截取值,以便后续判断使用。
继续判断第三项是否是路径分隔符(\),如果是,那么为绝对路径,根端截取标识为1 (下标),但也有可能是通用命名规约(通用命名转换)路径(\服务器名\共享名,服务器名服务器名共享名共享资源名称)。如果有其他值,截取值会继续进行自增读取后面的值,并用第一部分保存第三位的值,以便拼接目录时取值,并把最后的和截取值保持一致,以便结束判断。
const len=路径长度
设根端=0;//路径截取结束下标
让设备="";//磁盘根D:\、C:\
设isAbsolute=false//是否是磁盘根路径
const code=StringPrototypeCharCodeAt(path,0);
//路径长度为一
if (len===1) {
//只有一个路径分隔符\为绝对路径
if (isPathSeparator(code)) {
根端=1;
isAbsolute=true
}
} else if(ispath分隔符(代码)){
//可能是通用命名规约(通用命名转换)根,从一个分隔符\开始,至少有一个它就是某种绝对路径(UNC或其他)
isAbsolute=true
//开始匹配双路径分隔符
if(ispatheseparator(StringPrototypeCharCodeAt(path,1))) {
设j=2;
设last=j;
//匹配一个或多个非路径分隔符
while (j len
!ispatheseparator(StringPrototypeCharCodeAt(path,j))) {
j;
}
if (j len j!==最后){
const first part=string原型切片(path,last,j);
last=j;
//匹配一个或多个路径分隔符
while (j len
ispatheseparator(StringPrototypeCharCodeAt(path,j))) {
j;
}
if (j len j!==最后){
last=j;
while (j len
!ispatheseparator(StringPrototypeCharCodeAt(path,j))) {
j;
}
if (j===len j!==最后){
设备=
`\ \ \ \ $ {第一部分} \ \ $ {字符串原型切片(path,last,j)} `;
根端=j;
}
}
}
}否则{
根端=1;
}
//检测磁盘根目录匹配例:D:C:\
} else if(isWindowsDeviceRoot(code)StringPrototypeCharCodeAt(path,1)===CHAR_COLON) {
device=string原型切片(path,0,2);
根端=2;
如果(镜头2是路径分隔符(StringPrototypeCharCodeAt(path,2))) {
isAbsolute=true
根端=3;
}
}检测路径并生成,检测磁盘根目录是否存在或解析已解决的绝对是否为绝对路径。
//检测磁盘根目录
如果(设备长度0) {
//resolvedDevice有值
if (resolvedDevice.length 0) {
if(StringPrototypeToLowerCase(device)!==
StringPrototypeToLowerCase(已解析设备))
继续;
}否则{
//resolvedDevice无值并赋值为磁盘根目录
已解决的设备=设备;
}
}
//绝对路径
if (resolvedAbsolute) {
//磁盘根目录存在结束循环
if (resolvedDevice.length 0)
打破;
}否则{
//获取路径前缀进行拼接
resolvedTail=
` { string prototype slice(path,root end)} \ \ { resolved tail } `;
resolvedAbsolute=isAbsolute
如果(是绝对解析设备。长度0){
//磁盘根存在便结束循环
打破;
}
}join 根据传入的 path 片段进行路径拼接
接收多个参数,使用特定的分隔符作为分隔符,将所有的路径参数连接在一起,生成新的规范化路径。
收到参数后,检查它们。如果没有参数,它将直接返回“.”,否则,遍历它们,并通过内置的validateString方法检查每个参数。如有不规则,直接抛出new err _ invalid _ arg _ type (name, string ,value);
窗口下是反斜杠( \ ),linux下是正斜杠(/)。这里有一个join方法和操作系统的区别,而反斜杠( \ )有转义符的作用,所以单独使用时考虑转义斜杠后面的字符串,所以用双反斜杠来转义反斜杠( \ )。
最后,对拼接后的字符串进行检查、格式化并返回。
if (args.length===0)
返回“.”;
让我们加入;
让第一部分;
//从左到右检查参数
for(设I=0;I参数. length;i) {
const arg=args[I];
//内部/验证器
validateString(arg, path );
if(参数长度0) {
if(连接===未定义)
//将第一个字符串赋值给joined,并将第一个字符串与firstPart变量一起保存,以备后用。
joined=firstPart=arg
其他
//joined有值,所以=splice。
joined=`\ \ $ { arg } `;
}
}
if(连接===未定义)
返回“.”;在窗口系统下,由于使用了反斜杠( \ )和UNC(主要指局域网上资源的完整Windows 2000名称)路径,所以需要进行网络路径处理。( \ )表示网络路径格式,所以默认情况下win32下挂载的join方法会截取。
如果匹配得到一个反斜杠( \ ),slashCount会自动递增。只要匹配反斜杠( \ )的个数大于2,就会截取拼接路径,手动拼接转义反斜杠( \ )。
让needsReplace=true
设slashCount=0;
//根据StringPrototypeCharCodeAt,依次提取第一个字符串的代码,用isPathSeparator方法与定义的代码进行匹配。
if(ispatheseparator(StringPrototypeCharCodeAt(first part,0))) {
slashCount
const first len=first part . length;
if (firstLen 1
ispath separator(StringPrototypeCharCodeAt(first part,1))) {
slashCount
if (firstLen 2) {
if(ispatheseparator(StringPrototypeCharCodeAt(first part,2)))
slashCount
否则{
needsReplace=false
}
}
}
}
如果(需要替换){
while (slashCount已加入. length
ispath separator(StringPrototypeCharCodeAt(joined,slashCount))) {
slashCount
}
if(斜杠计数=2)
joined=`\ \ $ { string prototype slice(joined,slashCount)} `;
}执行结果梳理
Resolvejoin没有当前文件的绝对路径。当前文件没有绝对路径。第一个参数是绝对路径。参数依次拼接的路径覆盖了当前文件的绝对路径,并被后续的非绝对路径拼接。后置参数是绝对路径。该路径与当前文件的绝对路径重叠,并与由前置参数拼接的路径重叠。第一个参数是(。/)以及当前文件拼接的绝对路径。
无后续参数,当前文件的绝对路径有后续参数,拼接成路径。
没有后续参数,(。/)后置参数是(。/).解析后的绝对路径拼接参数有后续参数,拼接后的路径拼接后续参数。
没有后续参数,拼接(/)的第一个参数是(./).还有后续参数,覆盖当前文件绝对路径的最后一级目录,然后拼接参数。
无后续参数,覆盖当前文件绝对路径的最后一级目录有后续参数,后续参数拼接。
没有后续参数,上级目录用(./)和(./)将被覆盖,并且同样多的层将被覆盖。上级目录被覆盖后,返回(/),上级目录用(./)将使用以下参数进行拼接,并将覆盖尽可能多的层。上级目录被覆盖后,上级目录也会被覆盖。使用时,如果要执行文件等操作,建议使用resolve方法。相比较而言,resolve方法即使没有参数也会返回一个路径供用户操作,并且在执行过程中会对该路径进行处理。join方法只是对传入的参数进行标准化和拼接,对于生成新路径很实用,可以根据用户的意愿创建。但每种方法都有优点,要根据自己的使用场景和项目需求选择合适的方法。
更多关于node的信息,请访问:nodejs教程!以上就是说说Node.js路径模块中常用工具函数的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。