目录
概述
Node.js是运行在服务端的JavaScript。Node.js搭建了一个JavaScript的服务器运行环境,JavaScript可以脱离浏览器直接运行。可以将Node理解为JavaScript的虚拟机,虚拟的构建一个JavaScript的运行环境。
Node.js适合场景:
1.实时性应用
2.以I/O为主的高并发应用
3.流式应用
4.前后端分离
CommonJS规范
Node应用由模块组成,Node遵循了CommonJS的模块规范。CommonJS是一套代码规范,目的是构建JavaScript再浏览器之外的生态系统,通过此规范使得JavaScript具备开发复杂应用、跨平台的能力。
特点
1.代码运行在当前模块作用域中,不会污染全局作用域
2.模块同步加载(根据代码中出现顺序依次加载)
3.模块可以多次加载,但只会在第一次加载时运行一次,之后运行结果被缓存,再度加载直接读取缓存结果。再次运行模块必须先清除缓存
主要内容
1.导入模块:require('模块名称')
require命令基本功能:读入并执行一个JavaScript文件--返回该模块的exports对象/没有发现指定模块则报错
加载规则:
(1)用于加载js文件,默认文件扩展名.js
(2)根据参数的不同格式去不同路径下查找相应的js文件
'/'开头字符串:表示加载一个位于绝对路径的模块文件
'./'或'../'开头字符串,表示加载一个位于相对路径的模块文件
上述均不是表示加载的模式是node默认提供的核心模块,或者一个位于各级node_modules目录的已安装模块
2.导出模块:module.export 导出模块
每个导出的模块都有一个module对象代表当前模块,其包含属性如下:
● module.id:模块识别符,通常是带有绝对路径的模块文件名
● module.filename:模块文件名,带有绝对路径
● module.load:返回一个布尔值,表示模块是否已经加载完成
● module.parent:返回一个对象,表示调用该模块的模块
● module.children:返回一个数组,表示该模块要用到的其他模块
● module.exports:表示当前模块对外输出的接口。Node为每个模块提供给一个exports变量指向module.exports,不能直接指向一个值
var exports = module.exports;
● module.paths:从当前文件目录开始查找,依次进入父目录迭代直至根目录的node_modules目录
Buffer对象
Buffer对象是Node处理二进制数据的一个接口,它是Node原生提供的全局对象,可以直接使用,不需要导入。
JavaScript不擅长处理二进制数据,为了解决该现象Buffer对象应运而生。
Buffer是一个构造函数,生成的实例代表V8引擎分配的一段内存,是一个类似数组的对象,成员为0~255的整数值。
基本操作
● 创建
let Buffer对象 = new Buffer(size)
let test = new Buffer(256);
● 切片
Buffer对象.slice(start,end)
// 创建Buffer对象实例 let test = new Buffer(256); // 遍历每个字节,写入内容 for(let i=0;i<test.length;i++){ test[i] = i; } // 切片 let qiepian = test.slice(245,256); console.log(qiepian[0]) //245 console.log(qiepian) //<Buffer f5 f6 f7 f8 f9 fa fb fc fd fe ff>
● 拷贝
Buffer对象.copy(目标缓冲区,目标缓冲区的起始位置,源缓冲区的起始位置,源缓冲区的结束位置)
// 创建Buffer对象实例test1 let test1 = new Buffer(10); // 遍历每个字节,写入内容 for(let i=0;i<test1.length;i++){ test1[i] = i; } // 创建Buffer对象实例test2 let test2 = new Buffer(5); // 拷贝 将test1实例的5-10号成员拷贝到test2实例从0开始的区域 test1.copy(test2,0,5,10) console.log(test2) //<Buffer 05 06 07 08 09>
● Buffer与字符串之间互换
Buffer与字符串之间互换需要指定编码格式,目前支持的编码格式如下:
ascii、utf8、utf16le、ucs2、base64、hex
与二进制数组的区别
二进制数组根据类型不同其值范围也不同,例如:
Int8Array:-128~127;Int16Array:-32768~32767;
Uint8Array:0~25;UInt16Array:0~65535
Buffer类是基于Uint8Array的,故其值为0~255的整数数组
Buffer类
Buffer提供如下API创建Buffer类:
● Buffer.alloc(size[,fill[,encoding]])
返回指定大小的Buffer实例,fill代表填充值,不设置默认填充0
// 创建一个长度为5,用0填充的Buffer let buf1 = Buffer.alloc(5); //<Buffer 00 00 00 00 00> // 创建一个长度为5,用0x2填充的Buffer let buf2 = Buffer.alloc(5,2) //<Buffer 02 02 02 02 02>
● Buffer.allocUnsafe(size)
返回指定大小的Buffer实例,但是不会被初始化。该方法调用速度快于Buffer.alloc(),但返回的实例可能包含旧数据,故需要使用fill()或write()重写
//创建一个长度为5,未初始化的Buffer let buf3 = Buffer.allocUnsafe(5) //<Buffer 00 00 00 00 00>
● Buffer.from()
当括号内传递一个array,返回一个被array的值初始化的新Buffer实例
当括号内传递一个字符串,返回一个被string的值初始化的新Buffer实例
当括号内传递一个Buffer实例,复制传入的Buffer实例的数据并返回一个新Buffer实例
// 创建一个包含[0x1,0x3,0x5]的Buffer let buf4 = Buffer.from([1,3,5]) //<Buffer 01 03 05> console.log(buf4) //创建一个被字符串初始化的Buffer let buf5 = Buffer.from('123abc') //<Buffer 31 32 33 61 62 63> console.log(buf5) //拷贝 let buf6 = Buffer.from(buf5) //<Buffer 31 32 33 61 62 63> console.log(buf6)
Buffer常用方法
写入缓冲区
语法:buf.write(string[, offset[, length]][, encoding])
string:写入缓冲区的字符串
offset:缓冲区开始写入的索引值,默认为0
length:写入的字节数,默认为buffer.length
encoding:使用编码,默认utf8
若buffer空间小于字符串长度,则仅写入部分字符串
示例:
// buffer空间足够
let buf1 = Buffer.alloc(256);
let w1 = buf1.write("string 123") //写入字节数10(包含空格)
// buffer空间不足,仅写入部分字符串
let buf2 = Buffer.alloc(5);
let w2 = buf2.write("string 123") //写入字节数5
缓冲区读取数据
语法:buf.toString([encoding[, start[, end]]])
encoding:使用编码,默认utf8
start:开始读取的索引位置,默认0
end:读取结束位置,默认缓冲区末尾
示例:
let buf1 = Buffer.alloc(26);
for(let i=0;i<26;i++){
buf1[i] = i + 97;
}
console.log(buf1.toString('ascii')) //abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('utf8')) //abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('utf8',5,10)) //fghij
console.log(buf1.toString(undefined,5,10)) //fghij
Buffer转换JSON
语法:buf.toJSON()
示例:
let buf1 = Buffer.from([1,2,3]);
//相当于 let json1 = JSON.stringify(buf1); //{"type":"Buffer","data":[1,2,3]}
let json1 = buf1.toJSON(buf1); //{ type: 'Buffer', data: [ 1, 2, 3 ] }
let buf2= Buffer.from([0x1,0x2,0x3]);
let json2 = buf2.toJSON(buf2); //{ type: 'Buffer', data: [ 1, 2, 3 ] }
缓冲区合并
语法:Buffer.concat(list[, totalLength])
list:合并的Buffer对象数组列表
totalLength:指定合并后的Buffer对象总长度
示例:
let buf1 = Buffer.from('abc');
let buf2 = Buffer.from('123');
let res1 = Buffer.concat([buf1,buf2])
//限制合并长度
let res2 = Buffer.concat([buf1,buf2],4)
console.log(res1,res2) //<Buffer 61 62 63 31 32 33> <Buffer 61 62 63 31>
console.log(res1.toString(),res2.toString()) //abc123 abc1
缓冲区比较
语法:buf.compare(otherBuffer);
otherBuffer表示与buf对象比较的另一个Buffer对象
buf < otherBuffer 输出 -1
buf > otherBuffer 输出 1
buf = otherBuffer 输出 0
示例:
let buf1 = Buffer.from('abc');
let buf2 = Buffer.from('abc12');
let buf3 = Buffer.from('abc');
let res1 = buf1.compare(buf2); //-1
let res2 = buf2.compare(buf1); //1
let res3 = buf1.compare(buf3); //0
拷贝缓冲区
语法:buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])
targetBuffe:目标缓冲区(拷贝的Buffer对象)
targetStart:目标缓冲区起始位置
sourceStart:源缓冲区起始位置(包括)
sourceEnd:源缓冲区结束位置(不包括)
示例:
let buf1 = Buffer.from('abcdefg');
let buf2 = Buffer.from('123456');
//将buf2插入到buf1指定位置上
buf2.copy(buf1,3,2,5);
console.log(buf1.toString()) //abc345g
缓冲区裁剪
语法:buf.slice([start[, end]])
范围包括起始位置不包括结束位置
示例:
let buf1 = Buffer.from('abcdefg');
let buf2 = buf1.slice(1,3);
console.log(buf2.toString()) //bc
缓冲区长度
语法:buf.length;
返回Buffer对象占据内存长度
示例·(缓冲区长度计算包括空格和其他符号):
let buf1 = Buffer.from('abcdefg');
let buf2 = Buffer.from('a b c de$fg');
console.log(buf1.length,buf2.length) //7 11
其他Buffer模块常用方法: