Mi nuevo stack favorito Nuxt 4 Nuxt UI MongoDB y Quarkus
Hola, desarrolladores! Hoy quiero compartirles mi experiencia con un stack tecnológico que ha transformado completamente mi forma de construir aplicaciones web: Nuxt 4 + Nuxt UI + MongoDB + Quarkus.
Este stack representa, para mí, la combinación perfecta entre rendimiento extremo, experiencia de desarrollador excepcional y flexibilidad para adaptarse a cualquier tipo de proyecto. En este artículo te explicaré por qué cada tecnología es indispensable en mi caja de herramientas.
Por qué este stack es mi favorito
Antes de entrar en los detalles técnicos, quiero compartir las razones por las que elegí este stack:
- Velocidad de desarrollo: Puedo prototipar ideas en horas, no días
- Rendimiento de producción: Las aplicaciones finales son rápidas y eficientes
- Curva de aprendizaje accesible: Cada tecnología tiene excelente documentación
- Ecosistema maduro: Comunidades activas y herramientas bien establecidas
- Flexibilidad: Puedo construir desde APIs simples hasta sistemas complejos
Nuxt 4: El framework Vue que redefine el desarrollo web
Nuxt 4, lanzado oficialmente el 15 de julio de 2025, representa una evolución significativa en el ecosistema Vue. Esta versión se centra en la estabilidad y una experiencia de desarrollador mejorada que marca una diferencia palpable en el día a día.
Organización de proyecto optimizada
La nueva estructura de directorios de Nuxt 4 coloca todo el código de la aplicación en el directorio app/, separándolo claramente de node_modules/ y .git/. Esta separación no es solo estética: resulta en observadores de archivos más rápidos, especialmente en Windows y Linux, y brinda a tu IDE mejor contexto para el autocompletado.
mi-app/
├─ app/
│ ├─ assets/
│ ├─ components/
│ ├─ pages/
│ └─ app.vue
├─ shared/
├─ server/
└─ nuxt.config.tsRendimiento que se siente
Las mejoras de rendimiento en Nuxt 4 son notables desde el primer momento:
- Modo Turbo: Compilaciones hasta 10 veces más rápidas
- Cold start del servidor: Reducción del 52% respecto a Nuxt 3 (~2.3s → ~1.1s)
- Comunicación por sockets: Eliminación de la sobrecarga de puertos de red
- Servidor Edge nativo: Despliegues cercanos al usuario para latencia mínima
Data fetching inteligente
Las primitivas useAsyncData y useFetch ahora comparten datos automáticamente entre componentes que utilizan la misma clave, realizan limpieza automática al desmontarse y ofrecen mayor control sobre el caché.
// Ejemplo de data fetching optimizado
const { data: productos } = await useAsyncData(
'productos',
() => $fetch('/api/productos'),
{
server: true,
default: () => [],
transform: (data) => data.map(p => ({...p, precioFormateado: formatCurrency(p.precio)}))
}
)Nuxt UI v4: Diseño profesional sin costo
Nuxt UI v4, lanzado en septiembre de 2025, unifica lo que antes era Nuxt UI y Nuxt UI Pro en una única librería open-source bajo licencia MIT. Esta decisión democratizó el acceso a componentes de calidad profesional.
Más de 110 componentes accesibles
La librería ofrece más de 110 componentes listos para producción, incluyendo:
- Componentes de formularios: Inputs, selects, checkboxes, radios
- Componentes de navegación: Menús, breadcrumbs, paginación
- Componentes de layout: Cards, modales, sidebars, accordions
- Componentes de datos: Tablas, listas, grids
- Componentes de feedback: Toasts, alerts, progress, skeleton loaders
Tecnologías base modernas
Nuxt UI v4 se construye sobre pilares tecnológicos sólidos:
- Tailwind CSS v4: Construcciones hasta 5 veces más rápidas
- Reka UI: Conformidad WAI-ARIA para accesibilidad robusta
- Tailwind Variants: Theming con tipado completo de TypeScript
Ejemplo práctico con Nuxt UI
<template>
<UContainer class="py-8">
<UCard>
<template #header>
<h1 class="text-2xl font-bold">Gestión de Usuarios</h1>
</template>
<UTable :rows="usuarios" :columns="columnas">
<template #acciones-data="{ row }">
<UButton
icon="i-heroicons-pencil"
size="sm"
color="primary"
variant="ghost"
@click="editar(row)"
/>
</template>
</UTable>
<template #footer>
<div class="flex justify-between items-center">
<span class="text-sm text-gray-500">
{{ usuarios.length }} usuarios encontrados
</span>
<UPagination
v-model="pagina"
:total="total"
:page-count="10"
/>
</div>
</template>
</UCard>
</UContainer>
</template>
<script setup lang="ts">
const usuarios = ref([])
const pagina = ref(1)
const total = ref(100)
const columnas = [
{ key: 'nombre', label: 'Nombre' },
{ key: 'email', label: 'Email' },
{ key: 'role', label: 'Rol' },
{ key: 'acciones', label: 'Acciones' }
]
async function cargarUsuarios() {
const { data } = await useFetch('/api/usuarios', {
query: { pagina: pagina.value }
})
usuarios.value = data.value
}
</script>MongoDB: La base de datos flexible para el desarrollo moderno
MongoDB se ha convertido en mi opción predeterminada para aplicaciones que requieren flexibilidad en el esquema y velocidad de desarrollo. Su modelo de documentos JSON se integra perfectamente con JavaScript y TypeScript.
Flexibilidad de esquema
A diferencia de las bases de datos relacionales, MongoDB permite evolucionar el esquema sin migraciones complejas. Esto es ideal para:
- Prototipado rápido donde los requisitos cambian frecuentemente
- Aplicaciones con datos semi-estructurados
- Sistemas que manejan diferentes tipos de documentos
- Desarrollos ágiles donde las iteraciones son frecuentes
Integración natural con el stack
La integración de MongoDB con Nuxt y Quarkus es fluida:
// Conexión con Mongoose en Nuxt
import mongoose from 'mongoose'
export default defineNitroPlugin(async (nitroApp) => {
if (!mongoose.connection.readyState) {
await mongoose.connect(process.env.MONGODB_URI)
}
})
// Schema de ejemplo
const usuarioSchema = new mongoose.Schema({
nombre: String,
email: { type: String, unique: true },
role: { type: String, enum: ['admin', 'user', 'editor'] },
preferencias: {
tema: String,
notificaciones: Boolean
},
creadoEn: { type: Date, default: Date.now }
})
// Indices para optimización
usuarioSchema.index({ email: 1 })
usuarioSchema.index({ creadoEn: -1 })Rendimiento y escalabilidad
MongoDB ofrece características que lo hacen ideal para aplicaciones modernas:
- Índices compuestos: Consultas eficientes sobre múltiples campos
- Aggregation Pipeline: Transformaciones de datos poderosas
- Text Search: Búsqueda de texto completo integrada
- Change Streams: Tiempo real para actualizaciones
- Horizontal Scaling: Sharding para escalar horizontalmente
Quarkus: Java supercargado para la nube
Quarkus representa la evolución de Java para el desarrollo cloud-native. Su enfoque "supersonic subatomic" entrega tiempos de inicio increíblemente rápidos y bajo consumo de memoria, características esenciales para arquitecturas de microservicios.
Rendimiento que impresiona
Los benchmarks de 2025 demuestran las capacidades de Quarkus:
| Métrica | Valor |
|---|---|
| Cold Start (modo nativo) | ~50ms |
| RSS Memory | ~12MB |
| Latencia P99 | ~95ms |
| Heap Utilizado | ~3.2MB |
Estos números hacen que Quarkus sea ideal para funciones serverless y contenedores en Kubernetes donde el inicio rápido y el bajo consumo de recursos son críticos.
Desarrollo en modo JVM y nativo
Quarkus ofrece lo mejor de ambos mundos:
- Modo JVM: Ideal para desarrollo rápido con hot-reload
- Modo nativo: Compilación a ejecutable nativo para producción
// Ejemplo de REST API con Quarkus
@Path("/api/productos")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ProductoResource {
@Inject
ProductoService service;
@GET
@Operation(summary = "Listar productos", description = "Retorna todos los productos")
public Response listar(
@QueryParam("page") @DefaultValue("0") int page,
@QueryParam("size") @DefaultValue("20") int size) {
List<Producto> productos = service.listar(page, size);
return Response.ok(productos).build();
}
@POST
@Operation(summary = "Crear producto")
public Response crear(ProductoDTO dto) {
Producto producto = service.crear(dto);
return Response.status(Status.CREATED)
.entity(producto)
.build();
}
}Integración con MongoDB
Quarkus ofrece MongoDB panache para simplificar el acceso a datos:
// Entity con Panache
@Entity
public class Producto extends PanacheMongoEntity {
public String nombre;
public String descripcion;
public BigDecimal precio;
public Integer stock;
public String categoria;
public LocalDateTime creadoEn;
// Consultas estáticas
public static List<Producto> findByCategoria(String categoria) {
return list("categoria", categoria);
}
public static List<Producto> findActivos() {
return list("stock > 0");
}
public static long countByCategoria(String categoria) {
return count("categoria", categoria);
}
}
// Repository
@ApplicationScoped
public class ProductoRepository implements PanacheMongoRepository<Producto> {
public List<Producto> buscarConStock(int pagina, int tamanho) {
return find("stock > 0")
.page(pagina, tamanho)
.list();
}
public Optional<Producto> buscarPorCodigo(String codigo) {
return find("codigo", codigo).firstResultOptional();
}
}Integración del stack completo
La verdadera magia de este stack emerge cuando todas las piezas trabajan juntas. Aquí te muestro cómo conectar cada componente:
Arquitectura general
┌─────────────────────────────────────────────────────────┐
│ Nuxt 4 (Frontend) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Nuxt UI v4 │ │ Pages/Views│ │ API Client │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼ HTTP/REST/gRPC
┌─────────────────────────────────────────────────────────┐
│ Quarkus (Backend) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ REST API │ │ Services │ │ MongoDB Panache │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ MongoDB │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Productos │ │ Usuarios │ │ Órdenes │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘Ejemplo de implementación completa
Configuración de Nuxt:
// nuxt.config.ts
export default defineNuxtConfig({
modules: [
'@nuxt/ui',
'@nuxtjs/mdc',
'@pinia/nuxt'
],
runtimeConfig: {
public: {
apiBase: process.env.NUXT_PUBLIC_API_BASE || '/api'
}
},
ui: {
global: true,
icons: ['heroicons', 'simple-icons']
},
devtools: { enabled: true }
})API Client centralizado:
// composables/useApi.ts
export const useApi = () => {
const config = useRuntimeConfig()
const client = $fetch.create({
baseURL: config.public.apiBase,
headers: {
'Content-Type': 'application/json'
},
timeout: 30000
})
return {
get: <T>(url: string, options?: object) =>
client<T>(url, { method: 'GET', ...options }),
post: <T>(url: string, body: object, options?: object) =>
client<T>(url, { method: 'POST', body, ...options }),
put: <T>(url: string, body: object, options?: object) =>
client<T>(url, { method: 'PUT', body, ...options }),
delete: <T>(url: string, options?: object) =>
client<T>(url, { method: 'DELETE', ...options })
}
}Comparativa de rendimiento
Para demostrar las capacidades de este stack, aquí tienes una comparativa de métricas:
Frontend (Nuxt 4)
| Métrica | Valor | Benchmark |
|---|---|---|
| First Contentful Paint | ~1.2s | 33% más rápido que Nuxt 3 |
| Largest Contentful Paint | ~1.9s | 34% más rápido que Nuxt 3 |
| Cumulative Layout Shift | ~0.08 | 47% mejor que Nuxt 3 |
| Build Time | ~18s | 60% más rápido que Nuxt 3 |
Backend (Quarkus nativo)
| Métrica | Valor | Benchmark |
|---|---|---|
| Cold Start | ~50ms | Liderando frameworks Java |
| Memory RSS | ~12MB | Ideal para contenedores |
| Latencia P99 | ~95ms | Rendimiento consistente |
| Throughput | ~50K req/s | Alta concurrencia |
Casos de uso ideales
Este stack brilla en los siguientes escenarios:
Aplicaciones web modernas
Cuando necesitas una interfaz de usuario atractiva con componentes accesibles y bien diseñados, Nuxt UI proporciona todo lo necesario sin reinventar la rueda.
APIs de alto rendimiento
Quarkus entrega tiempos de respuesta ultrarrápidos con bajo consumo de recursos, perfecto para microservicios y funciones serverless.
Sistemas con datos flexibles
MongoDB se adapta a cambios de requisitos sin migraciones complejas, ideal para startups y proyectos en evolución.
Aplicaciones globales
La combinación de Nuxt Edge y Quarkus permite desplegar servicios cerca de los usuarios, minimizando latencia.
Conclusión: La combinación perfecta
Mi stack favorito Nuxt 4 + Nuxt UI + MongoDB + Quarkus representa para mí el equilibrio ideal entre:
- Desarrollo rápido: Herramientas que potencian la productividad
- Rendimiento extremo: Aplicaciones que respondan en milisegundos
- Calidad de código: Tipado robusto y arquitectura limpia
- Experiencia de usuario: Interfaces accesibles y atractivas
- Escalabilidad: Capacidad de crecer con el proyecto
Cada tecnología en este stack complementa a las demás, creando un ecosistema cohesivo que hace que desarrollar sea un placer. La documentación excelente, comunidades activas y herramientas maduras hacen que la curva de aprendizaje sea manejable y el mantenimiento a largo plazo sea predecible.
Recursos adicionales: