npm y package.json
💡 🎯 Al terminar esta lección podrás…
- Leer y entender un
package.json. - Instalar y desinstalar paquetes y distinguir
dependenciesdedevDependencies. - Interpretar versiones como
^5.1.0y~5.1.0. - Crear scripts y ejecutarlos con
npm run. - Saber qué se sube a Git y qué no (
node_modules,.env).
1.Qué es npm y qué es un paquete
Casi nadie programa todo desde cero. Para casi cualquier necesidad (un servidor web, validar datos, manejar fechas) alguien ya escribió y publicó una biblioteca. Esas bibliotecas se llaman paquetes y viven en un registro público. npm (Node Package Manager) es la herramienta que viene con Node y que sirve para:
- Descargar paquetes en tu proyecto (
npm install). - Anotar qué paquetes usa tu proyecto, y en qué versión, en
package.json. - Ejecutar comandos del proyecto con atajos (
npm run).
Ya usaste npm en React cuando escribiste npm install y npm run dev: lo que aprendes aquí es lo que hay detrás de esos comandos.
2.package.json por dentro
El package.json es la ficha del proyecto. Es un archivo JSON (comillas dobles, sin comas finales, sin comentarios) con esta pinta:
{
"name": "mi-api",
"version": "1.0.0",
"description": "Mi primera API con Node",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "node --watch index.js"
},
"dependencies": {
"express": "^5.1.0"
},
"devDependencies": {
"prettier": "^3.3.0"
},
"engines": {
"node": ">=20"
}
}
| Campo | Para qué sirve |
|---|---|
name | Nombre del proyecto: en minúsculas, sin espacios |
version | Versión del proyecto (MAYOR.MENOR.PARCHE) |
type | "module" para ES Modules; sin él, CommonJS |
main | Archivo de entrada del proyecto |
scripts | Atajos de comandos que se lanzan con npm run |
dependencies | Paquetes que el programa necesita para funcionar |
devDependencies | Paquetes que solo usas mientras desarrollas (formateadores, pruebas) |
engines | Versiones de Node con las que funciona el proyecto |
📌 Nota · Las versiones del ejemplo
Los números de versión de express y prettier de arriba son ilustrativos. Al instalar un paquete, npm escribe la versión actual en tu package.json; no tienes que escribirla tú.
⚠️ Importante · JSON es estricto
En package.json una coma de más, una comilla simple o un comentario rompen el archivo y npm mostrará EJSONPARSE. Revisa las comas cuando lo edites a mano.
3.Instalar y quitar paquetes
Dentro de la carpeta del proyecto (donde está el package.json) instalas un paquete con:
npm install express
added 65 packages, and audited 66 packages in 2s
found 0 vulnerabilities
Tu número de paquetes será distinto: un paquete suele depender de otros, y npm los descarga todos. Después del comando ocurren tres cosas:
- Aparece (o crece) la carpeta
node_modules/con el código de todos los paquetes. - Se añade
expressadependenciesenpackage.json. - Se crea o actualiza
package-lock.json, que fija la versión exacta de cada paquete instalado.
| Comando | Qué hace |
|---|---|
npm install (o npm i) | Instala todo lo que figura en package.json (lo que haces tras clonar un proyecto) |
npm install paquete | Instala un paquete y lo añade a dependencies |
npm install -D paquete | Lo añade a devDependencies (solo desarrollo) |
npm uninstall paquete | Lo quita del proyecto y de package.json |
npm ci | Instala exactamente lo que dice package-lock.json (útil en despliegues) |
npm outdated | Muestra qué paquetes tienen versiones nuevas |
npm audit | Revisa si tus dependencias tienen vulnerabilidades conocidas |
Una vez instalado, lo usas desde tu código con un import:
import express from "express";
console.log(typeof express);
function
💡 Consejo · Elegir bien un paquete
Antes de instalar algo, mira que esté mantenido (publicaciones recientes), que tenga un uso razonable y documentación clara. Cada dependencia es código ajeno que corre en tu programa: menos es más.
4.Versiones: MAYOR.MENOR.PARCHE
Los paquetes usan versionado semántico: tres números separados por puntos, por ejemplo 5.1.2.
| Número | Cambia cuando… | Ejemplo |
|---|---|---|
| MAYOR (5.x.x) | Hay cambios que rompen la compatibilidad | 4.21.2 → 5.0.0 |
| MENOR (x.1.x) | Se añaden funciones sin romper nada | 5.0.0 → 5.1.0 |
| PARCHE (x.x.2) | Se corrigen errores | 5.1.0 → 5.1.1 |
En package.json las versiones llevan un símbolo delante que indica qué actualizaciones acepta npm:
| Escrito | Acepta | Ejemplos que cumplen 5.1.0 como base |
|---|---|---|
"^5.1.0" | Cualquier versión compatible: mismo MAYOR, igual o superior | 5.1.0, 5.1.4, 5.9.0 (no 6.0.0) |
"~5.1.0" | Solo parches: mismo MAYOR y MENOR | 5.1.0, 5.1.9 (no 5.2.0) |
"5.1.0" | Exactamente esa versión | 5.1.0 |
El símbolo ^ es el que npm escribe por defecto. Para ver la idea en acción, aquí tienes una versión simplificada de la comparación, en JavaScript puro:
📌 Nota · El archivo package-lock.json
Mientras que package.json dice «acepto versiones ^5.1.0», package-lock.json dice «hoy instalé exactamente la 5.1.2». Así todas las personas del equipo (y el servidor) obtienen las mismas versiones. Se sube a Git y no se edita a mano.
5.Scripts: atajos para tus comandos
Dentro de scripts defines nombres de comandos y lo que ejecutan. Así, quien llegue a tu proyecto no necesita saber cómo se arranca: solo escribe npm run más el nombre.
"scripts": {
"start": "node index.js",
"dev": "node --watch index.js",
"formatear": "prettier --write ."
}
npm run dev
> mi-api@1.0.0 dev
> node --watch index.js
Servidor escuchando…
Dos nombres tienen atajo y se pueden ejecutar sin run: npm start y npm test. Para cualquier otro nombre debes escribir npm run nombre. Y si escribes solo npm run, verás la lista de scripts disponibles.
💡 Consejo · Convención habitual
start arranca el programa «de verdad» (producción) y dev arranca el modo desarrollo con recarga automática. Es la misma pareja que viste en los proyectos de Vite.
Los programas instalados como dependencia (por ejemplo prettier) están disponibles dentro de los scripts sin escribir su ruta. Fuera de un script, se ejecutan con npx:
npx prettier --check .
npx ejecuta el programa de un paquete: si está en tu proyecto usa esa copia; si no, lo descarga temporalmente para esa ejecución.
6.node_modules y .gitignore
La carpeta node_modules/ puede contener miles de archivos y pesar cientos de megabytes. Pero es totalmente reproducible: con package.json y package-lock.json, npm install la vuelve a crear. Por eso nunca se sube a Git. Se excluye con un archivo .gitignore en la raíz del proyecto:
node_modules/
.env
*.log
Cada línea es un patrón de archivos que Git debe ignorar:
node_modules/: las dependencias descargadas..env: variables privadas como contraseñas o claves (lo verás en la lección 6).*.log: archivos de registro.
⚠️ Importante · Qué se sube y qué no
Sí se suben: tu código, package.json, package-lock.json y .gitignore. No se suben: node_modules/ y cualquier archivo con secretos. Quien clone tu repositorio solo escribe npm install y recupera todo.
Si un día algo se comporta de forma extraña tras actualizar paquetes, el remedio clásico es borrar node_modules y ejecutar npm install otra vez.
7.Leer un package.json con JavaScript
Como package.json es JSON, puedes leerlo con JSON.parse (lección 2) y trabajar con él como con cualquier objeto. Este editor lo hace en tu navegador con un texto de ejemplo:
8.Errores frecuentes
- Subir
node_modulesa Git: engorda el repositorio sin necesidad. Añádelo a.gitignoreantes de tu primer commit. - Ejecutar
npm installen la carpeta equivocada: crea otronode_modulesy otropackage.jsondonde no querías. Comprueba que estás junto alpackage.json. - Una coma de más en
package.json: el archivo es JSON estricto y npm lo rechaza. - Escribir
npm dev: solostartytesttienen atajo. Lo correcto esnpm run dev. - Editar
package-lock.jsona mano: lo gestiona npm; si lo rompes, bórralo y ejecutanpm install. - Poner en
dependenciesalgo que solo usas al desarrollar: usanpm install -Dpara las herramientas de desarrollo. - Ignorar
npm audit: revísalo de vez en cuando; muchas vulnerabilidades se arreglan actualizando.
📒 Apuntes para llevar
- npm instala paquetes y ejecuta comandos del proyecto; viene con Node.
package.jsones la ficha del proyecto: nombre, versión,scriptsy dependencias.npm install paquete→dependencies;npm install -D paquete→devDependencies.- Versiones
MAYOR.MENOR.PARCHE:^acepta menores y parches;~, solo parches. package-lock.jsonfija las versiones exactas y sí se sube a Git.node_modules/no se sube: se reconstruye connpm install.npm run nombreejecuta un script;npm startynpm testno necesitanrun.npx programaejecuta el programa de un paquete.
9.Glosario
| Término | Significado |
|---|---|
| npm | Gestor de paquetes de Node: instala dependencias y ejecuta scripts. |
| Paquete | Biblioteca de código publicada en el registro de npm. |
| Dependencia | Paquete del que depende tu proyecto. |
devDependencies | Dependencias solo necesarias durante el desarrollo. |
| Versionado semántico | Sistema MAYOR.MENOR.PARCHE que indica el tipo de cambio de cada versión. |
package-lock.json | Registro de las versiones exactas instaladas. |
| Script | Atajo definido en package.json y lanzado con npm run. |
.gitignore | Archivo que lista lo que Git no debe rastrear. |
npx | Herramienta que ejecuta el programa de un paquete. |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
¿Para qué sirve el campo scripts de package.json?
Cada entrada asocia un nombre con un comando, por ejemplo "dev": "node --watch index.js".
¿Qué significa "^5.1.0"?
El símbolo ^ acepta versiones compatibles: el MAYOR no cambia, pero menor y parche pueden subir.
¿Qué carpeta NO se sube a Git?
Se reconstruye con npm install y puede pesar cientos de megas.
¿Cómo ejecutas el script dev?
Solo start y test tienen atajo; los demás necesitan run.
¿Dónde instalas con -D una herramienta que solo usas al desarrollar?
-D (o --save-dev) la registra en devDependencies.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.