1. 事件循环与非阻塞 I/O
概述: 允许 Node.js 在单线程的情况下执行非阻塞 I/O 的机制。
组成部分:
- 调用栈: 执行同步代码。
- 回调队列: 存放在异步操作完成后等待执行的回调函数。
- 事件循环: 检查调用栈是否为空,然后从回调队列中获取回调函数。
重要函数:
process.nextTick()
: 将回调函数放入单独的队列中,在下一个事件循环周期之前运行。setImmediate()
: 将回调函数排入下一个事件循环周期中执行。- 含义: 了解这一点有助于优化应用程序性能,并避免潜在的问题。
const fs = require('fs');
fs.readFile('./file.txt', (err, data) => {
if (err) throw err;
console.log(data);
});
console.log('正在读取文件…');
2. 缓冲区
概述: V8 堆之外的原始内存分配。
用途:
- 读取或写入文件系统。
- 处理来自网络协议的二进制数据。
- 通用的二进制数据操作。
重要方法:
- 创建:
Buffer.alloc()
,Buffer.from()
。 - 访问和修改:
buf.readUInt8()
,buf.writeUInt8()
。 - 转换:
buf.toString()
。
const buf = Buffer.from('Hello, Node.js', 'utf-8');
console.log(buf); // 输出原始缓冲区数据。
3. 流
概述: 用于流式数据的抽象。
类型:
- 可读流: 用于数据消耗(例如
fs.createReadStream()
)。 - 可写流: 用于数据生产(例如
fs.createWriteStream()
)。 - 双工流: 可读可写。
- 转换流: 在读取和写入时可以修改数据。
关键事件:
data
:当块可用时。end
:没有更多的数据可读取。error
:发生错误时。finish
:写入完成。
const fs = require('fs');
const readStream = fs.createReadStream('./largeFile.txt', 'utf8');
readStream.on('data'