Node.js 很慢吗?只有在你不知道这个的时候 🚀

发布: (2025年12月20日 GMT+8 13:34)
4 min read
原文: Dev.to

Source: Dev.to

真相炸弹

Node.js 并不慢。大多数 Node.js 应用慢是因为开发者使用方式不当。

常见误区

  • “Node.js 处理不了大规模” ❌
  • “Node.js 是单线程的,所以很慢” ❌
  • “我们应该改写成 Java/Spring” ❌

Node.js 为 Netflix、PayPal、Uber、LinkedIn、Walmart 等众多公司提供动力。

为什么 API 感觉慢

阻塞事件循环

// 这会阻塞所有操作
const result = fs.readFileSync('big-file.txt');
// 非阻塞版本
fs.readFile('big-file.txt', (err, data) => {
  // 处理数据
});

规则: 在生产环境的 API 中绝不要使用同步方法。

Node.js 特性

  • JavaScript 执行是单线程的
  • 底层是多线程的(libuv 线程池)
  • 事件驱动 & 非阻塞

把 Node.js 想象成一条高速快车道:如果中间有卡车停下(阻塞代码),一切都会堵塞。

CPU 密集型任务

Node.js 并不适合:

  • 图像处理
  • PDF 生成
  • 加密循环
  • 实时视频处理
  • 机器学习训练

卸载工作

  • Worker Threads 用于后台任务(BullMQ、RabbitMQ、Kafka)
  • 微服务用于重计算
const { Worker } = require('worker_threads');
// 使用 worker 来运行 CPU 密集型代码

数据库瓶颈

90 % 的慢 Node.js 应用实际上是慢数据库导致的:

  • 缺少索引
  • N+1 查询
  • 拉取不必要的列
CREATE INDEX idx_user_email ON users(email);

规则: 先优化数据库——Node.js 很少是瓶颈。

缓存

如果每个请求都直接访问数据库,应用会爬得很慢。使用:

  • Redis(内存缓存)
  • HTTP 缓存头
redis.get(key) || fetchFromDB();

仅缓存就能提升 10×–100× 的性能。

并行执行

await task1();
await task2(); // 顺序执行
await Promise.all([task1(), task2()]); // 并行执行

并行执行很重要。

流(Streams)

很多开发者忽视流——这是大错误。

// 错误:把整个文件加载到内存
const data = fs.readFileSync('1GB.log');
// 正确:低内存,高性能
fs.createReadStream('1GB.log').pipe(res);

流提供低内存占用和高吞吐量。

横向扩展

Node.js 通过横向扩展,而不是纵向扩展。

  • Cluster 模式
  • PM2
  • Kubernetes
  • AWS 自动伸缩组

每个 CPU 核心运行一个 Node 进程。

何时避免使用 Node.js

避免在以下场景使用 Node.js:

  • 重 CPU 计算
  • 实时视频处理
  • 机器学习训练

Node.js 在 I/O 密集、高并发的系统中表现出色。

推荐技术栈

  • Node.js + Fastify / NestJS – 能高效处理数百万用户。

结论

Node.js 并不慢。慢的是糟糕的架构。如果你:

  • 尊重事件循环
  • 优化数据库和缓存
  • 正确使用异步模式

Node.js 将超越大多数传统技术栈。

阅读原文(Medium)

Back to Blog

相关文章

阅读更多 »

JavaScript的秘密生活:异步

引言 蒂莫西叹了口气,将额头靠在凉爽的橡木绘图台上。几张 logic diagrams 摊在他面前。 > “我卡住了……”