El blog de Deska
Cómo encontrar exports sin usar y archivos muertos
Aprende a limpiar tu código identificando exports sin usar y archivos muertos mediante análisis estático y agentes de IA en un canvas local.
· 10 min de lectura
La gestión de una base de código en crecimiento conlleva inevitablemente la acumulación de deuda técnica, específicamente en forma de código inalcanzable. Cómo encontrar exports sin usar y archivos muertos es una tarea de mantenimiento crítica que mejora los tiempos de compilación, reduce el tamaño de los bundles y disminuye la carga cognitiva de los desarrolladores que navegan por el proyecto. Aunque los bundlers modernos realizan tree shaking para excluir el código no utilizado en las versiones de producción, los archivos fuente suelen quedar repletos de funciones, constantes y componentes enteros que ya no están referenciados en ninguna parte de la aplicación.
El costo del código muerto en proyectos modernos
El código muerto es más que un simple problema de orden. Tiene impactos tangibles en el ciclo de vida del desarrollo que van más allá del simple espacio en disco.
Cuando un repositorio contiene cientos de exports sin usar, los resultados de grep se vuelven ruidosos y los autocompletados del IDE sugieren utilidades obsoletas. Los nuevos miembros del equipo pueden pasar horas intentando comprender un módulo complejo solo para darse cuenta de que no es utilizado por ningún punto de entrada. Además, los archivos muertos siguen contribuyendo al tiempo que tardan el linting, la comprobación de tipos y el escaneo de seguridad en los pipelines de CI/CD.
Identificar estos archivos manualmente es propenso a errores. Un archivo puede parecer no utilizado porque no tiene imports, pero podría ser un archivo de configuración o un punto de entrada dinámico. Por el contrario, un archivo puede estar importado pero solo exportar miembros que nunca se llaman.
Análisis estático frente a análisis en tiempo de ejecución
Existen dos formas principales de detectar código huérfano.
Análisis estático
Este enfoque examina el código fuente sin ejecutarlo. Las herramientas analizan el Árbol de Sintaxis Abstracta (AST) para mapear las relaciones entre imports y exports. Es el método más común para encontrar exports sin usar. Es rápido y seguro, pero puede tener dificultades con los imports dinámicos o el código al que se hace referencia mediante plantillas de cadena.
Análisis en tiempo de ejecución
Esto implica monitorear qué archivos se cargan realmente durante la ejecución, ya sea en un entorno de desarrollo o mediante telemetría de producción. Aunque es muy preciso para identificar archivos realmente muertos, es difícil de configurar y puede ser engañoso si ciertas rutas de código solo se activan durante eventos anuales específicos o casos de borde poco comunes.
Para la mayoría de los equipos, el análisis estático es el punto de partida preferido debido a su previsibilidad y facilidad de integración en el flujo de trabajo de desarrollo local-first.
Herramientas y técnicas para encontrar exports sin usar
Existen varias herramientas especializadas para ayudar a los desarrolladores a automatizar la detección de código muerto.
- Knip: Actualmente es una de las herramientas más potentes para el ecosistema JavaScript. Identifica dependencias no utilizadas, exports sin usar y miembros de clase no utilizados.
- Ts-prune: Una herramienta enfocada para proyectos TypeScript que genera una lista de exports sin usar.
- Depcheck: Útil para encontrar paquetes no utilizados en tu package.json, aunque menos enfocada en los exports de archivos internos.
| Herramienta | Enfoque principal | Mejor caso de uso |
|---|---|---|
| Knip | Exports y Dependencias | Monorepos grandes y proyectos TS complejos |
| ts-prune | Exports de TypeScript | Comprobaciones rápidas en apps TS pequeñas |
| ESLint | Variables sin usar | Limpieza de alcance de archivo local al programar |
Aprovechando agentes de IA para la limpieza de código
Las herramientas de análisis estático tradicionales son excelentes para reportar problemas, pero dejan la limpieza en manos del desarrollador. Aquí es donde los agentes de programación con IA cambian el flujo de trabajo. Al ejecutar agentes como Claude Code o Codex CLI dentro de un entorno dedicado, puedes pasar de la detección a la resolución mucho más rápido.
En Deska, puedes organizar tu espacio de trabajo para manejar esta tarea de manera eficiente. Puedes tener un panel de terminal ejecutando Knip en una esquina del canvas, mientras que un panel de agente de IA se sitúa al lado. Dado que Deska es local-first, el agente tiene acceso directo a tus archivos sin que estos se suban a un servidor de terceros.
El flujo de trabajo suele seguir estos pasos:
- Ejecutar una herramienta de análisis estático en un panel de terminal para generar una lista de exports muertos.
- Usar Ask Deska para abrir los archivos relevantes en los paneles del editor Monaco.
- Pedir a un agente de IA que verifique los hallazgos de la herramienta. Esto es importante porque las herramientas a veces marcan archivos que son necesarios para configuraciones de compilación específicas.
- Instruir al agente para que elimine los exports y actualice cualquier referencia interna.
Este enfoque de trabajo lado a lado asegura que mantengas el control. Puedes alejar el zoom en el canvas para ver la salida de la terminal y los cambios de código simultáneamente. Si necesitas alejarte, puedes usar la aplicación mobile para monitorear el progreso de un análisis de larga duración o un script de eliminación por lotes a través del relay seguro.
Manejo de falsos positivos
Ninguna herramienta es perfecta. El análisis estático a menudo marca falsos positivos en los siguientes escenarios:
- APIs públicas: Si estás construyendo una librería, tus exports están destinados a consumidores externos y no se usarán dentro de tu propio repo.
- Imports dinámicos: El código cargado a través de
import(\./${path}\)suele ser invisible para los rastreadores estáticos. - Puntos de entrada de frameworks: Archivos como
tailwind.config.jsovitest.setup.tsson llamados por binarios externos, no por tu código fuente.
Para gestionar esto, la mayoría de las herramientas permiten un archivo de configuración donde puedes definir una lista blanca de patrones específicos. Al usar agentes, puedes proporcionar estas restricciones en el prompt del sistema para evitar que eliminen archivos de configuración esenciales.
Integrando la limpieza en tu flujo de trabajo
La higiene del código no debe ser un evento que ocurra una vez al año. Es más efectivo cuando se integra en el ciclo regular de desarrollo.
- Integración en CI: Ejecuta una comprobación de exports sin usar como parte de tu pipeline de pull request. Establece un umbral o simplemente reporta los hallazgos como un comentario.
- Auditorías mensuales: Dedica una hora al mes usando una terminal para ejecutar un escaneo completo del proyecto.
- Eliminación de funciones: Cuando una funcionalidad queda obsoleta, no solo elimines el punto de entrada. Usa el command palette para encontrar y eliminar todos los exports asociados que ahora han quedado huérfanos.
Al mantener un espacio de trabajo limpio, todo el equipo se beneficia de greps más rápidos y una comprensión más clara de la arquitectura. El uso de un entorno visual como Deska te permite gestionar estas refactorizaciones complejas manteniendo todo el contexto necesario visible en un solo canvas.
FAQ
¿Cómo encontrar exports sin usar en TypeScript?
La forma más efectiva es usar una herramienta como Knip o ts-prune. Estas herramientas analizan tu tsconfig.json y mapean todo el gráfico de tu proyecto para identificar exports que no tienen sentencias de importación correspondientes en otros archivos.
¿Es seguro eliminar archivos muertos automáticamente?
Generalmente es seguro para el código interno de la aplicación, pero arriesgado para librerías o proyectos que usan mucha reflexión e imports dinámicos. Siempre ejecuta tu suite de pruebas después de una eliminación masiva y usa un sistema de control de versiones para revertir cualquier eliminación accidental.
¿Pueden los agentes de IA encontrar código muerto?
Sí, los agentes de IA pueden ser muy efectivos identificando código muerto al recorrer tu sistema de archivos. Son particularmente buenos para entender el contexto que el análisis estático podría pasar por alto, aunque funcionan mejor cuando se combinan con herramientas tradicionales para asegurar una cobertura del 100%.
Comienza con Deska
Si estás listo para limpiar tu base de código, Deska proporciona el entorno perfecto para ejecutar herramientas de análisis y agentes de IA juntos. Puedes descargar la aplicación para Mac, Windows o Linux y empezar a organizar tus tareas de refactorización en un canvas infinito.