Node.js fs 模块的异步、同步和 Promise API 有什么区别?
请对比 Node.js fs 模块的三种调用方式(回调式/同步式/Promise 式),并说明 fs.watch 文件监听。
回答
我是大山
三种 API 对比:
const fs = require('fs');
const fsPromises = require('fs/promises');
// 1. 回调式(Callback)
fs.readFile('file.txt', 'utf-8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 2. 同步式(Sync)— 阻塞事件循环
const data = fs.readFileSync('file.txt', 'utf-8');
console.log(data);
// 3. Promise 式(推荐)
const data = await fsPromises.readFile('file.txt', 'utf-8');
console.log(data);
对比: | 方式 | 是否阻塞 | 错误处理 | 适用场景 | |------|---------|---------|---------| | 回调式 | 非阻塞 | 回调参数 err | 旧代码/简单操作 | | 同步式 | ⚠️ 阻塞 | try-catch | 脚本启动时/CLI 工具 | | Promise | 非阻塞 | try-catch/await | 大部分场景(推荐) |
fs.watch 文件监听:
const watcher = fs.watch('./dir', { recursive: true }, (eventType, filename) => {
console.log(`文件 ${filename} 发生了 ${eventType} 事件`);
});
// 停止监听
watcher.close();
常用方法列表:
fs.stat/fs.access— 文件信息/权限fs.mkdir/fs.rmdir/fs.readdir— 目录操作fs.readFile/fs.writeFile/fs.appendFile— 文件读写fs.unlink/fs.rename— 删除/重命名fs.createReadStream/fs.createWriteStream— 流式读写