¿Cuál es la diferencia entre `dependencies` y `devDependencies` en el `package.json`? ¿Por qué importa la distinción?
Ver respuesta — intenta responderla en voz alta primero
dependencies son los paquetes que tu aplicación necesita para funcionar en producción (por ejemplo express): sin ellos el programa no corre. devDependencies son los paquetes que solo usas durante el desarrollo (por ejemplo vitest, nodemon, eslint): sirven para probar, recargar o revisar el código, pero no hacen falta cuando la app ya está corriendo en el servidor. Se instalan distinto (npm install X vs npm install -D X) y separarlas bien mantiene el deploy más liviano y seguro.
La regla mental es sencilla: "¿mi app rota si en producción falta este paquete?"
- Si la respuesta es sí, rota -> va en
dependencies. Ejemplos:express(el framework del servidor), un cliente de base de datos, una librería de validación que usas en tiempo de ejecución. - Si la respuesta es no, en producción no lo necesito -> va en
devDependencies. Ejemplos:nodemon(reinicia el server al guardar, solo en tu máquina),vitestojest(corren las pruebas),eslintyprettier(revisan y formatean el código).
Cómo se instalan:
npm install express-> lo agrega adependencies.npm install -D nodemon(o--save-dev) -> lo agrega adevDependencies.
Por qué importa la distinción:
- Tamaño del deploy: en producción instalas con
npm install --omit=dev(o poniendoNODE_ENV=production), lo que salta todas lasdevDependencies. Así el servidor no descarga cosas comoeslintovitest, que pueden pesar cientos de megas sumadas. Menos peso significa builds e imágenes de Docker más rápidas. - Superficie de ataque más pequeña: cada paquete instalado es código de terceros que podría tener vulnerabilidades. Si en producción no instalas herramientas de desarrollo, reduces el riesgo.
- Claridad: cualquiera que lea el
package.jsonentiende de inmediato qué es esencial para correr la app y qué es solo del entorno de trabajo.
Punto clave: ambas se instalan cuando haces npm install a secas (en tu máquina de desarrollo). La diferencia aparece cuando deliberadamente omites las de desarrollo en el servidor.
Instalando cada tipo de dependencia desde la terminal:
# Dependencia de PRODUCCION: la app la necesita para funcionar
npm install express
# equivalente explicito:
npm install --save express
# Dependencias de DESARROLLO: solo para trabajar en el proyecto
npm install -D nodemon vitest eslint
# equivalente explicito:
npm install --save-dev nodemon vitest eslint
# En el SERVIDOR de produccion, instala solo lo esencial (omite devDependencies):
npm install --omit=dev
Cómo queda reflejado en el package.json:
{
"name": "mi-api",
"version": "1.0.0",
"dependencies": {
"express": "^4.19.0"
},
"devDependencies": {
"nodemon": "^3.1.0",
"vitest": "^1.6.0",
"eslint": "^9.0.0"
}
}
Aquí express está en dependencies porque el servidor lo carga con require('express') cada vez que atiende peticiones. nodemon, vitest y eslint están en devDependencies porque solo se usan mientras desarrollas: ninguno se ejecuta cuando la app ya está sirviendo tráfico real.
Poner en dependencies algo que en realidad es de desarrollo (o al revés). El error más peligroso es dejar en devDependencies un paquete que sí se usa en tiempo de ejecución: en tu máquina todo funciona porque npm install instala ambos grupos, pero al desplegar con --omit=dev ese paquete no se instala y la app crashea en producción con un Cannot find module. Regla de oro: si tu código de la app hace require de ese paquete cuando está corriendo, va en dependencies.
"dependencies son los paquetes que la app necesita para correr en producción, como express, mientras que devDependencies son herramientas que solo uso mientras desarrollo, como nodemon, vitest o eslint. Los instalo distinto: npm install para producción y npm install guion D para desarrollo. La distinción importa sobre todo por el deploy: en el servidor instalo con --omit=dev para saltarme las de desarrollo, y así la imagen queda más liviana, más rápida de construir y con menos superficie de ataque. La regla que uso es: si mi código hace require de ese paquete en tiempo de ejecución, va en dependencies; si es solo para probar, recargar o formatear, va en devDependencies."
Estás armando una API con Express, la pruebas con Jest y la recargas en desarrollo con nodemon. Además usas dotenv para leer variables de entorno al arrancar el servidor. ¿Dónde va cada paquete: dependencies o devDependencies?
Ver respuesta
express->dependencies(el servidor lo necesita para funcionar).dotenv->dependencies(se ejecuta al arrancar, en producción también, para cargar las variables de entorno).jest->devDependencies(solo corre las pruebas, no hace falta en producción).nodemon->devDependencies(solo recarga el server en tu máquina; en producción usasnodedirecto).
La trampa está en dotenv: aunque suene a herramienta, corre en tiempo de ejecución, así que va en dependencies.