- Creado nuevo proyecto Nuxt 4 con estructura app/ - Servidor Colyseus separado para evitar problemas con decoradores - Migrado GameRoom y toda la lógica del juego - Implementado cliente con composables useGameClient - Panel de administración funcional - Componentes Vue migrados (HomeScreen, GameScreen, PlayerCard, etc) - Configuración para ejecutar ambos servidores (npm run dev:all)
8.7 KiB
8.7 KiB
Plan de Migración a Nuxt - SnatchGame
Resumen Ejecutivo
Migración de arquitectura multi-aplicación (Colyseus server + Vue client + Vue admin) a una aplicación unificada Nuxt 3 que maneje servidor, cliente y administración en un solo proyecto.
Análisis de la Arquitectura Actual
Componentes Existentes
-
Servidor Colyseus (Puerto 2567)
- Framework: Colyseus.io v0.16
- GameRoom con lógica de juego
- API REST para admin
- WebSocket para sincronización en tiempo real
-
Cliente Vue (Puerto 3000)
- Vue 3 con Composition API
- Colyseus.js SDK para conexión
- Componentes: Home, Game, Settings, PlayerCard, TradeOfferCard
- Sin build tools (vanilla)
-
Admin Vue (Puerto 3001)
- Vue 3 con dashboard de estadísticas
- SSE (Server-Sent Events) para actualizaciones
- Control total del juego
- Sin build tools (vanilla)
Arquitectura Propuesta Nuxt 3
Estructura del Proyecto
nuxt-snatchgame/
├── server/
│ ├── api/ # API REST endpoints
│ │ ├── admin/ # Admin endpoints
│ │ └── config.ts # Configuración
│ ├── plugins/
│ │ └── colyseus.ts # Integración Colyseus
│ └── rooms/
│ └── GameRoom.ts # Lógica del juego
├── pages/
│ ├── index.vue # Cliente del juego (/)
│ └── admin.vue # Dashboard admin (/admin)
├── components/
│ ├── game/ # Componentes del juego
│ │ ├── PlayerCard.vue
│ │ ├── TradeOfferCard.vue
│ │ ├── MakeOfferForm.vue
│ │ └── OfferModal.vue
│ └── admin/ # Componentes admin
│ ├── StatsCard.vue
│ ├── PlayerList.vue
│ └── ControlPanel.vue
├── composables/
│ ├── useGameClient.ts # Cliente Colyseus
│ └── useAdminService.ts # Servicio admin
├── types/
│ └── game.ts # TypeScript types
├── public/
│ └── assets/ # Imágenes y recursos
├── nuxt.config.ts
└── package.json
Fases de Migración
Fase 1: Setup Inicial (2 horas)
-
Crear proyecto Nuxt 3
npx nuxi@latest init nuxt-snatchgame cd nuxt-snatchgame -
Instalar dependencias necesarias
{ "dependencies": { "nuxt": "^3.x", "@colyseus/core": "^0.16.19", "@colyseus/schema": "^3.0.42", "colyseus": "^0.16.0", "colyseus.js": "^0.16.19" } } -
Configuración base en nuxt.config.ts
- Nitro server configuration
- WebSocket support
- Vue 3 setup
Fase 2: Migración del Servidor Colyseus (3 horas)
-
Integrar Colyseus en Nitro
// server/plugins/colyseus.ts import { Server } from 'colyseus' import { WebSocketTransport } from '@colyseus/ws-transport' import { GameRoom } from '../rooms/GameRoom' export default defineNitroPlugin((nitroApp) => { const gameServer = new Server({ transport: new WebSocketTransport({ server: nitroApp.node.server }) }) gameServer.define('game', GameRoom) .filterBy(['gameMode']) .sortBy({ clients: 1 }) }) -
Migrar GameRoom y tipos
- Copiar GameRoom.ts sin cambios
- Mantener Schema classes
- Adaptar métodos admin
-
API Endpoints
// server/api/admin/stats.get.ts export default defineEventHandler(async (event) => { // Migrar lógica de stats })
Fase 3: Migración del Cliente (3 horas)
-
Página principal del juego
<!-- pages/index.vue --> <template> <div> <HomeScreen v-if="!inGame" @join="joinGame" /> <GameScreen v-else :client="gameClient" /> </div> </template> -
Composable para cliente Colyseus
// composables/useGameClient.ts export const useGameClient = () => { const client = ref<Client | null>(null) const room = ref<Room | null>(null) const connect = async (playerName: string) => { client.value = new Client('ws://localhost:3000') room.value = await client.value.joinOrCreate('game', { playerName }) } return { client, room, connect } } -
Migrar componentes Vue
- Convertir a script setup
- Usar auto-imports de Nuxt
- Mantener lógica existente
Fase 4: Migración del Admin (2 horas)
-
Página admin
<!-- pages/admin.vue --> <template> <AdminDashboard /> </template> -
Servicio SSE con Nitro
// server/api/admin/stream.get.ts export default defineEventHandler(async (event) => { const stream = createEventStream(event) // Enviar stats cada 250ms const interval = setInterval(async () => { const stats = await getGameStats() await stream.push(stats) }, 250) stream.onClosed(() => { clearInterval(interval) }) return stream.send() }) -
Composable admin
// composables/useAdminService.ts export const useAdminService = () => { const stats = ref({}) const connect = () => { const eventSource = new EventSource('/api/admin/stream') eventSource.onmessage = (e) => { stats.value = JSON.parse(e.data) } } return { stats, connect } }
Fase 5: Integración y Testing (2 horas)
-
Configuración de desarrollo
{ "scripts": { "dev": "nuxt dev", "build": "nuxt build", "preview": "nuxt preview" } } -
Variables de entorno
NUXT_PUBLIC_GAME_NAME=SnatchGame NUXT_SERVER_PORT=3000 -
Testing funcional
- Verificar conexión WebSocket
- Probar sincronización de estado
- Validar panel admin
- Test de múltiples jugadores
Consideraciones Técnicas
WebSocket en Nuxt/Nitro
- Nitro soporta WebSocket nativamente
- Colyseus se integra mediante plugin
- Un solo puerto para todo (3000)
Estado Compartido
- Usar Pinia para estado local
- Colyseus para estado sincronizado
- SSE para actualizaciones admin
TypeScript
- Schema-codegen sigue funcionando
- Types compartidos en /types
- Auto-imports de Nuxt
Rutas
/- Cliente del juego/admin- Panel de administración/api/*- API endpoints- WebSocket en el mismo puerto
Simplificaciones MVP
- Sin autenticación - Solo nombres de usuario
- Sin base de datos - Todo en memoria
- Sin Docker - Deploy directo con Node
- Sin HTTPS - Solo HTTP/WS local
- Sin optimizaciones - Código simple y directo
Ventajas de la Migración
- Un solo proyecto - Más fácil de mantener
- Un solo puerto - Simplifica deployment
- Hot reload completo - Mejor DX
- Auto-imports - Menos boilerplate
- TypeScript integrado - Mejor tooling
- SSR opcional - Mejor SEO si necesario
Riesgos y Mitigaciones
| Riesgo | Mitigación |
|---|---|
| WebSocket en Nitro no probado | Usar h3-ws o plugin dedicado |
| Colyseus incompatible | Mantener servidor separado si falla |
| Performance SSE | Usar WebSocket para admin también |
| Complejidad aumenta | Mantener arquitectura simple |
Cronograma Estimado
- Día 1: Setup + Servidor (5 horas)
- Día 2: Cliente + Admin (5 horas)
- Día 3: Testing + Ajustes (2 horas)
Total: ~12 horas de desarrollo
Comando para Iniciar
# Desarrollo
npm run dev
# Producción
npm run build
npm run preview
Estructura de Datos del Juego
Juegos (5 rondas totales)
- Sin reglas - Ofrecer/Aceptar/Rechazar/Robar sin castigo
- Reglas contraproducentes - Jugador 2 puede forzar oferta
- Fichas de vergüenza - Visible para siguiente contrincante
- Derechos mínimos - Sistema castiga robos denunciados
- Comunicación abierta - Jugadores pueden hablar
Mecánicas Core
- 3 rondas por juego (solo la 3ra cuenta)
- Roles: Jugador 1 / Jugador 2
- Contrincantes aleatorios
- Sin comunicación (excepto juego 5)
- Auto-increment para nombres duplicados
Decisiones de Diseño
- Nuxt sobre Next.js - Mejor integración Vue
- Nitro server - WebSocket nativo
- Sin build tools en components - Usar SFC de Nuxt
- Colyseus integrado - No servidor separado
- SSE para admin - Mantener patrón actual
Próximos Pasos
- ✅ Aprobar plan de migración
- ⏳ Crear proyecto Nuxt base
- ⏳ Migrar servidor Colyseus
- ⏳ Migrar cliente Vue
- ⏳ Migrar admin Vue
- ⏳ Testing integral
- ⏳ Deploy local