Ruta de Frontend → Node
Una rampa de cinco etapas para que los ingenieros de frontend se conviertan en expertos en Node: bucle de eventos, streams, primera API con pruebas y un PR final en la segunda semana.
Busca en todas las páginas de la documentación
Una rampa de cinco etapas para que los ingenieros de frontend se conviertan en expertos en Node: bucle de eventos, streams, primera API con pruebas y un PR final en la segunda semana.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
Ruta de aprendizaje de la Semana 1 (frontend → Node)
Día 1-2 Bucle de eventos + E/S no bloqueante ([Cómo funciona Node.js](../node-fundamentals/how-node-js-works.md))
Día 3 Primera ruta de Fastify + Zod + curl smoke
Día 4 Prueba de integración node:test con inject()
Día 5 Proyecto final: POST /items con Postgres + migraciónCuándo usarlo:
Los desarrolladores de frontend conocen el hilo único del navegador. Node es similar con un giro: pool de hilos de libuv para algunas operaciones de E/S.
// MAL: bloquea el bucle de eventos ~2s en trabajo síncrono grande
import fs from "node:fs";
const data = fs.readFileSync("./huge.json", "utf8");
JSON.parse(data);
// BIEN: asíncrono + stream o worker
import fs from "node:fs/promises";
const data = await fs.readFile("./huge.json", "utf8");| Navegador | Servidor Node |
|---|---|
fetch en componente | await fetch o consulta DB en manejador |
| La UI se congela en trabajos síncronos largos | Todos los clientes se detienen en el bloqueo del bucle |
| Web Workers | Proceso worker de BullMQ |
bcrypt.hashSync síncrono vs bcrypt.hash asíncrono bajo curl concurrenteRelacionado: Cómo funciona Node.js
import { createReadStream, createWriteStream } from "node:fs";
import { pipeline } from "node:stream/promises";
import { createGzip } from "node:zlib";
await pipeline(
createReadStream("export.csv"),
createGzip(),
createWriteStream("export.csv.gz")
);FileReader de frontend carga a memoria; los streams de Node limitan el RSS en cargas/descargasbuffer entire file// test/items.test.ts
import { test } from "node:test";
import assert from "node:assert/strict";
import { buildApp } from "../src/app.js";
test("GET /items devuelve un array", async () => {
const app = await buildApp();
const res = await app.inject({ method: "GET", url: "/items" });
assert.equal(res.statusCode, 200);
assert.ok(Array.isArray(res.json()));
await app.close();
});inject() es como Testing Library para HTTP - sin navegador, sin puerto abiertonode:test + assertRelacionado: Conceptos básicos de Fastify | Prueba de aplicaciones Fastify
// MAL: promesa flotante en fire-and-forget
sendWelcomeEmail(user.id);
// BIEN: await o cola explícita
await emailQueue.add("welcome", { userId: user.id });await db.transaction(async (tx) => {
await tx.order.create({ data: order });
await tx.inventory.decrement({ where: { sku }, data: { qty: 1 } });
});transaction()## Proyecto final: segmento de API de ítems
- [ ] Migración: tabla de ítems
- [ ] GET /items, POST /items con Zod
- [ ] Cobertura node:test para 400 y 201
- [ ] curl smoke en la descripción del PR
- [ ] Sin secretos en el diff| Hábito de frontend | Ajuste de Node |
|---|---|
| Retroalimentación instantánea en el navegador | Lee logs y curl, no solo hot reload |
| Validación del lado del cliente suficiente | El servidor debe validar con Zod |
| Estado en el contexto de React | Estado en Postgres + invalidación de caché |
| Despliegue de activos estáticos | Despliegue de API + el orden de migración importa |
Fastify 5 para nuevos contratados: schema-first, pruebas inject(), Pino integrado. Express si el estándar de producción del equipo es Express - alinea con ADR.
CRUD + una migración + ejemplo de transacción es suficiente. La profundidad del ORM llega en la semana 2-3 con el emparejamiento del mentor.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026