npm (Node Package Manager) viene incluido con Node y se usa para administrar los módulos necesarios para nuestra aplicación y administrar sus dependencias.
A la hora de realizar la instalación de las dependencias podemos usa los comandos npm i o npm ci. Pueden parecer iguales pero tienen bastantes diferencias entre sí y su funcionamiento.
npm i (o npm install) se usa para instalar las dependencias desde el archivo package.json
$ npm install
npm ci se usa para instalar las dependencias de versión exactas desde el archivo package-lock.json
$ npm ci
Diferencias
Con npm i
Con npm ci
Instala un paquete y todas sus dependencias.
Generalmente se usa para instalar dependencias.
Puede escribir en package.json o package-lock.json.
Nunca escribe en package.json o package-lock.json.
Se pueden agregar dependencias individuales con este comando.
No se pueden agregar dependencias individuales con este comando.
Es más lento en ejecución.
Es más rápido en ejecución.
Si alguna dependencia no está en package-lock.json, este comando la agregará.
Si falta alguna dependencia o tiene versiones incompatibles, npm ci arrojará un error.
Si un node_modules ya está presente, este comando no le cambia nada.
Si un node_modules ya está presente, se eliminará automáticamente antes de que npm ci comience su instalación.
Puede instalar paquetes globales.
No puede instalar paquetes globales.
El nombre de paquete de npm i se usa a la derecha de package.json para agregar o actualizar dependencias.
No se puede usar para escribir en package.json.
npm, puedo usar package-lock.json para bloquear la versión de algunas dependencias.
No puede escribir en package-lock.json.
Se usa durante el desarrollo después de extraer cambios que actualizan la lista de dependencias.
Se utiliza para la construcción determinista y repetible.
¿Cual debemos usar?
Cuando en trabajamos conjuntamente en un mismo repositorio es conveniente usar npm ci, ya que no actualizará las versiones de las dependencias, manteniendo el package.json sin cambios y evitando modificaciones involuntarias el package.lock, actualizaciones indeseadas o conflictos a la hora de fusionar ramas.