Secuencia de arranque
Descubrimiento del contenedor, selección del adaptador, inicio del ciclo de vida e inicialización de integraciones.
Arquitectura
Esta página se centra en el ciclo de vida del framework: arranque de la aplicación, ejecución de peticiones y puntos de extensión de security superpuestos sobre la misma canalización de controladores.
Descubrimiento del contenedor, selección del adaptador, inicio del ciclo de vida e inicialización de integraciones.
Resolución de ruta, guards, pipes, middlewares, handlers y serialización final del adaptador.
Las estrategias, los servicios de autenticación, los decoradores y el enriquecimiento del contexto de ruta siguen siendo compatibles con DI.
Manifiesto en caché, importaciones en paralelo, DI perezoso y watcher en caliente reducen el arranque un 40–60%.
Inicio rápido
npm install @xtaskjs/core @xtaskjs/common reflect-metadataimport "reflect-metadata";
import { CreateApplication } from "@xtaskjs/core";
await CreateApplication({
adapter: "node-http",
autoListen: true,
server: { host: "127.0.0.1", port: 3000 },
});Flujo de arranque
Decora servicios, controladores, runners y listeners en src/ para que el contenedor pueda descubrirlos.
Core crea el ciclo de vida de la aplicación, el kernel y el adaptador HTTP seleccionado.
El contenedor analiza los directorios del proyecto, registra providers y resuelve la metadata de los componentes.
Paquetes opcionales como typeorm y security registran enlaces de ciclo de vida en el mismo contenedor.
Los controladores y listeners se traducen en rutas, handlers y canalizaciones de ejecución del ciclo de vida.
El adaptador seleccionado empieza a aceptar peticiones y las reenvía a través del ciclo de vida.
Flujo de ejecución
Express, Fastify o node-http normalizan la petición y reenvían método y ruta al framework.
ApplicationLifeCycle resuelve la ruta del controlador registrada durante el arranque.
Los guards pueden bloquear o enriquecer el contexto de la ruta antes de que se ejecute el handler.
Los argumentos se transforman y la lógica transversal se ejecuta en un orden consistente.
El handler devuelve JSON, una respuesta primitiva o un resultado view(...).
El adaptador serializa la carga, renderiza una vista o envía el código de estado correspondiente.
Las estrategias JWT o JWE se registran antes del arranque, definiendo callbacks de extracción y validación del token.
CreateApplication() inicializa el ciclo de vida de security y publica los servicios de autenticación en el contenedor.
Authenticated, Auth, Roles y AllowAnonymous decoran rutas y guían las decisiones de los guards.
Una autenticación satisfactoria rellena req.user, req.auth, response locals y el contexto de ejecución de la ruta.
Rendimiento
Las últimas versiones introducen varios mecanismos que reducen significativamente el tiempo de arranque y aceleran el desarrollo local. Funcionan automáticamente una vez instalado el paquete.
En el primer arranque el kernel analiza src/ y escribe .xtask-manifest.json. Los arranques posteriores cargan el manifiesto directamente, omitiendo el escaneo del sistema de archivos y reduciendo el tiempo de arranque un 40–60%.
npm run build genera .xtask-manifest.prebuilt.json en tiempo de compilación. Los arranques en producción cargan este archivo primero, logrando el arranque más rápido posible sin ningún escaneo.
Los archivos descubiertos se importan a través de un pool de semáforos acotado. XTASK_IMPORT_CONCURRENCY (por defecto 10) limita las importaciones en paralelo para evitar la saturación del sistema de archivos. Ajústalo a 16–24 para aplicaciones más grandes.
Las dependencias inyectadas por constructor se envuelven en proxies transparentes y solo se instancian en el primer acceso. El arranque evita crear servicios que nunca se llaman, reduciendo el tiempo de inicio para integraciones opcionales.
En desarrollo, un observador de archivos aplica actualizaciones incrementales al manifiesto. Los archivos modificados se reimportan y se vuelven a registrar en el contenedor sin reiniciar el proceso.
XTASK_IMPORT_CONCURRENCY=16 npm run devUsa XTASK_IMPORT_CONCURRENCY para ajustar las importaciones paralelas y deja que el watcher aplique actualizaciones incrementales sin reiniciar.
npm run build
npm startEl manifiesto precompilado generado durante npm run build se carga primero en cada arranque en producción, omitiendo todo el escaneo.