Node.js fs 模块的异步、同步与 Promise API 对比
请对比 Node.js fs 模块中 callback 风格、同步 sync 风格、以及 fs.promises(Promise 风格)三种 API 的使用差异和性能/异常处理区别。
回答
孤独的心
三种 API 风格:
1. Callback 风格(传统):
const fs = require('fs');
fs.readFile('/file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
- 回调地狱问题,需手动嵌套
- 错误优先回调(error-first)模式
2. Sync 风格:
const data = fs.readFileSync('/file.txt', 'utf8');
- 同步阻塞事件循环,应用初始化/CLI 脚本可用
- 生产环境 HTTP 请求中严禁使用(阻塞所有并发)
- 异常通过 try/catch 捕获
3. Promise 风格(fs.promises):
const fs = require('fs/promises');
async function readFile() {
try {
const data = await fs.readFile('/file.txt', 'utf8');
console.log(data);
} catch (err) {
console.error(err);
}
}
- Node.js 10+ 稳定,推荐方式
- 可与 async/await 配合,异常通过 try/catch
- 性能等同 callback 风格,不阻塞事件循环
性能对比:异步版本(callback + promise)利用线程池(libuv default 4 线程),I/O 操作不阻塞主线程。同步版本直接阻塞。
最佳实践:新项目全部使用 fs.promises 或 fs/promises。