Instalación
Requisitos
Section titled “Requisitos”- Node.js 24.13 o superior.
- TypeScript, con los decoradores estándar de JavaScript.
- Express 5, que instalas junto a viga.
Instala viga
Section titled “Instala viga”viga usa Express por debajo, así que lo instalas tú junto al framework. Como dependencias de desarrollo, añade TypeScript, tsx para ejecutar la app mientras programas, y los tipos de Express y de Node.js.
pnpm add viga expresspnpm add -D typescript tsx @types/express @types/nodenpm install viga expressnpm install -D typescript tsx @types/express @types/nodeyarn add viga expressyarn add -D typescript tsx @types/express @types/nodebun add viga expressbun add -d typescript tsx @types/express @types/nodeConfigura TypeScript
Section titled “Configura TypeScript”Crea un tsconfig.json en la raíz del proyecto:
{ "compilerOptions": { "target": "ES2024", "lib": ["ES2024", "ESNext.Decorators"], "module": "nodenext", "moduleResolution": "nodenext", "rewriteRelativeImportExtensions": true, "strict": true, "skipLibCheck": true, "outDir": "dist", "rootDir": "src" }, "include": ["src"]}ESNext.Decoratorsañade los tipos de los decoradores estándar.- Con
rewriteRelativeImportExtensions, los imports entre tus propios archivos llevan su extensión real, comoimport { BooksService } from './books.service.ts', ytscla cambia a.jsal compilar. Los paquetes se importan por su nombre, sin extensión:import { createApp } from 'viga'.
Configura el proyecto
Section titled “Configura el proyecto”viga es un paquete de módulos ES, así que tu proyecto también debe serlo. En tu package.json, añade "type": "module" y los scripts para desarrollar, compilar y arrancar:
{ "type": "module", "scripts": { "dev": "tsx watch src/main.ts", "build": "tsc", "start": "node dist/main.js" }}devejecuta la app contsxy la reinicia cada vez que guardas un archivo.buildcompila el proyecto a JavaScript en la carpetadist.startarranca la versión compilada, la que usarás en producción.
Por qué hace falta compilar
Section titled “Por qué hace falta compilar”Node.js puede ejecutar archivos TypeScript quitando los tipos, pero todavía no entiende los decoradores: node src/main.ts falla en el primer @. Por eso, mientras desarrollas, tsx transforma los decoradores al vuelo, y para producción tsc genera JavaScript que Node.js ejecuta directamente.
Importar sin extensión
Section titled “Importar sin extensión”La configuración anterior usa módulos ES, el formato estándar de Node.js, que exige la extensión en los imports entre tus archivos. Si prefieres escribirlos sin extensión, como en NestJS, tienes dos alternativas.
Con un empaquetador. tsc solo comprueba los tipos y un empaquetador como esbuild genera el JavaScript, resolviendo los imports por ti. Instala esbuild como dependencia de desarrollo y cambia estas opciones en tu tsconfig.json:
{ "compilerOptions": { "module": "preserve", "moduleResolution": "bundler", "noEmit": true }}Y el script build de tu package.json:
{ "scripts": { "build": "tsc && esbuild src/main.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/main.js" }}Con CommonJS, el formato que usa NestJS. Quita "type": "module" de tu package.json, y tsc generará require(...), que no necesita extensión. Funciona porque Node.js 24 puede cargar con require paquetes de módulos ES como viga. CommonJS no permite await fuera de una función, así que el arranque va dentro de una:
import { createApp } from 'viga';import { AppModule } from './app.module';
async function bootstrap() { const app = createApp({ rootModule: AppModule, globalPrefix: '/api' }).enableShutdownHooks(); await app.listen();}
void bootstrap();Ten en cuenta que CommonJS es el formato antiguo de Node.js y que algunos paquetes nuevos ya solo se publican como módulos ES.
Paquetes de los módulos opcionales
Section titled “Paquetes de los módulos opcionales”El núcleo y la mayoría de los módulos opcionales no necesitan nada más. Algunos dependen de paquetes que instalas solo si los usas:
| Módulo | Paquetes que necesita |
|---|---|
viga/validation |
Una librería compatible con Standard Schema, como zod, valibot o arktype |
viga/drizzle |
drizzle-orm y pg, y @types/pg como dependencia de desarrollo |
viga/websocket |
ws, si usas el adaptador por defecto |
Los instalas igual que viga, con tu gestor de paquetes.