http模块、url模块、querystring模块
(一)什么是模块
在Node.js中,所谓的模块,其实就是一个文件,一个文件就是一个模块,模块是Node.js应用程序的基本组成部分。
Node.js中的模块分三种:
核心模块:核心模块是Node.js自带的模块,比如http、fs、net、url、path等,可以直接使用,是Node.js中内置好的。
用户自定义模块:通常是在项目中,根据需求自己编写的js代码。
第三方模块:一些比较通用的,但是Node.js自身没有提供的,如nodemon、mysql、express等。
(二)Node中的模块-第三方模块
(1)npm install module_name -S
即 npm install --save 写入dependencies 用于生产环境
(2)npm install module_name -D
即 npm install --save--dev 写入devDependencies 仅用于开发环境
(3)npm install module_name -g
全局安装(不进入项目目录)
(4)npm install module_name
本地安装(安装包放在 ./node_modules 下)
npm install -g cnpm --registry=https://registry.npm.taobao.org
(三)http模块
http模块是node提供的基于http协议的通信模块,可以用于创建http服务器,也可以作为客户端向其他服务器发起请求。
要使用 HTTP 服务器和客户端,必须 require('http')。
(1)作为服务器接受客户端请求示例:
(2)Node作为客户端,是向其他服务端口请求数据。
(四)nodemon或supervisor模块
nodemon或者supervisor提供类似的功能,监听文件变化,自动重启服务,热启动,nodemon或supervisor模块的按装与使用:
注意:以管理员身份打开CMD命令台
npm install nodemon -g
npm install supervisor -g
(五)url模块
url 模块用于处理与解析 URL
URL() 构造函数返回一个新创建的 URL 对象,表示由一组参数定义的 URL。
语法: const url = new URL(url [, base])
假设一个地址:https://www.baidu.com:8080/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1
console.log(u.pathname) // /s
console.log(u.host)// www.baidu.com:8080
console.log(u.hostname) // www.baidu.com
console.log(u.href) console.log(u.searchParams.get("ie")) //utf-8 console.log(u.searchParams.has("f")) // true
(六)querystring模块
querystring 模块提供用于解析和格式化 URL 查询字符串的实用工具。
语法:querystring.parse(str[, sep[, eq[, options]]])
str <string> 要解析的 URL 查询字符串。
sep <string> 用于在查询字符串中分隔键值对的子字符串。默认值: '&'。
eq <string> 用于在查询字符串中分隔键和值的子字符串。默认值: '='。
options <Object>
querystring.stringify(obj[, sep[, eq[, options]]])
obj <Object> 要序列化为 URL 查询字符串的对象。
sep <string> 用于在查询字符串中分隔键值对的子字符串。默认值: '&'。
eq <string> 用于在查询字符串中分隔键和值的子字符串。默认值: '='。
options
(七)Buffer模块
一个类似于Array对象,用于表示固定长度的字节序列,换句话说,Buffer就是一段固定长度的内存空间,用于处理二进制数据。
特点:
1、Buffer大小固定且无法调整
2、Buffer性能较好,可以直接对计算机内存进行操作
3、每个元素大小为1字节(Byte)
Buffer的创建:
1、alloc
const buf1 = Buffer.alloc(10);
let buf1 = Buffer.alloc(10);
console.log(buf1)
<Buffer 00 00 00 00 00 00 00 00 00 00>
2、allocUnsafe
创建速度快,不清除原有数据.
const buf3 = Buffer.allocUnsafe(10);
const buf3 = Buffer.allocUnsafe(10);
console.log(buf3)
<Buffer 00 00 00 00 00 00 00 00 00 00>
3、from
const buf3 = Buffer.from("Hello");
console.log(buf3)
<Buffer 48 65 6c 6c 6f>
Buffer与字符串的转换:
const buf3 = Buffer.from("Hello");
console.log(buf3[0])//对H以十进制输出
console.log(buf3[0].toString(2))//对H以十进制转换成二进制
(八)fs模块(重点)
file system模块
fs模块可以实现与硬盘的交互,例如:文件的创建、删除、重命名、移动,还有文件内容的写入与读取,以及文件夹的相关操作。
1、读、写文件
//导入fs模块
const fs=require('fs');
//2\写入文件
fs.writeFile('座右铭.txt','三人行,必有我师焉',err =>{
//err 写入成功:null 写入失败:错误对象
if(err){
console.log("写入失败");
return;
}
console.log("写入成功");
});
writeFil是异步写入,writeFileSync是同步写入
扩展:
fs.readFile('data.txt',function (err,data) {
console.log(data) //console.log(data.toString( ))
})
fs.writeFile('./b.txt',data,function (err) {
if (err){
console.log(err);
}else{
console.log('success')
}
});
2、追加写入
fs.appendFile('data.txt',data,function (err) {
console.log(err);
})
3、流式写入
文件写入场景:
4、文件读取
//导入fs模块
const fs=require('fs');
//异步读取
fs.readFile('座右铭.txt',(err,data)=>{
if(err){
console.log("读取失败");
return;
}
console.log(data.toString());
})
//同步读取
let data=fs.readFileSync('座右铭.txt')
console.log(data.toString());
fs.readFile('data.txt',function (err,data) {
console.log(data) //console.log(data.toString( ))
})
读取文件常用场景:
流式读取:
//导入fs模块
const fs=require('fs');
//创建读取流对象
const rs = fs.createReadStream('座右铭.txt');
//绑定data事件 chunk块、大块
rs.on('data',chunk=>{
console.log(chunk.length);//输出是字节大小,对应64KB
console.log(chunk.toString())
})
//end可选事件
rs.on('end',()=>{
console.log('读取完成')
})
5、文件删除:
fs.unlink('./b.txt',function (err) {
if (err){
throw err;
}else{
console.log('delete success')
}
})
还有 rm 方法删除文件,用法同上
6、文件重命名:
重命名:
//导入fs模块
const fs=require('fs');
//调用rename方法
fs.rename('座右铭.txt','论语.txt',err=>{
if(err){
console.log("失败")
return ;
}
console.log("成功")
});
8、文件目录操作:
fs.mkdir('./test',function (err) {
console.log(err);
})
//rmdir只能删除空文件夹
fs.rmdir('./file',function (err) {
if (err){
console.log('fail')
}else{
console.log('success')
}
})
递归创建:
//导入fs模块
const fs=require('fs');
//递归创建
fs.mkdir('./a/b/c',{recursive:true},err=>{
if(err){
console.log("失败")
return ;
}
console.log("成功")
})
读取文件夹:
const fs=require('fs');
//同步读取文件
let dir=fs.readdirSync('./');
console.log(dir); //返回数组 读取当前目录下的信息
//错误的回调优先,在回调函数中第一个参数表示错误对象 默认null
fs.readdir('./a',function (err,data) {
if (err){
console.log('读取错误');
}else{
console.log(data)
}
})
9、文件的复制:(获取数据,再写入)
//导入fs模块
const fs=require('fs');
//方式一:readFile
let data=fs.readFileSync('座右铭.txt');
//写入文件
fs.writeFileSync('座右铭2.txt',data)
//方式二:流式操作
//创建读取流对象
const rs = fs.createReadStream('座右铭.txt');
const ws = fs.createWriteStream('座右铭3.txt');
//绑定data事件
rs.on('data',chunk=>{
ws.write(chunk);
})
流式读取所占内存更小,更推荐
10、查看资源状态 :
结果值对象结构:
stats.isFile()
stats.isDirectory()
stats.isBlockDevice()
stats.isCharacterDevice()
stats.isFIFO()
stats.isSocket()
11、fs路径:
12、__dirname(相当于全局变量)
9、path模块
//导入path模块
const path=require('path');
//resolve
console.log(path.resolve(__dirname,'01.js'))
结果:
d:\Demo\NodeDemo\01.js
//导入path模块
const path=require('path');
//parse 方法 __filename和__dirname类似于全局变量,__filename保存文件的绝对路径
console.log(__filename);
let str ='d:\\Demo\\NodeDemo\\01.js'
console.log(path.parse(str))
扩展:
自动化更新代码--页面
在控制台:npm init -y
生成
npm i vue -S
生成:node_modules文件夹
进入当前目录
cd xxx
nodemon 你的文件
几种包安装的方式:
npm install moduleName 命令
- 安装模块到项目node_modules目录下。
- 不会将模块依赖写入devDependencies或dependencies 节点。
- 运行 npm install 初始化项目时不会下载模块。
npm install -g moduleName 命令
- 安装模块到全局,不会在项目node_modules目录中保存模块包。
- 不会将模块依赖写入devDependencies或dependencies 节点。
- 运行 npm install 初始化项目时不会下载模块。
npm install -save moduleName 命令 => -S
- 安装模块到项目node_modules目录下。
- 会将模块依赖写入dependencies 节点。
- 运行 npm install 初始化项目时,会将模块下载到项目目录下。
- 运行npm install --production或者注明NODE_ENV变量值为production时,会自动下载模块到node_modules目录中。
npm install -save-dev moduleName 命令 => -D
- 安装模块到项目node_modules目录下。
- 会将模块依赖写入devDependencies 节点。
- 运行 npm install 初始化项目时,会将模块下载到项目目录下。
- 运行npm install --production或者注明NODE_ENV变量值为production时,不会自动下载模块到node_modules目录中。
总结
devDependencies 节点下的模块是我们在开发时需要用的,比如项目中使用的 gulp ,压缩css、js的模块。这些模块在我们的项目部署后是不需要的,所以我们可以使用 -save-dev 的形式安装。
像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下,所以我们应该使用 -save 的形式安装。