Node.js基础教学(二)

六、包与NPM

包的组成

● 包结构:用于组织包中的各种文件

● 包描述文件(package.json):描述包的相关信息,以供外部读取分析

package.json文件的介绍
{
“name”: “package”, //  项目标识,即项目的名称,注:不能使用中文
“version”: “1.0.0”, //  项目的版本号,主版本.次版本.修订版本
"description": "a good demo", //  项目的描述
"main": “index.js", //  项目入口文件
“dependencies”: {//产品模式依赖
"express": "^4.17.1"
  },
"devDependencies": {},//开发模式依赖
"keywords": [  //  项目关键词
    “good”,”very”
  ],
"author": “RYPY", //  作者
"license": "ISC"//  模块协议,默认就可以
//  描述和关键词要写全,方便其它人搜索的时候可以据此搜到并引用你的模块,注:上述所有的内容填写都要是英文
}

NPM

概念:

npm(nodejs package manager),称为“node包管理器”。它本身也是一个命令行工具。也是JavaScript代码的开源社区。

使用场景

1、从npm服务器下载其他人编写的第三方包或命令行程序到本地,供本地项目使用。

2、将自己编写的包或或命令行程序,发布到npm服务器供其他人使用。

常用命令
1、查看NPM的版本号
npm  -v / -version
2、创建package.json文件
npm init (-y)

注:只要自己写的项目必须含有package.json文件,使用npm init 创建的package.json文件,项目名称不能有中文,否则会报错。

3、NPM安装命令
3.1 安装指定插件命令
npm i/install/add 插件名1 插件名2 插件名3
例:npm i express 
   npm i mysql pug

注:如果安装多个插件,插件名字之间用空格隔开

3.2 安装指定版本号的插件
npm i/install/add 插件的名字@版本号
例:npm i ejs@1.0.0
3.3 根据package.json 安装全部所需插件
npm i/install/add
例:npm install

注:使用全部安装命令,必须保证当前项目中含有package.json文件

4、NPM插件的模式

NPM插件分为两种模式:全局模式,本地模式(产品模式和开发模式)。

4.1 全局安装模式

全局模式,通常被用作安装命令行类型的插件

npm i/install/add 插件名 -g / --global
例 npm add @types/node -g

注:全部模式的插件不会安装到当前工程下,
全局安装的插件默认路径C:\Users\计算机名\AppData\Roaming\npm\node_modules

4.2 本地安装模式

产品模式

产品模式,指项目运行(项目部署后)的时候所必备的插件。将安装的插件放到本地的node_modules文件夹下,并且会在package.json文件的“dependencies”下添加对应的插件名和版本号,默认安装的插件就是产品模式。

npm i/install/add 插件名 -P / --prod-save
例: npm i express
    npm i express -P

开发模式

开发模式,指项目在开发阶段所需要使用的插件,此类插件不是项目运行所必须,将安装的插件放到本地的node_modules文件夹下,并且会在package.json文件的“devDependencies”下添加对应的插件名和版本号。

npm i/install/add 插件名 -D / --dev-save
例:npm i express -D

注:如果需要从开发模式转换为产品模式,必须要采用-P。

5、NPM 卸载命令
npm uninstall/rm/remove/r/un/unlink 插件名字
例:卸载全局 npm un express-generator -g
   卸载本地 npm rm pug

注:卸载不区分产品模式和开发模式,只区分全局模式和本地模式

6、NPM升级命令
npm i 插件的名字@latest  升级到最新版
npm i 插件的名字@指定版本号 升级为指定版本
例:npm i ejs@latest
7、搜索包命令

搜索npm社区上,搜索所有搜索关键词的相关内容,包括名字含有搜索内容,描述含有搜索内容,关键词含有搜索内容

npm s / search / se / find  搜索关键词
例:npm s express
8、查看插件包的相关注册信息

在npm社区查找当前插件的相关 npm注册信息

npm view / info / show / v (插件的名字)
例:npm  v express

注:如果不写插件的名字,默认查找本地总package.json项目的项目名,先在NPM官网上找,如果有返回官网注册信息,如果没有返回本地。

9、查看当前工程下安装的插件,可以指定某个插件。

查出的内容是插件的名字及版本号信息。

npm list / ls / la / ll (插件名字)
例:npm ll (express)

七、events事件模块

Node.js 核心 API 通常构建于异步事件驱动架构,而且某些模块会自动触发某些事件,通过事件监听来完成相关操作。

所有能触发事件的对象都是 EventEmitter 类的实例。EventEmitter类由events模块定义的,其核心就是事件触发与事件监听器功能的封装。

采用on()方法进行事件监听,采用emit()方法触发事件。

EventEmitter类实例的创建

const emiter=require("events");
const emt=new emiter();

EventEmitter类的常用方法

1、监听事件

语法:引用.on(“事件的名字”,回调函数)

监听事件,可以一次定义多次触发

参数一为事件的名称(可以自定义/也可以用API自带的事件)

参数二是一个回调函数,当监听到事件被触发时,回调函数会被执行。

evem.on("aaa",(...a)=>{
    console.log("我是事件aaa的参数"+a);
});
2、触发事件

语法:引用.emit(事件名,剩余参数)

触发事件,可以触发已有事件,也可以触发自定义事件。

参数一,需要触发事件的名字

参数2…参数n,是可以给监听器进行传递参数的,此参数可以在监听方法的回调函数中,以回调函数参数的形式获取到

emt.emit("aaaa","我是剩余一","我是2","dsfdfdg","sdfsdfsdfsdfs");
emt.emit("aaa");
3、一次事件监听的方法

语法:引用.once(“事件的名字”,回调函数)

监听事件,只能触发一次。

emt.once("bbb",()=>{
    console.log("我被触发bbb");
});

八、FS模块

概念

Node.js文件系统(fs模块)模块中的方法均有异步和同步版本,且提供了两套API,一套是采用callback风格的API,另一组是Promise 对象风格的API。

引入方式

const fs = require(‘fs’);//此方式是回调函数版的引入。
const fs = require(‘fs’).promises 或 require(‘fs/promises’);//只支持V14及以上版本

在fs模块中提供了两组方法来对文件进行操作,分别时同步的方法和异步的方法,两个方法的区别在于同步的方法方法名上会有Sync字符串,而异步的方法则没有。

注:在Node的文件模块中,所有的回调函数第一个参数一定是 err (错误参数)。

常用方法:

1、fs.stat(path[, options], callback),

获取当前路径的相关属性信息

参数:

path,文件/文件夹的路径(相对路径/绝对路径);

options

​ bigint,设置是否给生成的属性值添加bigint单位,默认值是false

callback 回调函数

​ err 错误信息

​ stats 返回的Stats类型的对象

fs.stat(__filename,{bigint:true},(err,stats)=>{
  if(err)console.log(err);
  else{
    //stats引用.isFile(),判断当前Stats类型的路径是否是文件类型
    console.log(stats.isFile());
    //stats引用.isDirectory(),判断当前Stats类型的路径是否是文件夹类型
    console.log(stats.isDirectory());
    //stats.size,此属性,获取当前路径的大小,如果是文件则自动获取大小值,如果是路径返回0
    console.log(stats.size);
  }
});
2、fs.writeFile(file, data[, options], callback),

将数据内容写到参数地址的文件中,写入地址的文件类型没有任何限制

参数:

file,设置需要书写文件的文件路径(文件名/相对路径/绝对路径),注:路径必须存在,但文件可以不存在。

data,设置需要写入文件的内容

options

​ encoding ,编码格式,默认值"utf8"。

​ mode,模式,当前文件所支持的用户群体。

flag,设置当前代码对此文件的使用模式,默认值是w,可写

callback,回调函数

**注:**此方法可以向已有文件夹内写入文件,fs的writeFile方法是覆盖写入。

fs.writeFile(__dirname+"/1.js","hahahahahahahaha",{encoding:"base64"},(err)=>{
    console.log(err);
});
3、fs.appendFile(path, data[, options], callback)

将内容拼接到输出路径,如果文件不存在会直接生成一个新的文件,如果文件存在则执行拼接操作。

参数:

path,需要拼接文件的路径

data,需要拼接的内容,

options

​ encoding ,编码格式,默认值"utf8"。

​ mode,模式,当前文件所支持的用户群体。

​ flag,设置当前代码对此文件的使用模式,默认值是a,拼接写入

fs.appendFile(__dirname+"/1.js","ertertfvgdfg",err=>{if(err)console.log(err)});
4、fs.readFile(path[, options], callback)

将路径文件的内容读取并显示。(过程,将文件内容读到缓存区,然后从缓存区输出并显示)

参数:

path,设置需要读取文件的路径
options
encoding 编码格式,默认值是null

​ flag 代码对文件的权限,默认值是 r,可读

​ signal,是否允许终止/继续调用

callback 回调函数
err,错误
data,读取的数据,返回值类型是字符串。

fs.readFile("./1.txt","utf8",(err,data)=>{
    if(err)console.log(err);
    else console.log(data);
});
5、fs.rename(oldPath, newPath, callback)

移动并修改文件的名/文件类型

参数:

oldPath,原文件路径

newPath,新文件路径

**注:**路径一定不能写错,它会自动移动并重名,不能使用此方法创建文件夹。如果新路径中存在重命名文件,则会被覆盖。

fs.rename("./哈哈.doc","./馍.mp4",err=>{if(err)console.log(err);});
6、fs.unlink(path, callback)

删除文件的方法,此方法永久删除文件

**注:**此方法只能删除文件,不能删除文件夹

fs.unlink("../../12.24/馍2.mp4",err=>{if(err)console.log(err);});
7、fs.rmdir(path[, options], callback)

删除文件夹,永久删除

参数:

path,文件的路径

options

​ maxRetries ,表示出现异常后重试的次数,默认值是0

​ recursive ,递归删除目录,默认值是false.

​ retryDelay ,表示当出现异常后重试需要等待的秒数,默认值是100ms.

**注:**如果recursive设置为false,则maxRetries和retryDelay不生效。

fs.rmdir("./a",{recursive:true},err=>{if(err)console.log(err);});
8、fs.mkdir(path[, options], callback),

创建文件夹

参数:

path,需要创建文件夹的路经

options

​ recursive 递归创建文件夹,默认值false

​ mode 模式,当前文件所支持的用户群体。

fs.mkdir("./aaa/b",err=>{if(err)console.log(err);});
9、fs.readdir(path[, options], callback)

获取当前路径下的所有文件及文件夹的名字,返回值是数组类型。

参数:

path,读取文件夹的路径

options

​ encoding

​ withFileTypes 设置是否显示读取文件名的类型,默认值是false,如果设置为true,则数组中返回元素是Dirent类型的对象,对象中包含文件及文件夹的名字,以及对应的文件/文件夹的类型。

callback,

​ err

​ files,以数组的形式返回当前目录的文件及文件夹的名字。

fs.readdir("./",{withFileTypes:true},(err,files)=>{
    if(err)console.log(err);
    else console.log(files);
}); 

文件流(Stream)

概念

流(stream)是Node.js中处理流式数据的抽象接口。stream模块用于构建实现了流接口的对象。Node.js提供了多种流对象。所有的流都是EventEmitter的实例。

读文件流

生产数据用来供程序消费的流

const fs=require('fs');
const rStream=fs.createReadStream("./3.txt");//创建一个读文件流
rStream.on("open",()=>{//使用createReadStream()方法,打开已存在文件的时候触发
    console.log("我是open事件");
});
rStream.on("data",()=>{//当有数据读取的时候触发data
    console.log("我是data事件");
});
rStream.on("error",()=>{//出现错误的时候触发
    console.log("我是err事件");
});
rStream.on("close",()=>{//关闭读文件流的时候触发
    console.log("我是close事件");
});
写文件流

对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备

const fs=require("fs");
const wStream=fs.createWriteStream("./2.doc");//创建写文件流的实例
wStream.on("open",()=>{//使用createWriteStream()方法,创建写入流的时候被触发
    console.log("我是open事件");
});
wStream.on("error",()=>{//出现错误的时候触发
    console.log("我是err事件");
});
wStream.on("close",()=>{//关闭读文件流的时候触发
    console.log("我是close事件");
});
wStream.on("finish",()=>{//当使用end方法结束写入,才会触发此事件。
    console.log("我是finish事件");
});
使用写文件流,写内容采用的方法write()
wStream.write("dsssss//此方法只有向文件中写入内容的作用,无法结束写流的操作。
wStream.end();//结束写入数据,会触发finish事件。
管道流

管道提供了一个输出流到输入流的机制。即绑定可写流到可读流,将可读流自动切换到流动模式,并将可读流的所有数据推送到绑定的可写流。

const fs=require("fs");
const rstream=fs.createReadStream("./1.txt");
const wstream=fs.createWriteStream("../../12.24/ss.doc");
//创建管道流的管道采用pipe()
rstream.pipe(wstream);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值