¡Hola developer 👋🏻! Estas semanas he tenido que experimentar con varios módulos de Node.js y, después de varias pruebas, ya no tenía claro cuáles estaba usando y cuáles no 🥲 por lo que necesitaba saber qué debía de eliminar de mi proyecto para evitar tener más dependencias de las necesarias y evitar tanto inflar el tamaño de mi proyecto como exponerlo a vulnerabilidades innecesarias. Así que en este artículo quiero compartir contigo cómo usar el módulo depcheck, con más de 1 millón de descargas semanales 😱, el cual te puede ayudar en esta tarea. Pero no solo eso, sino que además te voy a mostrar cómo puedes crear un flujo de GitHub Actions que te permita ejecutar este periódicamente, generar PRs que eliminen las dependencias que no estás usando y así asegurarte de que el proyecto sólo tiene lo que necesita.
Cómo funciona el módulo depcheck
El funcionamiento de este módulo es súper sencillo. Lo único que tienes que hacer es ejecutar este comando:
npx depcheck -yY te dará un listado con todas aquellas dependencias que cree que están en desuso:

Con esto puedes asegurarte en local si tienes que eliminar algún módulo de los reportados.
Cómo automatizar el proceso con GitHub Actions
Sin embargo llevar a cabo esta tarea de forma manual puede suponer que a veces se te olvide 😇. Es por ello que he creado un flujo de Github Actions que no solo me permite detectar qué dependencias están potencialmente en desuso sino que me genere Pull Requests para poder eliminarlas fácilmente y que se integre con mi CI:
name: 🔎📦 Check for unused dependencies
on:
push:
branches:
- main
schedule:
- cron: '0 0 * * 0'
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
depcheck:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
- name: Install dependencies
run: npm install
- name: Run depcheck
continue-on-error: true
id: depcheck
run: |
npx depcheck -y --json > unused-deps.json
- name: Add GitHub Action Summary
run: |
echo "## Unused Dependencies" >> $GITHUB_STEP_SUMMARY
echo "The following dependencies are unused:" >> $GITHUB_STEP_SUMMARY
for dep in $(jq -r '.dependencies[]' < unused-deps.json); do
echo "- $dep" >> $GITHUB_STEP_SUMMARY
done
- name: Create branches and PRs for unused dependencies
run: |
# Config git client
git config user.name "GitHub Actions Bot"
git config user.email "<>"
git config pull.rebase true
git config --global merge.ours.driver true
echo "*.json merge=ours" >> .git/info/attributes
for dep in $(jq -r '.dependencies[]' < unused-deps.json); do
echo "Processing dependency: $dep"
branch_name="remove-$dep"
echo "Branch name: $branch_name"
pr_exists=$(gh pr list --search "head:$branch_name" --json number -q '.[].number')
echo "PR exists: $pr_exists"
if [ -z "$pr_exists" ]; then
git checkout -b "$branch_name"
npm uninstall $dep
git add package.json package-lock.json
git commit -m "Remove unused dependency: $dep"
git push origin "$branch_name"
gh label create "unused" --color "ff0000" || true
gh label create "dependencies" --color "ff0000" || true
gh pr create --title "Remove unused dependency: $dep" --body "This PR removes the unused dependency: $dep" --label dependencies --label unused
else
echo "PR already exists for $dep, skipping."
fi
done
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: If failed delete the branches
if: failure()
run: |
for dep in $(jq -r '.dependencies[]' < unused-deps.json); do
branch_name="remove-$dep"
echo "Deleting branch: $branch_name"
git push origin --delete "$branch_name" || true
doneEl resultado será algo parecido a esto:

Si quieres saber más sobre Github Actions puedes echar un vistazo a mi serie en mi canal de YouTube:
¡Saludos 👋🏻!
