En el desarrollo frontend, npm es el gestor de paquetes más utilizado. Aunque se usa diariamente, es esencial comprender los archivos package.json y package-lock.json. Este artículo analiza en detalle su funcionamiento y configuración.
Instalación y gestión de paquetes con npm
npm permite la instalación local o global de paquetes. El comando básico es npm install o su abreviatura npm i.
Instalación local
Los paquetes instalados localmente solo están disponibles en el directorio actual. Ejemplo:
npm i vue-bootstrap
En proyectos reales, se genera primero el archivo package.json. Las dependencias se clasifican en:
dependencies: Paquetes para producción (ej.vue-bootstrap).devDependencies: Paquetes para desarrollo (ej.webpack).
Para instalar en devDependencies, se usa --save-dev o -D; para dependencies, --save o -S. Sin parámetros, se instala en dependencies por defecto. En entornos de producción, se ejecuta npm install --prod para instalar solo dependencies.
Instalación global
Los paquetes globales están disponibles en todo el sistema. Se instalan con -g o --global:
npm i -g vue-bootstrap
La ubicación se verifica con npm root -g.
Eliminación de paquetes
Se reemplaza install por uninstall o un:
npm un vue-bootstrap
Para paquetes globales, se añade -g.
Proceso de instalación de npm
Al ejecutar npm install, npm sigue estos pasos:
- Configuración: Busca archivos
.npmrcen el proyecto, globalmente o usa la configuración interna. - Construcción del árbol de dependencias: Si existe
package-lock.json, verifica consistencia conpackage.json; de lo contrario, genera el árbol basado enpackage.json. - Descarga de dependencias: Verifica la caché local. Si no hay caché, descarga del registro, valida integridad y almacena en caché antes de descomprimir en
node_modules. - Generación de package-lock.json: Se crea automáticamente si no existe, o se actualiza si hay cambios. Su propósito es fijar versiones exactas.
Creación de package.json
El archivo package.json no se genera automáticamente. Se crea con npm init, que hace preguntas interactivas. Para generación rápida, se usa npm init -y o npm init -f. Los valores predeterminados se configuran con npm config set; por ejemplo:
npm config set init-author-name 'nuevoautor'
Campos clave en package.json
El archivo package.json es un objeto JSON con múltiples campos:
nameyversion: Identificador y versión del proyecto, siguiendo versionado semántico (por ejemplo,^1.2.3permite actualizaciones menores).description,author,contributors: Metadatos del proyecto.homepage,repository,bugs: Enlaces útiles.
Tipos de dependencias
npm admite varios tipos de dependencias en package.json:
dependencies: Dependencias de producción.devDependencies: Dependencias de desarrollo.peerDependencies: Dependencias compartidas para evitar duplicados (ej.vueenvuex).bundledDependencies: Paquetes incluidos en el paquete final (requiere declaración previa endependenciesodevDependencies).optionalDependencies: Dependencias que no interrumpen la instalación si fallan.
Otros campos relevantes
engines: Especifica versiones de Node.js o npm requeridas (solo informativo).scripts: Comandos personalizados (ej."start": "node server.js").main,browser,module: Puntos de entrada para diferentes entornos.files: Lista de archivos incluidos al publicar el paquete.license: Protocolo de licencia open source (ej.MIT).
Análisis de package-lock.json
Este archivo fija versiones exactas de las dependencias. Cada entrada incluye:
version: Versión específica.resolved: URL de origen.integrity: Hash para verificación.requires: Dependencias necesarias.dependencies: Sub-dependencias anidadas en caso de conflictos.
Por ejemplo, si el proyecto depende de A, B y C, y B requiere una versión específica de C, package-lock.json reflejará esta estructura:
node_modules
A.package
B.package
node_modules
C.package
C.package
Cuándo se modifica package-lock.json
Se genera automáticamente con npm install. Cambia cuando:
- Se alteran dependencias en
package.json. - Se instalan o eliminan paquetes.
- Cambia la fuente de registro (registry).
Consultar versiones instaladas
Para ver versiones exactas, se usa:
npm list --depth 0
O revisando node_modules directamente.
Instalar versiones específicas
Se puede instalar una versión concreta, por ejemplo:
npm install vue-bootstrap@2.1.0
Esto actualiza tanto package.json como package-lock.json.
Actualizar paquetes
Se usa npm update para actualizar dentro de las restricciones semánticas. Para versiones mayores, se instala explícitamente con @version. El comando npm outdated muestra paquetes desactualizados.
Mejores prácticas con package-lock.json
Para aplicaciones, se recomienda comprometer package-lock.json al repositorio para garantizar consistencia. Para bibliotecas públicas, puede omitirse para permitir flexibilidad en proyectos dependientes. Al publicar, este archivo no se incluye.
En caso de conflictos, se puede eliminar package-lock.json y regenerarlo con npm install.
Configuración avanzada de npm
Los ajustes de npm se gestionan con npm config. Para mejorar la velocidad, se puede cambiar el mirror:
npm config set registry https://registry.npmmirror.com