Calidad de código
Auditoría de deuda técnica en un proyecto frontend Vue: caso real con Sentry, knip y eslint
Cómo realizar una auditoría completa de deuda técnica en un proyecto frontend con Vue, analizando errores de producción (Sentry), tipado débil, código muerto y dependencias desactualizadas.
La deuda técnica es como la deuda financiera: no es mala en sí misma, pero si no la gestionas, los intereses te devoran. Este artículo documenta una auditoría real de un proyecto Vue en producción, con herramientas concretas y hallazgos clasificados por prioridad.
Metodología de auditoría
Analizamos el proyecto desde cuatro ángulos:
- Errores en producción → Sentry
- Tipado y calidad estática → TypeScript + ESLint
- Código muerto → knip
- Dependencias desactualizadas → npm audit + revisión manual
1. Errores en producción (Sentry)
Vista general
- 24 incidencias sin resolver en los últimos 90 días
- Filtro usado:
is:unresolved lastSeen:-90dordenado por frecuencia
Clasificación por prioridad
P0 — Impacto alto / repetitivas
| Issue | Eventos | Descripción |
|---|---|---|
| Error en detalle | 16 eventos | AxiosError 500 en flujo de detalle — afecta estabilidad funcional |
| Error en tabla | 10 eventos | focusedHeader undefined en AG Grid al interactuar con filtros |
| Error de assets | 226 eventos | Unable to preload CSS — problema de bundle/deploy |
P1 — Fallos funcionales
| Issue | Eventos | Descripción |
|---|---|---|
| Reset password | 7 eventos | .validate is not a function — método inexistente en el componente |
| Búsquedas | Varios | Errores null sobre operaciones de strings/columnas |
| Reportes | Varios | postMessage sobre null, variable no inicializada |
P2 — Resiliencia de red
- Fallos de
fetchcontra servicios de terceros (Product Fruits, módulos dinámicos) - Fallos de preload de CSS en despliegues
Lección clave
Los errores de Sentry son la voz del usuario que no se queja. Muchas veces asumimos que “funciona” porque nadie reporta bugs, pero Sentry demuestra lo contrario.
2. Tipado y calidad estática
Hallazgos
- Presencia de
@ts-ignoreen componentes críticos - Uso de
eslint-disableen tests y bootstrap - Uso abundante de
anyen:- Plugins (axios interceptors)
- Utilidades (i18n helpers)
- Componentes de tabla
- Tests utilities
Impacto real
// ❌ Esto compila y parece funcionar, pero:
const data: any = await fetchData();
data.nonExistentProperty.map(...); // 💥 Runtime error
El tipado débil genera:
- Errores silenciosos que solo se detectan en producción
- Peor autocompletado y contratos difusos
- Mayor riesgo de regresiones en refactors
Solución propuesta
- Activar
strict: trueentsconfig.jsonprogresivamente - Reemplazar
anypor tipos específicos empezando por las capas de datos - Eliminar
@ts-ignorereemplazándolos por tipos correctos - Configurar reglas de ESLint para bloquear nuevos
any
3. Código muerto (knip)
knip analiza tu proyecto y detecta:
- Archivos no importados
- Exports no utilizados
- Dependencias instaladas pero no usadas
- Scripts de package.json sin uso
Hallazgos
Se encontraron múltiples archivos, exports y dependencias sin uso que incrementan la complejidad y el tiempo de mantenimiento.
Acción
npx knip --reporter compact
Ejecutar knip periódicamente (idealmente en CI) para evitar acumulación.
4. Dependencias desactualizadas
| Dependencia | Versión actual | Última versión | Riesgo |
|---|---|---|---|
| Vite | Anterior | Major upgrade | Breaking changes en config |
| Vitest | Anterior | Major upgrade | Breaking changes en config |
| Sentry | Anterior | Major upgrade | API changes |
| AG Grid | Anterior | Major upgrade | Breaking changes si migras |
| Vuetify | Anterior | Minor/Patch | Generalmente seguro |
| Vue Router | Anterior | Major upgrade | API changes |
Plan de acción priorizado
Fase 1: Estabilización (1-2 semanas)
- Resolver issues P0 de Sentry
- Eliminar
@ts-ignoreen componentes críticos - Actualizar dependencias con patches disponibles
Fase 2: Limpieza (2-3 semanas)
- Ejecutar knip y eliminar código muerto
- Reemplazar
anyen capas de datos y plugins - Resolver issues P1 de Sentry
Fase 3: Modernización (1-2 meses)
- Actualizar dependencias mayores (Vite, Vitest, Sentry)
- Activar strict mode en TypeScript
- Configurar CI para bloquear regresiones
Fase 4: Prevención (ongoing)
- knip en CI para código muerto
- Regla ESLint para
any→ error - Dashboard de Sentry con alertas
- Revisión trimestral de dependencias
Conclusiones
- La deuda técnica se mide, no se estima: herramientas como Sentry, knip y eslint dan datos objetivos.
- Los errores de producción son la prioridad #1: 226 eventos de un mismo error es inaceptable.
anyes deuda técnica silenciosa: cadaanyes un test que no escribiste.- El código muerto tiene coste: confunde a los nuevos miembros, aumenta el bundle y dificulta refactors.
- Las actualizaciones son más baratas hoy que mañana: cuanto más esperes, más breaking changes acumulas.