JavaScript fuera del navegador
Durante años, JavaScript solo vivía dentro del navegador. Node.js cambió eso: es un entorno de ejecución que permite correr JavaScript en tu máquina o en un servidor, igual que correrías Python o Java.
Por dentro, Node usa V8, el mismo motor de JavaScript que Chrome. V8 compila tu código a instrucciones de máquina muy rápidas. A V8 le falta todo lo que no es el lenguaje en sí (leer archivos, abrir conexiones de red...): eso lo aporta Node, que añade un conjunto de APIs propias.
El navegador no está aquí
Como no hay navegador, no existen window ni document ni el DOM. En su
lugar, Node ofrece sus propios objetos globales:
console.log(process.version); // versión de Node, p. ej. "v20.11.0"
console.log(process.platform); // "linux", "darwin", "win32"...
globalThis.miDato = 42; // 'global' / 'globalThis' en vez de 'window'
process: información y control del proceso (argumentos, variables de entorno, salida...).global/globalThis: el objeto global (el equivalente awindow).
El modelo no bloqueante
Node ejecuta tu JavaScript en un solo hilo. Esto suena limitante, pero es la clave de su rendimiento gracias a un detalle: el I/O es asíncrono.
Cuando pides algo lento (leer un archivo, una consulta a la base de datos, una petición de red), Node no se queda esperando (no bloquea el hilo): delega esa operación, sigue atendiendo otras cosas y, cuando el resultado está listo, ejecuta tu código de continuación. Ese mecanismo es el event loop: un bucle que va sacando tareas terminadas de una cola y ejecutando sus callbacks.
console.log("1: empiezo");
setTimeout(() => console.log("3: tarea diferida"), 0);
console.log("2: sigo sin esperar");
// Imprime: 1, 2, 3 -> el setTimeout no bloquea; se ejecuta "después"
Por eso un solo servidor Node puede atender miles de conexiones a la vez: mientras una espera por el disco o la red, el hilo está libre para atender a las demás. La regla de oro: nunca bloquees el event loop con trabajo síncrono pesado, o todas las peticiones se quedarán congeladas.
Ejemplos
El event loop no espera: el orden no es el del código
console.log("A");
setTimeout(() => console.log("C (diferido)"), 0);
Promise.resolve().then(() => console.log("B (microtarea)"));
console.log("D");
// Orden: A, D, B, C