Ejecutar npm install y encontrarse con un muro de texto rojo es un rito de paso para todo desarrollador JavaScript. Ya sea un error de permisos en macOS, un conflicto de dependencias en un monorepo o una cache corrupta en CI, la solucion suele ser directa una vez que sabes que buscar. Esta guia cubre cada error comun de npm install, explica por que ocurre y te da los comandos exactos para solucionarlo.
Diccionario de errores: tabla de referencia rapida
| Codigo de error | Significado | Solucion rapida |
|---|---|---|
| EACCES | Permiso denegado — npm intento escribir en un directorio que no posees. | Usar nvm o corregir la propiedad del directorio (ver abajo). |
| ENOENT | Archivo o directorio no encontrado — una ruta referenciada no existe. | Eliminar node_modules y package-lock.json, luego reinstalar. |
| EPERM | Operacion no permitida — a menudo un problema de bloqueo de archivos en Windows. | Cerrar editores/terminales que bloquean la carpeta, luego reintentar. |
| ERESOLVE | Conflicto de dependencias — dos paquetes requieren versiones incompatibles de una peer dependency. | Usar --legacy-peer-deps o --force (ver seccion abajo). |
| ERR_SOCKET_TIMEOUT | Timeout de red — npm no pudo alcanzar el registro. | Verificar configuracion de red/proxy o cambiar a un registro espejo. |
| code 1 | Un script de ciclo de vida (preinstall, postinstall) termino con codigo de error 1. | Verificar que las herramientas de compilacion (Python, node-gyp, compilador C++) esten instaladas. |
EACCES: corregir errores de permisos
Este es el error mas comun en macOS y Linux. Ocurre cuando npm intenta instalar paquetes globales en un directorio del sistema como /usr/local/lib/node_modules.
Solucion en macOS / Linux (Recomendado: usar nvm)
La mejor solucion permanente es usar un gestor de versiones de Node para que npm instale en tu directorio de usuario:
# Install nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
# Restart terminal, then install Node
nvm install --lts
nvm use --lts
# Verify — npm now installs to ~/.nvm/
which npm
# /home/youruser/.nvm/versions/node/v20.x.x/bin/npmAlternativa: cambiar manualmente el directorio por defecto de npm:
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'
# Add to ~/.bashrc or ~/.zshrc:
export PATH=~/.npm-global/bin:$PATH
# Reload shell
source ~/.bashrcOpcion nuclear (no recomendada para la mayoria):
# NOT recommended — changes system directory ownership
sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/shareSolucion en Windows
En Windows, ejecuta tu terminal como Administrador, o mejor aun, usa nvm-windows:
# Install nvm-windows from:
# https://github.com/coreybutler/nvm-windows/releases
# Then in an elevated (Admin) PowerShell:
nvm install lts
nvm use lts
# Or fix npm prefix for current user:
npm config set prefix %APPDATA%\npmERESOLVE: corregir conflictos de dependencias
Desde npm 7, los conflictos de peer dependencies causan que la instalacion falle por defecto. Veras un diagrama de arbol mostrando que paquetes estan en conflicto.
Salida de error tipica:
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: @some-org/some-package@2.1.0
npm ERR! Found: react@18.2.0
npm ERR! node_modules/react
npm ERR! react@"^18.2.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^16.8.0 || ^17.0.0" from some-library@3.5.0
npm ERR! node_modules/some-library
npm ERR! some-library@"^3.5.0" from the root project--legacy-peer-deps vs --force
--legacy-peer-deps le dice a npm que ignore completamente los conflictos de peer dependencies (mismo comportamiento que npm 6). --force fuerza la instalacion. Cuando usar cada uno:
| Flag | When to Use |
|---|---|
| --legacy-peer-deps | Cuando sabes que la discrepancia de peer dep es inofensiva (ej: React 18 vs 17). |
| --force | Cuando quieres que npm obtenga paquetes incluso si existe una copia en cache. |
# Option 1: Ignore peer deps (safest workaround)
npm install --legacy-peer-deps
# Option 2: Force install (overrides everything)
npm install --forceEnfoque preferido — fijar la dependencia en conflicto:
// In package.json — add "overrides" to pin the conflicting dep
{
"overrides": {
"some-library": {
"react": "^18.2.0"
}
}
}
// Then run:
// npm installCorrupcion de node_modules: cuando y como eliminar y reinstalar
A veces node_modules entra en un estado corrupto. Los sintomas incluyen errores "Cannot find module" para paquetes en package.json, o fallos de compilacion extranos despues de cambiar de rama.
Cuando eliminar node_modules
- Despues de cambiar a ramas con arboles de dependencias diferentes.
- Despues de resolver conflictos de fusion en package-lock.json.
- Cuando aparece "Module not found" para un paquete claramente instalado.
- Despues de actualizar Node.js a una nueva version principal.
Como hacer una reinstalacion limpia
Comando multiplataforma (bash):
rm -rf node_modules package-lock.json
npm installWindows (PowerShell):
Remove-Item -Recurse -Force node_modules
Remove-Item package-lock.json
npm installUsando npx:
npx rimraf node_modules
npm installSi los problemas persisten, tambien limpiar la cache de npm:
npm cache clean --force
rm -rf node_modules package-lock.json
npm installConflictos de package-lock.json: estrategias de fusion
Cuando varios desarrolladores cambian dependencias, los conflictos de fusion de package-lock.json estan casi garantizados. Nunca intentes resolverlos manualmente — el archivo es generado automaticamente.
Estrategia de fusion recomendada
Aceptar cualquier lado del conflicto (no importa cual):
# Accept "theirs" (the incoming branch's version)
git checkout --theirs package-lock.json
git add package-lock.json
# OR accept "ours" (your branch's version)
git checkout --ours package-lock.json
git add package-lock.jsonRegenerar el archivo de bloqueo:
npm installHacer commit del resultado:
git add package-lock.json
git commit -m "chore: regenerate package-lock.json after merge"Prevenir conflictos con .gitattributes
Agrega esto a tu .gitattributes para resolver automaticamente conflictos del archivo de bloqueo:
# .gitattributes
package-lock.json merge=oursIncompatibilidad de version de Node.js
Muchos paquetes requieren versiones especificas de Node.js. Si tu version es muy antigua (o muy nueva), npm install puede fallar con errores de compilacion.
Verificar la version requerida
Busca el campo engines en package.json:
// package.json
{
"engines": {
"node": ">=18.0.0",
"npm": ">=9.0.0"
}
}
// Check your current version:
// node -v
// npm -vUsar nvm o fnm para cambiar versiones
nvm (Node Version Manager):
# List available versions
nvm ls-remote
# Install a specific version
nvm install 20
# Switch to a version
nvm use 20
# Set a default
nvm alias default 20fnm (Fast Node Manager) — alternativa mas rapida:
# Install fnm (Rust-based, faster than nvm)
curl -fsSL https://fnm.vercel.app/install | bash
# Install and use a version
fnm install 20
fnm use 20
fnm default 20Crea un archivo .nvmrc en la raiz del proyecto para que todo el equipo use la misma version:
# Create .nvmrc file
echo "20" > .nvmrc
# Team members just run:
nvm use
# or
fnm useProblemas CI/CD: builds de Docker y GitHub Actions
npm install se comporta diferente en entornos CI. El cache, permisos y configuracion de red necesitan atencion especial.
Builds de Docker
Errores comunes en Dockerfiles:
# BAD Dockerfile — no layer caching, uses npm install
FROM node:20-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "index.js"]
# GOOD Dockerfile — proper layer caching, uses npm ci
FROM node:20-alpine
WORKDIR /app
# Copy package files first (layer caching!)
COPY package.json package-lock.json ./
# Use npm ci for deterministic installs
RUN npm ci --ignore-scripts
# Then copy the rest of the source
COPY . .
# Run any build steps after copy
RUN npm run build
CMD ["node", "index.js"]Puntos clave: copiar primero los archivos package para cache de capas, usar npm ci en lugar de npm install en CI (mas rapido y deterministico), usar --ignore-scripts si no se necesitan scripts postinstall.
Cache de GitHub Actions
Un cache adecuado puede reducir el tiempo de instalacion en mas del 70%:
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm' # Caches ~/.npm automatically
- run: npm ci # Deterministic install
- run: npm test
- run: npm run buildDiagrama de decision: npm install fallo — sigue esta guia
Usa este diagrama para diagnosticar tu fallo de npm install:
1. Es un error de permisos (EACCES / EPERM)?
SI -> Usar nvm o corregir la propiedad del directorio.
2. Es un conflicto de dependencias (ERESOLVE)?
SI -> Probar primero --legacy-peer-deps, luego verificar fijacion de version.
3. Es un error de red (SOCKET_TIMEOUT / FETCH)?
SI -> Verificar proxy, VPN, o cambiar de registro espejo.
4. Es un error de compilacion (node-gyp / code 1)?
SI -> Instalar herramientas de compilacion (python3, make, g++ / Visual Studio Build Tools).
5. Es "Cannot find module" o comportamiento extrano?
SI -> Eliminar node_modules + package-lock.json, luego npm install.
6. Sigue fallando?
SI -> Limpiar cache npm (npm cache clean --force), verificar version de Node, intentar un clon nuevo.
Preguntas frecuentes
Como solucionar "npm ERR! EACCES: permission denied" en Mac?
La mejor solucion es instalar Node.js a traves de nvm (Node Version Manager) que instala en tu directorio de usuario y evita problemas de permisos. Ejecuta: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash, luego nvm install --lts.
Que significa "npm ERR! ERESOLVE could not resolve"?
ERESOLVE significa que dos o mas paquetes en tu arbol de dependencias requieren versiones diferentes e incompatibles de la misma peer dependency. Desde npm 7 es un error duro. Agrega --legacy-peer-deps o usa el campo overrides en package.json.
Debo eliminar package-lock.json para corregir errores de npm install?
Eliminar package-lock.json debe ser el ultimo recurso. El archivo de bloqueo garantiza instalaciones deterministicas. Primero intenta eliminar solo node_modules. Siempre haz commit del archivo de bloqueo regenerado.
Por que npm install falla en Docker pero funciona localmente?
Causas comunes: ejecucion como root sin --unsafe-perm, herramientas de compilacion nativas faltantes en la imagen Docker, orden de COPY impidiendo cache de capas, .dockerignore no excluyendo node_modules. Usa npm ci en Docker.
Como solucionar "npm ERR! code 1" durante npm install?
El codigo de error 1 generalmente significa un script postinstall fallido, a menudo compilacion de modulo nativo (node-gyp). macOS: xcode-select --install. Ubuntu/Debian: sudo apt install build-essential python3. Windows: Visual Studio Build Tools.
Cual es la diferencia entre npm install y npm ci?
npm install lee package.json y puede actualizar package-lock.json. npm ci (clean install) elimina node_modules, lee solo package-lock.json e instala versiones exactas. Usa npm ci en CI/CD y npm install en desarrollo local.