npm ci vs npm install: mejora la fiabilidad y velocidad de tus builds
El comando npm ci
es muy útil para mejorar la fiabilidad y la velocidad en la construcción de nuestro proyecto para producción.
La principal diferencia reside en que el comando npm install
o npm i
, instala todas las dependencias e intenta actualizarlas. En el proceso genera un fichero package-lock.json
en el que fija exactamente cada versión de cada paquete. Por el contrario, el comando npm ci
utiliza el fichero package-lock.json
para instalar las dependencias exactas, no necesita calcular y comprobar las versiones de nuestras dependencias, por lo que es mucho más rápido.
La principal ventaja de usar npm ci
en tus builds de producción es que (1) reduces el tiempo de espera y (2) no tienes sorpresas en paquetes que se hayan actualizado y puedan romper tu código.
Si configuramos correctamente el fichero package.json
para definir cómo debe de actualizar las dependencias, por ejemplo instalar sólo fixes, y tienes un buen sistema de tests, te podría ayudar a automatizar el proceso de actualización de versiones (con herramientas como dependabot).
Instalar sólo dependencias de producción
Escribo este post porque ayer me pasé toda la tarde depurando por qué había diferencias entre mi build local y el build de producción. Te cuento.
El comando npm ci
te permite usar el flag --production
para que no instale las dependencias de desarrollo ( devDependencies
) de tu fichero package.json
.
Esto es muy útil cuando quieres minimizar el tamaño de tu bundle, pero es un problema cuando necesitas hacer un build ya que hay dependencias de desarrollo, como los bundlers (webpack, esbuild, turbopack...) o transpiladores de typescript (babel, tsc...), que son necesarias.
Mi problema era que tenía errores de tipos de Typescript, eran diferentes entre local y el build de producción. Me di cuenta (tras varias horas) que en mi job del CI el comando npm ci
instalaba menos dependencias que en local.
Esto me llevó a acordarme del flag --production
, pero claro, yo no lo tenía...
Pues bien, resulta que la variable de entorno NODE_ENV=production
que sí la tengo configurada para mi entorno de producción, también afecta al comando npm ci
, por lo que tuve que forzar el comando de build a que utilice NODE_ENV=development
y con esto solucioné mis problemas.
Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.