Node常用的内置模块

本文详细介绍了Node.js中的Path模块,包括resolve、extname、dirname和basename等方法的使用,以及路径拼接的区别。同时,讲解了Fs模块的基础操作,如同步和异步读取文件信息,并展示了递归获取目录下所有文件的例子。最后,简述了Events模块在事件驱动编程中的作用和基本使用。
摘要由CSDN通过智能技术生成

一、Path 路径模块常用方法

官网直达:Path路径模块

path模块用于对路径和文件进行处理,提供了很多好用的方法。

提示:以下两个是全局变量,和path没关系。

__dirname是当前目录名称 
__filename是当前绝对地址
// 当前目录名称
console.log('__dirname: ', __dirname);
//__dirname:  D:\code\Project\study\Node\4-内置模块\1-path
演练.js

// 文件绝对地址
console.log('__filename: ', __filename);
// __filename:  D:\code\Project\study\Node\4-内置模块\1-path\1-路径的

需求引出:

我们知道在 Mac OS、 Linux和 window上的路径是不一样的

  • window上会使用\或者\\来作为文件路径的分隔符,当然目前也支持/
  • 在 Mac OS、 Linux的Uniⅸ操作系统上使用/来作为文件路径的分隔符

那么如果我们在 window上使用\来作为分隔符开发了一个应用程序,要部署到 Linux上面应该怎么办呢?

  • 显然路径会出现一些问题
  • 所以为了屏蔽他们之间的差异,在开发中对于路径的操作我们可以使用path模块

底层实现方式:可移植操作系统接口(英语: Portable Operating System Interface,缩写为POSⅨ)

  • Linux和 Mac OS都实现了POSX接口
  • Window部分电脑实现了POSX接口

1.1 path.resolve 拼接路径

假如现在我有一个文件名称,我想让他和某个路径拼接成一个文件路径,那应该怎么做呢?

答案是使用path.resolve

const path = require('path')

const basepath1 = '\\user\\are'
const basepath2 = '/user/are'
const filename = 'abc.txt'

const filePath1 = path.resolve(basepath1,filename)
const filePath2 = path.resolve(basepath2,filename)

console.log('filePath1: ', filePath1);
console.log('filePath2: ', filePath2);

output:

filePath1:  D:\user\are\abc.txt
filePath2:  D:\user\are\abc.txt

使用 path模块的 resolve即可拼接完成。

1.2 path.extname(扩展名)

该方法可返回一个 字符串中的扩展名
ext => extension 扩展、伸缩的

path.extname('index.html');
// 返回: '.html'
path.extname('index.coffee.md');
// 返回: '.md'
path.extname('index.');
// 返回: '.'
path.extname('index');
// 返回: ''
path.extname('.index');
// 返回: ''
path.extname('.index.md');
// 返回: '.md'

1.3 dirname(目录名)、basename(文件名)

let dir = 'D:/code/Project/study/Node/test.js'
console.log("目录:",path.dirname(dir));
console.log("文件名称:",path.basename(dir));
console.log("后缀名是:",path.extname(dir));

// 目录: D:/code/Project/study/Node
// 文件名称: test.js
// 后缀名是: .js

1.4 path.join path.resolve 路径拼接

path.join 和 path.resolve 都是拼接路径的

const basepath = '/user/are'
const filename = 'test.js'
console.log(path.join(basepath,filename)); 
// \user\are\test.js
console.log(path.resolve(basepath,filename)); 
// \user\are\test.js

既然效果都一样那有什么区别呢?
resolve 会判断拼接的字符串中,开头是否有以/或./或../开头的路径
如果有:则会把当前的文件路径和传入的路径进行拼接

// 把 basepath开头的 / 去掉之后
const basepath = 'user/are'
const filename = 'test.js'
console.log(path.join(basepath,filename)); 
// resolve 会判断拼接的字符串中,开头是否有以/或./或../开头的路径
console.log(path.resolve(basepath,filename)); 

// user\are\test.js
// D:\code\Project\study\Node\4-内置模块\1-path\user\are\test.js

具体的:

const basepath2 = 'user/are'
const basepath1 = '/user/are'
const basepath3 = './user/are'
const basepath4 = '../user/are'
const filename = 'test.js'

console.log(path.resolve(basepath1,filename));
console.log(path.resolve(basepath2,filename));
console.log(path.resolve(basepath3,filename));
console.log(path.resolve(basepath4,filename));

// D:\user\are\test.js
// D:\code\Project\study\Node\4-内置模块\1-path\user\are\test.js
// D:\code\Project\study\Node\4-内置模块\1-path\user\are\test.js
// D:\code\Project\study\Node\4-内置模块\user\are\test.js

二、fs 文件系统

官网直达:fs 文件系统

fs 是 File System的缩写,表示文件系统。

fs模块有非常多的API,但是这些API大多数都提供三种操作方式:

  • 方式一:同步操作文件:代码会被阻塞,不会继续执行
  • 方式ニ:异步回调函数操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行
  • 方式三:异步 Promise操作文件:代码不会被阻塞,通过 fs promises调用方法操作,会返回一个 Promise可以通过then、 catch进行处理

示例:

const fs = require('fs')
const filePath = './abc.txt'
// 读取文件信息(不是内容) 大小,创建时间等

// 1.方式一 同步操作
// const fileInfo1 = fs.statSync(filePath)
// console.log('fileInfo1: ', fileInfo1);

// 2.方式二 异步操作
// fs.stat(filePath,(err,info) =>{
//   if(err){
//     console.log(err);
//     return
//   }
//   console.log(info);
// })

// 3.方式三 Promise
fs.promises.stat(filePath).then(res =>{
  console.log(res);
},err =>{
  console.log(err);
}) 

2.1 递归调用,获取目录中的所有文件

当前目录形式:
在这里插入图片描述

const fs = require('fs')
const path = require('path')

const dirname = './are'


//递归调用,获取目录中的所有文件
function getFiles(dirname){
  // 开启 返回目录的类型
  fs.readdir(dirname,{withFileTypes:'true'},(err,files) =>{
    // console.log(files);

    files.forEach(item =>{
      // 判断是否是目录
      if(item.isDirectory()){
        const filePath = path.resolve(dirname,item.name)
        getFiles(filePath)
      }else{
        console.log(item.name);
      }
    })
  })
}
getFiles(dirname)

输出:

text.txt
text2.txt
text3.txt

三、events模块

Node中的核心API都是基于异步事件驱动的

  • 在这个体系中,某些对象(发射器( Emitters))发出某一个事件
  • 我们可以监听这个事件(监听器 Listeners),并且传入的回调函数,这个回调函数会在监听到事件时调用

发出事件和监听事件都是通过 EventEmitter类来完成的,它们都属
于 events对象。

  • emitter.on( eventname, listener):监听事件,也可以使用
    addlistener
  • emitter.off(eventname, listener):移除事件监听,也可以使
    用 remove.Listener;
  • emitter.emit( eventnamel,args)):发出事件,可以携带一
    些参数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅哥cc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值