Operações bloqueantes (blocking) rodam de forma síncrona e seguram a única thread do JavaScript até terminarem — nada mais pode rodar nesse meio-tempo. Operações não bloqueantes (non-blocking) iniciam o trabalho, retornam imediatamente e entregam o resultado depois via callback, Promise ou evento, então a thread fica livre para fazer outras coisas.
Por que o Node é single-thread e ainda assim não bloqueante
Seu JavaScript roda em thread guiada pelo . O I/O (arquivos, rede, DNS) é delegado ao , que usa os recursos assíncronos do sistema operacional e uma pequena por baixo dos panos. Enquanto esse trabalho acontece fora da thread, o event loop continua processando outros callbacks. Quando o I/O termina, seu callback é enfileirado e executado.
