1.4 · npm: package.json, dependencias, scripts, versiones

Nivel 1 · JavaScript y bases de Node

1.4npm: package.json, dependencias, scripts, versiones

Objetivo: gestionar un proyecto Node con npm: package.json, dependencias (prod frente a dev), scripts, versionado semántico y seguridad (auditoría) — la base de todo proyecto.
Tiempo estimado: 12 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • package.json = el manifiesto: nombre, versión, dependencias, scripts — creado con npm init, punto de referencia de todo proyecto.
  • La receta, no el resultado: se versionan package.json + package-lock.json (versiones exactas), nunca node_modules (regenerable vía npm install).
  • Semver + scripts + auditoría: MAYOR.MENOR.PARCHE (^ y ~), comandos estándar vía npm run, vulnerabilidades vía npm audit.

Minicaso hilado — Salim inicializa su proyecto en Argel

Salim recupera el proyecto de la startup: una carpeta con código pero sin package.json, y un compañero le envía node_modules como adjunto. Empieza de forma limpia: npm init para crear el manifiesto, instalación de los paquetes (dependencias frente a devDependencies), scripts start/dev/test, .gitignore que excluye node_modules, y un primer npm audit que revela una dependencia vulnerable que actualizar. El proyecto se vuelve instalable con un comando: npm install.

Último episodio del caso 1.1-1.3 — Salim equipa su proyecto tras el lenguaje, la asincronía y los módulos.

1. package.json y dependencias: el manifiesto

npm da acceso al mayor registro open source del mundo: se instalan paquetes en lugar de codificarlo todo. El corazón del proyecto es package.json (nombre, versión, dependencias, scripts), creado con npm init. npm install express descarga en node_modules y añade a las dependencias. Se distinguen dependencies (producción) y devDependencies (solo dev, -D). El package-lock.json fija las versiones exactas (reproducibilidad); node_modules no se versiona (regenerable).

Salim lanza npm init -y, instala el framework como dependencia y la herramienta de reinicio como devDependency: el proyecto ya se instala con un npm install en cualquier equipo.

2. Semver, scripts y seguridad

El versionado semántico (semver) sigue MAYOR.MENOR.PARCHE: mayor = cambios incompatibles, menor = novedades compatibles, parche = errores. ^4.18.2 autoriza actualizaciones menores/de parche, ~4.18.2 solo de parche. Los scripts (start, dev, test) se lanzan con npm run <nom> y estandarizan los comandos. Y npm audit señala las vulnerabilidades de las dependencias — a vigilar, pues los fallos de dependencias son un riesgo real.

Salim define start, dev y test en sus scripts y hace de npm audit su reflejo antes de cada puesta en producción.

3. Elegir sus paquetes sin exponerse

El ecosistema inmenso es una fuerza (no reinventar la rueda) y un riesgo (fallos, calidad variable, paquetes abandonados). Para elegir: popularidad (descargas, adopción), mantenimiento activo (actualizaciones recientes, issues tratados), documentación seria, perímetro mínimo (no un gran paquete para una función trivial). Y en Git: se versionan package.json + lock, nunca node_modules ni los secretos (.env).

Salim verifica las descargas y la última actualización antes de instalar, y añade node_modules/ y .env al .gitignore desde el primer commit.

Error frecuente de interpretación: «Hay que enviar node_modules al compañero / versionarlo» o «^ y ~ son decorativos». No. node_modules es enorme, regenerable con npm install y a veces específico de la plataforma: se comparten package.json + lock, nunca la carpeta. Y ^ / ~ controlan realmente las actualizaciones aceptadas — ignorarlos es exponerse a subidas de versión sorpresa (o al contrario a fallos nunca corregidos).
La gestión de un proyecto npm La receta, no el resultado package.json Manifiesto:dependencias, scriptspackage-lock.json Versionesexactas (reproducibilidad)node_modules Paquetesinstalados (no versionado)
La receta, no el resultado
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Iniciar: Salim crea el manifiesto con npm init y declara las dependencias (prod) y devDependencies (dev, -D). 2) Fijar: el lock congela las versiones exactas para que cada equipo instale lo mismo; node_modules queda fuera de Git. 3) Estandarizar y proteger: scripts start/dev/test lanzados vía npm run, y npm audit antes de cada entrega. Lección: compartir la receta (json + lock), regenerar el resultado (npm install).

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Inicializar e instalar

Los comandos básicos, en orden.

npm init -y            # crea package.json
npm install express    # dependencia (producción)
npm install -D nodemon # devDependency (dev)
npm run dev            # ejecuta el script "dev"
npm audit              # vulnerabilidades conocidas

Lectura: -D marca las herramientas de dev; npm run lanza los scripts del manifiesto.

Lección: ignorar node_modules y .env en .gitignore — reflejo desde el primer commit.

Vocabulario de la sección

npm y el registro
Gestor de paquetes de Node, que da acceso al mayor registro open source del mundo (cientos de miles de bibliotecas reutilizables).

Ejemplo sencillo: El framework web instalado por Salim en lugar de recodificarlo.

Lo que no es: recodificar uno mismo un router HTTP o un cliente de base.

Reflejo: buscar el paquete probado antes de recodificar.

package.json
Manifiesto del proyecto: nombre, versión, dependencias, scripts, metadatos. Creado con npm init; punto de referencia de todo proyecto Node.

Ejemplo sencillo: El package.json de Salim con start, dev y test.

Lo que no es: una carpeta de código sin manifiesto, no instalable limpiamente.

Reflejo: npm init desde el primer día del proyecto.

dependencies frente a devDependencies
dependencies: necesarias en producción. devDependencies: útiles solo en dev (instaladas con -D). node_modules: carpeta de los paquetes instalados, no versionada, regenerable.

Ejemplo sencillo: El framework en dependencies, la herramienta de reinicio en devDependencies en casa de Salim.

Lo que no es: enviar node_modules como adjunto al compañero.

Reflejo: -D para las herramientas, Git ignora node_modules.

package-lock.json
Archivo que fija las versiones EXACTAS instaladas; garantiza que todo el mundo instale rigurosamente las mismas versiones (reproducibilidad).

Ejemplo sencillo: El lock que hace que el equipo de Salim y la producción instalen lo mismo.

Lo que no es: «en mi equipo funciona» con versiones distintas en todas partes.

Reflejo: versionar el lock, nunca editarlo a mano.

semver y scripts npm
Versionado MAYOR.MENOR.PARCHE (^ autoriza menores/parche, ~ solo parche). Los scripts definen comandos reutilizables (npm run ).

Ejemplo sencillo: El ^ que deja pasar los parches de seguridad en casa de Salim, y su npm run dev.

Lo que no es: versiones congeladas para siempre o comandos distintos por desarrollador.

Reflejo: entender ^ / ~, estandarizar vía los scripts.

En la práctica — En la práctica — Gestionar un proyecto con npm

  1. Inicialice un proyecto con npm init -y y examine el package.json generado (nombre, versión, scripts).
  2. Instale un paquete (npm install express) y una devDependency (npm install -D nodemon); observe node_modules, package.json y package-lock.json.
  3. Añada scripts al package.json ("start", "dev") y láncelos con npm start / npm run dev.
  4. Entienda el semver (^ frente a ~), ignore node_modules (.gitignore) y lance npm audit para detectar vulnerabilidades.
Gestiona un proyecto Node con npm: package.json, instalación de dependencias (prod frente a dev), scripts, versionado semántico y seguridad (auditoría) — la base de todo proyecto.

Guion listo para decir — pautar la higiene npm en equipo (30 s)

«Versionamos package.json y el lock, nunca node_modules — cada uno regenera con npm install. Las herramientas de dev van en -D, los comandos en scripts, y hacemos un npm audit antes de cada entrega.»

Para decir al arrancar el proyecto; verificar el .gitignore en el primer commit.

Modelo copiar-pegar — package.json mínimo + .gitignore

{
  "name": "projet-salim",
  "version": "1.0.0",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js",
    "test": "jest"
  },
  "dependencies": {},
  "devDependencies": {}
}
// .gitignore :
// node_modules/
// .env

Proyecto sin manifiesto

Como Salim: npm init -y, reinstalar los paquetes uno por uno distinguiendo prod y -D, recrear los scripts — nunca recuperar un node_modules ajeno.

Equipo en Argel

Scripts start/dev/test idénticos para todos: cada desarrollador lanza los mismos comandos, se acabó el «yo lo hacía de otra forma».

Subida de versión prudente

Leer lo que ^ y ~ autorizan antes de actualizar; probar tras cada subida menor, fijar vía el lock.

Entrega inminente

npm audit antes de entregar: corregir las vulnerabilidades señaladas, verificar que .env y node_modules quedan fuera de Git.

Prudencia: No versione nunca los secretos (.env, claves API, contraseñas): quedan fuera de Git vía .gitignore. Antes de cada entrega, lance npm audit y corrija las vulnerabilidades señaladas — las dependencias son un vector de ataque real.

✓ Buenas prácticas

  • Versionar json + lock, nunca node_modules.
  • Herramientas de dev en -D, comandos en scripts.
  • npm audit antes de cada entrega.

✗ Errores frecuentes

  • Versionar node_modules.
  • Olvidar .env en .gitignore.
  • Ignorar las alertas npm audit.

Puntos clave

  • npm da acceso al mayor registro open source del mundo: instalar paquetes en lugar de codificarlo todo — acelerador clave.
  • package.json = manifiesto (dependencias, scripts); package-lock.json fija las versiones EXACTAS. node_modules NO versionado (regenerable).
  • dependencies (producción) frente a devDependencies (dev, -D); SEMVER MAYOR.MENOR.PARCHE (^ menores/parche, ~ parche).
  • SCRIPTS npm estandarizan los comandos; npm audit señala las vulnerabilidades (a vigilar).

Reto 48h — aplíquelo mañana

Inicialice un proyecto real (modelo anterior): npm init -y, 1 paquete + 1 devDependency (-D), 2 scripts, .gitignore (node_modules, .env) y luego npm audit. 25 minutos bastan.

Lista de salida de la sección
  • Puedo explicar package.json, lock y node_modules.
  • Sé distinguir dependencies, devDependencies y semver ^ / ~.
  • Tengo un proyecto instalable vía npm install + auditado.
Autoevaluación 1-5: ¿se instala mi proyecto con un comando en otro equipo?¿están los secretos y node_modules bien fuera de Git?

Preguntas frecuentes

¿Qué hay que versionar (Git) en un proyecto Node, y por qué no node_modules?

Versione su código, package.json (la «receta»: dependencias, scripts) y package-lock.json (las versiones exactas, incluidas las subdependencias) — más el .gitignore, el README y las configs. No versione nunca node_modules: es enorme (miles de archivos), regenerable con npm install desde ambos manifiestos, y a veces específico de la plataforma. Como Salim: se comparte la receta (json + lock), cada uno regenera el resultado. Excluya también los secretos (.env), logs y temporales.

El ecosistema npm es inmenso: ¿cómo elegir buenos paquetes?

No reinventar la rueda es una gran baza — pero las dependencias también son un riesgo (fallos, calidad variable, abandono). Para elegir: popularidad (descargas, estrellas — una buena señal), mantenimiento activo (actualizaciones recientes, issues tratados), documentación seria, perímetro mínimo (no un gran paquete para una nimiedad). Luego gestione: mantenga las dependencias al día (semver entendido), vigile npm audit y prefiera pocas dependencias probadas a una miríada de desconocidas.

Comprueba tu comprensión

¿Qué hay que versionar en Git para un proyecto Node?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 1Preguntas inéditas y más difíciles para validar tus conocimientos