运行时与性能
事件循环的实际调度、堆快照的读法、worker_threads 真正划算的边界。
把某个接口的 p99 从 400ms 压到 90ms 的那次排查,比任何基准测试都更有说服力。
Long-form notes
一个人写 Node.js 的地方。运行时、依赖、构建链路,以及那些调试到凌晨三点的时刻。 写下来,是因为同样的坑我大概会踩第二次。
node项目 这个名字来自 2013 年秋天:一台散热风扇已经不太听话的旧笔记本,
装完 Node.js 之后跑通了一句 console.log。那一刻的错觉是,整个 Web 突然都变得可以亲手改一改了。
这个站点就是从那句话之后慢慢长出来的。
这些年做过的活儿比较杂——小团队的接口服务、电商后台的订单对账脚本、给设计同事写的批量图片处理工具, 还有几个一直没上线的玩具项目。真正留下来的东西不多,习惯只剩一个:把排查过程原样记下来, 包括那些走错的路。
这里没有账号,没有订阅,也不打算做成一门生意。写出来的东西对你有用最好, 没用的话,它至少是我自己的备份。
事件循环的实际调度、堆快照的读法、worker_threads 真正划算的边界。
把某个接口的 p99 从 400ms 压到 90ms 的那次排查,比任何基准测试都更有说服力。
锁文件、幽灵依赖、安装期脚本。生态的便利是真实的,它带来的信任成本同样真实, 这笔账值得每个人按自己的项目算一遍。
尽量让一条命令跑完格式检查、类型检查、打包和冒烟测试。工具换来换去, 最后追求的还是启动快、报错清楚、能塞进流水线。
按时间倒序。多数是排查笔记,少数是当时没想明白、后来又回头补上的问题。
增量类型检查、构建缓存和依赖提升之间的一次取舍,以及为什么最后放弃了全量并行。
三次堆快照对比之后,问题落在一个用对象当缓存键的闭包里。修复只改了两行。
让工具的输出可以被另一段脚本直接消费,比排得整整齐齐的表格实用得多。
提交锁文件解决了哪些问题,又悄悄制造了哪些新的不确定性,以及团队里怎么把它说清楚。
日常主力是一台装了 Linux 的旧台式机。 编辑器用 Neovim,终端里跑的东西尽量少而稳;能写脚本解决的重复劳动, 不会攒到第三次才动手。