游客发表
用 Node.js 写网站,网站最直接的网站好处是前端和后端能共用一套语言。我见过不少小团队,网站前端写 React,网站后端用 Express,网站两边都是网站 JavaScript,切换起来几乎没成本。网站这种一致性带来的网站效率提升,在项目初期特别明显。网站
但 Node.js 不是网站万能药。它的网站核心优势在于 I/O 密集型场景——比如处理大量并发请求、做 API 网关、网站实时通信。网站你要是网站拿它去跑 CPU 密集型的任务,比如视频转码或者复杂的网站数据分析,单线程模型就会拖后腿。我试过用 Node.js 做图像处理,一个请求就能把事件循环堵死,后面排队的请求全在等。后来改用 worker_threads 才勉强撑住,但性能还是不如 Go 或 Rust。
Express 是最老牌的选择,生态最全,中间件多到用不完。但它的回调风格在现代 JavaScript 里显得有点旧。Koa 由 Express 原班人马打造,用 async/await 重写了中间件模型,代码更干净。我个人的判断是:新项目如果不需要那些老旧的 Express 中间件,直接上 Koa 或者 Fastify。Fastify 的性能更好,schema 校验也内置了,写起来反而更省心。
不过框架选择不是最关键的。我见过有人用 Express 写出比 Koa 更优雅的代码,也见过用 Fastify 把项目搞得一团糟。核心还是看你怎么组织路由、怎么处理错误、怎么管理配置。
Node.js 是异步的,但很多人写数据库查询时还是用同步思维。比如在循环里逐个 await 查询,一个请求要等十几次数据库往返。我早期做过一个后台管理页面,列表接口里对每条记录都查一次用户信息,结果 100 条数据要 3 秒才返回。后来改成一次 JOIN 查询,降到 80 毫秒。这个教训很直接:Node.js 的异步能力不是让你把串行逻辑写得更优雅,而是让你能方便地做并行。
连接池也是必须的。MySQL 和 PostgreSQL 都有成熟的池化方案,别每次请求都新建连接。MongoDB 的官方驱动自带池化,但默认配置不一定适合你的场景,记得调 maxPoolSize。
生产环境跑 Node.js,PM2 或者 systemd 都行。但有个细节容易被忽略:Node.js 默认的堆内存上限在 64 位系统上大约是 1.5GB 到 2GB。如果你的应用内存占用接近这个数,GC 会变得很频繁,响应时间抖动明显。我遇到过一次线上接口偶尔超时,查了半天才发现是内存快满了。后来加了 --max-old-space-size=4096 参数,问题消失。
日志也别直接 console.log。用 pino 或者 winston,输出 JSON 格式,方便 ELK 或者 Loki 收集。console.log 在大量输出时会阻塞事件循环,这个坑我踩过。
如果你的网站主要是 CPU 密集型计算,比如科学模拟、视频编码、大规模数据聚合,Node.js 会让你难受。这时候选 Python 加 Celery,或者 Go 加 goroutine,甚至 Java 的线程池,都比硬扛 Node.js 单线程要明智。技术选型不是信仰问题,是匹配问题。
Node.js 做网站,适合快速迭代、I/O 密集、前后端同构的场景。用对了很舒服,用错了很痛苦。判断标准就一条:你的瓶颈在等 I/O,还是在算 CPU。
友情链接