global是Node.js中的全局命名空间对象,与浏览器不同,浏览器中顶层作用域是全局作用域,而Node.js中顶层作用域不是全局作用域。
看起来是全局变量实际不是的变量
有一些变量仅存在于模块范围内,这些变量在所有模块中都提供,所以看起来像是全局的,但实际不是。
- __dirname
- __filename
- exports
- module
- require()
Buffer类(缓冲器)
Buffer 类是一个全局变量,使用时无需 require('buffer').Buffer
Buffer 类用于在 TCP 流或文件系统操作等场景中处理字节流。
Buffer 类的实例类似于整数数组,大小是固定的,在 V8 堆外分配物理内存。 Buffer 的大小在创建时确定,且无法改变。
Buffer是八位字节组成的数组,可以有效的在JS中存储二进制数据。
api
-
Buffer.from(array)
返回一个Buffer
,包含传入的字节数组的拷贝。 -
Buffer.from(arrayBuffer[, byteOffset [, length]])
返回一个Buffer
,与传入的ArrayBuffer
共享内存。 -
Buffer.from(buffer)
返回一个Buffer
,包含传入的Buffer
的内容的拷贝。 -
Buffer.from(string[, encoding])
返回一个Buffer
,包含传入的字符串的拷贝。 -
Buffer.alloc(size[, fill[, encoding]])
返回一个指定大小且已初始化的Buffer
。 该方法比Buffer.allocUnsafe(size)
慢,但能确保新创建的Buffer
不会包含旧数据。 -
Buffer.allocUnsafe(size)
与Buffer.allocUnsafeSlow(size)
返回一个指定大小但未初始化的Buffer
。 因为Buffer
是未初始化的,可能包含旧数据。
案例:
//创建一个长度为10,用0填充的Buffer
const buf1 = Buffer.alloc(10);
console.log(buf1);
//创建一个长度为10,用01填充的Buffer
const buf2 = Buffer.alloc(10,1);
console.log(buf2);
//创建一个长度为10,用a的utf8编码填充的Buffer
const buf21 = Buffer.alloc(10,'a');
console.log(buf21);
//创建一个长度为11,用aGVsbG8gd29ybGQ=的base64编码填充的Buffer
const buf22 = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
console.log(buf22);
//创建一个长度为10,没有初始化的Buffer
// 这个方法比调用 Buffer.alloc() 更快,但返回的 Buffer 实例可能包含旧数据,因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
console.log(buf3);
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
console.log(buf4);
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
console.log(buf5);
// 创建一个包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。
const buf6 = Buffer.from('tést', 'latin1');
console.log(buf6);
返回:
初始化,使用--zero-fill-buffers 命令行选项
为了安全起见,在创建Buffer的时候,通常都需要初始化,可以使用 --zero-fill-buffers
命令行选项来初始化,即将值初始化填充为0。
使用 --zero-fill-buffers
命令行选项时,new Buffer(size)
、Buffer.allocUnsafe()
、Buffer.allocUnsafeSlow()
或 new SlowBuffer(size)
返回的 Buffer
在创建时会用 0 填充
$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>
注意:当调用
Buffer.allocUnsafe()
和 Buffer.allocUnsafeSlow()
时,分配的内存是未初始化的(没有用 0 填充)。这样虽然分配内存很快,但是分配的内存可能包含有旧数据,如果没有重写内存,那读取Buffer的时候,就会使旧数据泄露。
字符编码
当 Buffer 存入或取出字符串时,需要指定字符编码
Node.js 支持的字符编码有:
- 'ascii' - 仅支持 7 位 ASCII 数据。
- 'utf8' - 多字节编码的 Unicode 字符。
- 'utf16le' - 2 或 4 个字节,小端序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
- 'ucs2' - 'utf16le' 的别名。
- 'base64' - Base64 编码。
- 'latin1' - 将 Buffer 编码成单字节编码的字符串。
- 'binary' - 'latin1' 的别名。
- 'hex' - 将每个字节编码成两个十六进制字符。
timer(定时器)
timer模块定义了一些定时器函数,暴露在全局,定时器函数都是全局变量,不需要调用require('timers') 来使用 API。
Node.js 中的定时器函数实现了与 Web 浏览器提供的定时器 API 类似的 API,但是使用了不同的内部实现(基于 Node.js 事件循环构建)。
Immediate 类
从setImmediate()
返回,传给clearImmediate()
取消。
- setImmediate(callback[, ...args]):预定在 I/O 事件的回调之后立即执行的 callback。当多次调用 setImmediate() 时,callback 函数将按照创建它们的顺序排队等待执行。
- clearImmediate(immediate):取消由
setImmediate()
创建的Immediate
对象。
Timeout 类
此对象在内部创建,并从 setTimeout()
和 setInterval()
返回。 它可以传给 clearTimeout()
或 clearInterval()
以取消计划的操作
setInterval(callback, delay[, ...args]):预定每隔 delay 毫秒重复执行 callback
setTimeout(callback, delay[, ...args]):预定在 delay 毫秒之后执行一次性的 callback。可能不会精确地在 delay 毫秒时调用 callback。 Node.js 不保证回调被触发的确切时间,也不保证它们的顺序。 回调会在尽可能接近指定的时间调用。
clearInterval(timeout):取消由
setInterval()
创建的Timeout
对象。clearTimeout(timeout):取消由
setTimeout()
创建的Timeout
对象
console
console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台,导出了Console类(包含 console.log()、console.error() 和 console.warn() 等方法)和全局的console实例,配置为写入 process.stdout
和 process.stderr
。 使用时无需调用 require('console')
。
console.assert(value[, ...message])
一个简单的断言测试,用于验证 value
是否为真。 如果不是,则记录 Assertion failed
。 如果提供 message
,则通过传入所有消息参数来使用 util.format()
格式化错误消息。 输出用作错误消息。
console.clear()
console.clear() 的具体操作可能因操作系统和终端类型而异。 对于大多数 Linux 操作系统,console.clear() 的操作与 clear 的 shell 命令类似。 在 Windows 上,console.clear() 将仅清除当前终端视图中 Node.js 二进制文件的输出。
console.error([data][, ...args])
用换行符打印到 stderr。
console.info([data][, ...args])
console.log([data][, ...args])
console.table(tabularData[, properties])
使用 tabularData(或使用 properties)的属性列和 tabularData 的行来构造一个表并记录它
console.table([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }]);
输出:
console.time([label])
启动一个计时器,用以计算一个操作的持续时间。 计时器由一个唯一的 label
标识。 当调用 console.timeEnd()
时,可以使用相同的 label
来停止计时器,并以毫秒为单位将持续时间输出到 stdout
。 计时器持续时间精确到亚毫秒。
console.timeEnd([label])
停止先前通过调用 console.time()
启动的计时器,并打印结果到 stdout
console.time('100-elements');
for (let i = 0; i < 100; i++) {}
console.timeEnd('100-elements');
输出:
process
process 对象是一个全局变量,它提供有关当前 Node.js 进程的信息并对其进行控制。 作为一个全局变量,无需使用 require()。
process对象是EventEmitter
的实例
EventEmitter(EventEmitter类):Emitter表示触发器,大多数Node.js核心API构建于异步事件驱动架构,其中有某些类型的对象(就是Emitter,也叫做触发器)会触发命名事件来调用函数(也叫做监听器)。以上的process对象就是一个触发器,也可以说是监听器。
所有能触发事件的对象都是EventEmitter
类的实例。这些对象有一个eventEmitter.on()
函数,用于将一个或多个函数绑定到命名事件上。事件命名通常采用驼峰式命名。
process对象设定了一些命名事件的处理:
- 'beforeExit' 事件:当 Node.js 清空其事件循环并且没有其他工作要安排时,会触发 'beforeExit' 事件
- 'exit' 事件:当 Node.js 进程因调用
process.exit()
或者事件循环完毕将退出时,则会触发 'exit' 事件
process.on('exit', (code) => {
console.log(`退出码: ${code}`);
});
在调用 'exit' 事件监听器之后,Node.js 进程将立即退出,从而导致在事件循环中仍排队的任何其他工作被放弃
- 'message' 事件:如果使用 IPC 通道衍生 Node.js 进程,则只要子进程收到父进程使用
childprocess.send()
发送的消息,就会触发'message'
事件 - 'warning' 事件:任何时候Node.js发出进程告警,都会触发'warning'事件
process.on('warning', (warning) => {
console.warn(warning.name); // 打印告警名称
console.warn(warning.message); // 打印告警信息
console.warn(warning.stack); // 打印堆栈信息
});
process还有一些属性或方法(只记录部分):
- process.argv:一个数组,其中包含当启动 Node.js 进程时传入的命令行参数
- process.config:一个Javascript对象。此对象描述了用于编译当前Node.js执行程序时涉及的配置项信息
- process.env:包含用户环境的对象
- process.abort():使Node.js进程立即结束
- process.exit([code]):以退出状态
code
指示 Node.js 同步地终止进程。 如果省略code
,则使用成功代码0
或process.exitCode
的值(如果已设置)退出。 在调用所有的'exit'
事件监听器之前,Node.js 不会终止 - process.kill(pid[, signal]):将signal发送给pid标识的进程
- process.send(message[, sendHandle[, options]][, callback]):如果Node.js进程是通过进程间通信产生的,那么,process.send()方法可以用来给父进程发送消息。 接收到的消息被视为父进程的
ChildProcess
对象上的一个'message'
事件。