node path配置,node命令行工具

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: