Eliminando archivos y dependencias no utilizados con Knip
Todo proyecto de JavaScript y TypeScript acumula desorden con el tiempo: una dependencia instalada para un experimento rápido, un archivo de utilidades que quedó tras una refactorización, una función exportada que ya nadie importa. De forma individual, parecen inofensivos. En conjunto, ralentizan las compilaciones, inflan node_modules, generan ruido de seguridad y dificultan la navegación por el código.
La respuesta tradicional es una auditoría manual: hacer grep de los nombres de paquetes, buscar referencias a archivos, revisar package.json a mano. Funciona, pero no escala. Aquí es donde entra Knip.
Puntos clave
- Las dependencias no utilizadas y el código muerto aumentan los tiempos de compilación, inflan los bundles y generan ruido de seguridad y licencias.
- Knip analiza todo tu repositorio como un linter a nivel de proyecto, reportando archivos, exports, dependencias no utilizadas e imports no declarados.
- La opción
--fixaplica limpiezas automáticas, mientras que--allow-remove-filesextiende esto a la eliminación de archivos no utilizados. - Ejecutar Knip en CI ayuda a prevenir la acumulación de código muerto y complementa a ESLint y tu formateador.
Por qué vale la pena corregir las dependencias no utilizadas y el código muerto
Los paquetes no utilizados en package.json no son solo ruido cosmético. Estos:
- Aumentan el tiempo de instalación y el uso de disco de
node_modules - Pueden terminar en los bundles de producción si tu bundler no realiza tree-shaking correctamente
- Disparan falsas alertas de seguridad en herramientas como Dependabot
- Pueden incluir licencias restrictivas que técnicamente se aplican a tu proyecto
- Arrastran dependencias transitivas con los mismos problemas
El código muerto tiene costes similares. Los exports no utilizados y los archivos sin referencias dificultan comprender lo que realmente hace un código base, y ralentizan los linters y los verificadores de tipos que de todos modos deben procesarlos.
Qué hace Knip de forma diferente
Herramientas como depcheck y ts-prune abordaban partes de este problema, pero ambos proyectos fueron archivados en 2025. Knip surgió como un reemplazo moderno que combina el análisis de dependencias, exports y archivos en una sola herramienta con mantenimiento activo.
Piensa en Knip como un linter a nivel de proyecto. Mientras que ESLint revisa archivos individuales, Knip analiza todo el repositorio en conjunto: puntos de entrada, grafos de importación, exports y package.json. Reporta archivos no utilizados, exports no utilizados, dependencias no utilizadas y paquetes que se importan pero faltan en package.json.
Knip funciona con npm, pnpm, Yarn y Bun, y requiere Node.js 20.19+ o Bun para ejecutarse.
Empezando en cinco minutos
Inicializa Knip en tu proyecto con:
npm init @knip/config
Esto crea un archivo de configuración knip.json con valores predeterminados razonables. Luego ejecuta el análisis:
npx knip
Knip genera un reporte agrupado por tipo de problema: archivos no utilizados, exports no utilizados, dependencias no utilizadas y dependencias no declaradas. En una primera ejecución sobre un proyecto antiguo, la lista puede ser larga; es lo esperable.
Discover how at OpenReplay.com.
Aplicando correcciones de forma segura
Una vez que hayas revisado el reporte y parezca correcto, Knip puede aplicar correcciones automáticas revisables:
npx knip --fix
Esto elimina las palabras clave export de los exports no utilizados, limpia package.json y gestiona los re-exports y los miembros de enum de TypeScript. Para eliminar también los archivos no utilizados:
npx knip --fix --allow-remove-files
Siempre revisa los cambios en Git antes de hacer commit. Knip es conservador por diseño, pero el auto-fix modifica archivos reales. Un rápido git diff antes de hacer staging es un buen hábito.
También puedes apuntar a tipos específicos de problemas para mantener los cambios pequeños y revisables:
npx knip --fix-type dependencies
npx knip --fix-type exports,types
Cuando Knip necesita un poco de ayuda
Knip no es una caja negra perfecta. Algunas situaciones requieren configuración manual:
- Imports dinámicos (
import(someVariable)) no pueden resolverse de forma estática - Convenciones de frameworks (archivos de página de Next.js, módulos virtuales de Vite) pueden necesitar configuración de plugins o reglas de ignorado
- Archivos generados normalmente deberían excluirse del análisis
- Monorepos funcionan bien de forma predeterminada, pero las referencias entre workspaces a veces requieren configuración explícita
Si estás viendo falsos positivos, añade una entrada ignore o ignoreDependencies a knip.json en lugar de deshabilitar secciones completas del análisis.
Convertir la limpieza en un hábito
El uso más efectivo de Knip no es una auditoría puntual, sino ejecutarlo con regularidad. Añádelo a tu pipeline de CI junto a tu linter y verificador de tipos:
npx knip --reporter compact
Un reporte limpio en cada pull request ayuda a evitar que el código muerto se acumule desde el principio. Combina Knip con ESLint (para variables no utilizadas dentro de archivos) y el formateador de tu elección, y tendrás un sólido bucle de mantenimiento automatizado que mantiene tus proyectos de JavaScript y TypeScript ligeros sin trabajo detectivesco manual.
Conclusión
Knip convierte la tediosa tarea de rastrear archivos, exports y dependencias no utilizados en un paso repetible y automatizado. Al tratar la limpieza como parte de tu flujo de trabajo habitual en lugar de una limpieza ocasional, mantienes tu proyecto ligero, tus compilaciones rápidas y tu superficie de dependencias reducida. Comienza con una sola ejecución de npx knip, integra los resultados en tu CI y deja que la herramienta haga el trabajo detectivesco que antes hacías a mano.
Preguntas frecuentes
Sí, Knip solo reporta problemas de forma predeterminada y no realiza cambios a menos que pases la opción --fix. Ejecútalo primero para revisar el reporte, luego aplica correcciones de forma incremental usando --fix-type para apuntar a una categoría a la vez. Siempre revisa el diff de Git antes de hacer commit, especialmente cuando uses --allow-remove-files.
Knip combina las responsabilidades de ambas herramientas en un único paquete con mantenimiento activo. Depcheck se centra en las dependencias y ts-prune en los exports de TypeScript no utilizados, pero Knip analiza archivos, exports y dependencias en conjunto a través de los workspaces, produciendo resultados más precisos para proyectos modernos.
Los falsos positivos suelen provenir de imports dinámicos, convenciones de frameworks o archivos generados que Knip no puede resolver de forma estática. Verifica si existe un plugin de Knip para tu framework y luego añade entradas ignore o ignoreDependencies en knip.json para los casos restantes. Evita deshabilitar secciones completas del análisis para preservar la cobertura.
Sí, y ahí es donde aporta más valor. Añade npx knip --reporter compact a tu pipeline de CI para que cada pull request sea revisado en busca de nuevo código muerto. Combinado con ESLint y tu formateador, esto crea un bucle de mantenimiento automatizado que ayuda a prevenir la acumulación de archivos y dependencias no utilizados entre versiones.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.