O que a maioria dos diagramas de event loop do Node não mostra
Eu compilei o Node.js e o libuv do zero com std::cout e console.log espalhados pelo código pra ver o event loop funcionando. O que eu vi não bate com o que a maioria dos tutoriais ensina.
O que está errado nos diagramas
Você provavelmente já viu aquele diagrama com uma fila de eventos, uma call stack e setas girando. O Bert Belder - cofundador do libuv - corrigiu isso numa palestra de 2017 que até hoje é a melhor referência que eu conheço sobre o assunto: https://www.youtube.com/watch?v=PNa9OMajw9w

Três coisas que ele corrige e que eu confirmei no código:
O event loop tem fases distintas que executam em ordem fixa: Timers, I/O (o Belder chama de "Unicorn"), setImmediate (check handlers) e Close handlers. Não é uma fila genérica.
Operações de rede não passam pelo thread pool. Vão direto pro kernel via epoll (Linux) ou kqueue (macOS). O thread pool (4 threads por padrão) é só pra file system e DNS. Muita gente acha que tudo passa pelo thread pool.
E a parte que ninguém mostra nos diagramas: entre cada fase, código JavaScript roda. O Node drena as microtasks do V8 (Promises resolvidas) e os callbacks de process.nextTick entre cada fase do libuv. O libuv não sabe nada sobre microtasks - isso é conceito do V8. O Node é quem costura os dois mundos. Sem entender essa costura, os diagramas bonitos te enganam.

Vendo no código
Eu enfiei std::cout no C++ e console.log no JavaScript interno do Node pra rastrear o fluxo. No post completo tem os trechos de código, mas o resumo é: dá pra ver exatamente o momento em que o Node drena as microtasks entre cada fase do libuv.
Um detalhe que me surpreendeu: process.nextTick não roda no "próximo tick" - roda no tick atual. O nome mente. E se você agendar um nextTick dentro de outro, ele entra na mesma fila que tá sendo drenada naquele momento. O setImmediate fica esperando.
Quer reproduzir?
Clona o repositório do Node, compila, e coloca print onde quiser. Não precisa de nada especial. O código é mais legível do que parece. Meu branch com os experimentos: https://github.com/geeksilva97/node/tree/playing-with-node

O post completo com mais trechos de C++ e a história do process.nesteTick (sim, eu "corrigi" o nome do nextTick com português kkkk): https://codesilva.com/nodejs/2026/03/20/o-event-loop-do-node-nao-e-o-que-te-ensinaram