El blog de Deska
Eliminar dependencias sin usar sin romper producción
Aprende un flujo de trabajo seguro para eliminar dependencias sin usar mediante herramientas automáticas y agentes de IA para mantener estable tu producción.
12 min de lectura
La gestión de una base de código en crecimiento a menudo conduce a un árbol de dependencias desordenado. Con el tiempo, las librerías que antes eran esenciales se vuelven obsoletas, pero permanecen en tu package.json o archivo de requerimientos. La tarea de eliminar dependencias sin usar es fundamental para reducir el tamaño del bundle, mejorar los tiempos de instalación y minimizar la superficie de ataque de seguridad. Sin embargo, la eliminación simple puede ser riesgosa. El software moderno a menudo depende de efectos secundarios o importaciones implícitas que los scripts automatizados podrían omitir. Esta publicación explora una receta técnica para limpiar tu entorno mientras aseguras que tus sistemas de producción sigan funcionales.
El costo del exceso de dependencias
Cada paquete añadido a un proyecto conlleva un costo oculto. Incluso si una librería no se importa activamente en tu código fuente, su presencia en el archivo de bloqueo afecta a todo el ecosistema del proyecto. Los desarrolladores suelen dudar al eliminar entradas porque temen romper un flujo de construcción o una importación dinámica en tiempo de ejecución.
Los riesgos asociados con mantener código muerto incluyen:
- Aumento de la superficie de vulnerabilidad: Cada paquete es un vector potencial para exploits de seguridad.
- Ciclos de CI/CD más lentos: Los ejecutores de compilación deben descargar, extraer y cachear archivos que no tienen utilidad.
- Conflictos de versiones: Los paquetes antiguos pueden bloquear subdependencias en versiones obsoletas, impidiendo que otras librerías se actualicen.
- Sobrecarga del bundle: En proyectos frontend, el tree-shaking no siempre es perfecto. Algunas librerías de utilidad no utilizadas podrían encontrar su camino hacia los activos finales.
Identificación de candidatos para eliminación
El primer paso en cualquier limpieza es el descubrimiento. No puedes confiar únicamente en una búsqueda manual de declaraciones de importación, especialmente en monorepos grandes. Varias herramientas se especializan en el análisis estático para encontrar paquetes huérfanos.
Para proyectos de JavaScript y TypeScript, depcheck es una opción estándar. Analiza el código para ver cómo se utiliza cada dependencia. Las categoriza en dependencias no utilizadas, dependencias faltantes y devDependencies no utilizadas. Aunque es potente, no es infalible. Podría marcar un paquete como no utilizado si solo se referencia en un archivo de configuración o se carga dinámicamente.
En el ecosistema de Python, vulture cumple un propósito similar, encontrando código no utilizado e importaciones sospechosas. Independientemente del lenguaje, el resultado de estas herramientas debe tratarse como una lista de candidatos en lugar de una instrucción absoluta. Debes verificar los hallazgos antes de ejecutar un comando de eliminación.
Una receta de limpieza segura
Para asegurar que estás logrando eliminar dependencias sin usar sin romper producción, sigue un proceso de verificación estructurado. Esto implica crear un ciclo de retroalimentación entre el análisis estático y las pruebas en tiempo de ejecución.
- Ejecuta tu herramienta de análisis estático y redirige la salida a un archivo de texto para su revisión.
- Cruza la lista con tus archivos de configuración. Comprueba si el paquete "no utilizado" es una dependencia de pares o un complemento para tu herramienta de construcción, como Babel o Vite.
- Elimina un paquete a la vez. Las eliminaciones masivas hacen que sea imposible determinar qué cambio específico causó un fallo.
- Ejecuta tu suite de pruebas completa, incluyendo pruebas unitarias, de integración y de extremo a extremo.
- Revisa tus artefactos de construcción. Asegúrate de que el tamaño total haya disminuido como se esperaba y que los puntos de entrada sigan siendo funcionales.
Uso de agentes de IA para auditorías de dependencias
El análisis estático tradicional ignora el contexto de por qué se añadió un paquete. Los agentes de codificación de IA, cuando tienen acceso al espacio de trabajo completo, pueden proporcionar una capa más profunda de validación. Pueden leer la documentación, mirar el historial de commits y entender si una librería se está usando para un caso de borde específico que las herramientas basadas en regex podrían pasar por alto.
Dentro de un entorno flexible como el canvas infinito, puedes ejecutar múltiples agentes lado a lado para verificar el mismo conjunto de paquetes. Si utilizas agentes de codificación como Claude Code o OpenCode, puedes instruirlos para que analicen un panel específico que contenga tu package.json y luego busquen patrones de uso en todo el proyecto.
Este enfoque local-first garantiza que tu código propietario permanezca en tu máquina mientras el agente realiza el trabajo pesado. Puedes abrir un panel de terminal para ejecutar la construcción mientras otro panel muestra el razonamiento del agente. Esta transparencia es vital. Nunca debes permitir que un agente elimine archivos sin tu supervisión. El uso del panel de terminales en tu espacio de trabajo te permite ver la salida exacta de cada comando que el agente sugiere.
Comparación de enfoques automatizados
| Enfoque | Ejemplos de Herramientas | Fortalezas | Debilidades |
|---|---|---|---|
| Análisis Estático | depcheck, vulture | Rápido, objetivo, fácil de automatizar en CI. | Alta tasa de falsos positivos en código dinámico. |
| Auditoría Manual | grep, ripgrep | Alta precisión cuando la realizan expertos. | Consume mucho tiempo en proyectos grandes. |
| Auditoría con Agentes | Claude Code, Codex | Gran conciencia del contexto, entiende la intención. | Requiere tokens de API, necesita supervisión humana. |
| Seguimiento en Ejecución | Stats de Webpack, Profilers | Muestra lo que realmente se ejecutó. | Difícil de configurar para todas las rutas de código. |
Yendo más allá del análisis estático con Deska
El desafío con los IDE tradicionales es que a menudo pierdes el contexto al cambiar entre la terminal, el código y los resultados de una búsqueda. Deska aborda esto permitiéndote organizar tu auditoría de una manera no lineal. Puedes colocar tu package.json en un panel central del editor Monaco y rodearlo con paneles de terminal que ejecuten diferentes herramientas de auditoría.
Si no estás seguro de una librería específica, puedes usar Ask Deska para buscar en tus sesiones o abrir un widget de navegador para consultar la documentación de la librería. Esto te permite verificar si un paquete es necesario para una variable de entorno específica o un polyfill global. Debido a que Deska es una aplicación de escritorio gratuita, puedes mantener estos espacios de trabajo abiertos para tareas de mantenimiento a largo plazo.
Para los desarrolladores que necesitan monitorear pruebas de construcción largas después de una limpieza, la aplicación móvil ofrece una forma segura de verificar el estado de sus sesiones de terminal. No necesitas quedarte en tu escritorio mientras la suite de CI valida tus cambios. Puedes ver si la construcción falló e identificar qué eliminación de paquete causó la ruptura a través del relevo seguro.
FAQ
¿Cómo encontrar dependencias no utilizadas en proyectos de node?
El método más común es usar depcheck o npm-check. Estas herramientas escanean tus importaciones y las comparan con tu package.json. Sin embargo, siempre verifica doblemente los paquetes usados en scripts de construcción o archivos de configuración, ya que el análisis estático suele omitir estas referencias.
¿Es seguro eliminar devDependencies?
Generalmente es más seguro que eliminar dependencias de producción, pero aún puede romper tu flujo de trabajo de desarrollo. Eliminar un linter o un ejecutor de pruebas no hará que tu sitio de producción falle, pero causará que tu flujo de CI/CD falle durante la fase de análisis o de pruebas.
¿Por qué el tamaño de mi bundle sigue igual tras eliminar un paquete?
Esto suele suceder si el paquete ya estaba siendo procesado con éxito por el tree-shaking de tu compilador. Si el código nunca fue importado en un punto de entrada, es probable que el compilador lo ignorara de todos modos. Eliminarlo sigue ayudando al mantener limpio tu node_modules y reducir riesgos de seguridad.
Comienza a limpiar tu espacio de trabajo
Mantener un proyecto ligero es un proceso continuo más que una tarea única. Al integrar agentes y mejores herramientas de visualización en tu flujo de trabajo, puedes manejar la deuda técnica sin el estrés de romper la producción. Para comenzar a organizar tu próxima auditoría de dependencias en un lienzo infinito, puedes descargar la aplicación de escritorio Deska para tu sistema operativo.