Instala pnpm: el gestor de paquetes JS de nueva generación, 2 veces más rápido que npm y yarn
Presentamos pnpm, el hermano pequeño del trío de gestores de paquetes JS. Intentaré explicar cómo pnpm funciona más rápido que npm y yarn, y organizar cómo instalarlo y usarlo.
1. Presentación de pnpm
La página oficial de pnpm: https://pnpm.io/es/ (opens in a new tab)
pnpm es un gestor de paquetes JS de nueva generación diseñado para superar las limitaciones de rendimiento de los gestores de paquetes JS tradicionales. El nombre pnpm significa Performant npm, y por el nombre se puede deducir que está diseñado para un rendimiento eficiente.
Su uso es casi idéntico al de otros gestores de paquetes.
Funciona sobre la base de un archivo package.json
y puede reemplazar casi todas las características de npm y yarn.
La línea de comandos ming está construida para ser más como yarn.
2. Tres ventajas de pnpm
Hay tres ventajas principales de usar pnpm.
Ahorra espacio en disco, hace que la instalación de dependencias sea más rápida, y organiza la estructura de directorios node_modules
de manera más eficiente.
Veámoslas una a una.
2.1. Menos uso de disco
La razón por la que pnpm puede hacer lo mismo y usar menos espacio en disco es porque usa un repositorio central llamado content-addressable storage (CAS). Cuando instalas un paquete con pnpm, todos los paquetes se almacenan en este repositorio. Y cada proyecto que usa pnpm obtiene los paquetes que necesita de ese repositorio.
Por ejemplo, si creara tres proyectos React con npm, el paquete React se instalaría en el directorio node_modules
de cada proyecto.
Esto significa que tengo 3 de los mismos paquetes instalados en mi máquina.
Sin embargo, si utilizo pnpm, sólo se instala un paquete react en el repositorio CAS, y los tres proyectos comparten ese paquete.
Explicación de cómo funciona CAS con pnpm:
Si necesita diferentes versiones de un paquete, el repositorio CAS lo gestiona de forma eficaz. Sólo descarga y almacena los archivos que han cambiado para cada versión. Esto es similar al algoritmo de gestión de dependencias de Docker.
En el desarrollo de JS/TS, es fácil encontrar paquetes duplicados en cualquier proyecto, o paquetes que dependen de varios paquetes al mismo tiempo. En estos casos, la cantidad de espacio en disco ahorrado por pnpm puede ser significativa.
Lo anterior es la salida del registro de progreso al instalar algunos paquetes con pnpm. Cada número en la última línea significa
resolved
: número total de paquetes necesariosreused
: número de paquetes ya instalados en el repositorio CAS entre losresolved
.downloaded
: número de paquetes recién descargados entre losresolved
.added
: número de paquetes añadidos al proyecto como resultado.
En el caso anterior, dado que no hay nuevos paquetes que descargar, no hay uso de disco ni de red, lo que debería acelerar el tiempo de instalación. Incluso puede añadir paquetes al proyecto sin conexión si están instalados en un repositorio CAS.
2.2. Instalación más rápida de paquetes dependientes
La primera razón por la que pnpm puede hacer instalaciones de dependencias más rápido es debido al repositorio CAS mencionado anteriormente. En primer lugar, no reinstala paquetes que ya están en el repositorio, y hay muchos menos archivos que descargar cuando se actualiza una versión, por lo que no es de extrañar que sea más rápido.
En segundo lugar, pnpm soporta la instalación paralela de paquetes.
Los gestores de paquetes JS siguen un proceso de tres pasos para instalar dependencias: [identifica las dependencias que necesitas -> descarga -> compila el paquete ]. En el caso de npm, todos los paquetes deben completar un paso antes de pasar al siguiente. Como pnpm asume que los paquetes no interfieren entre sí, cada paquete puede hacer el paso 3 por separado.
En el gráfico siguiente, el eje horizontal es el tiempo y el eje vertical es cada paquete. Incluso si todos los paquetes no terminan el paso anterior, el que termine primero continuará con el siguiente paso, haciendo que todo el proceso de instalación sea más rápido.
2.3. Directorio node_modules más ajustado y eficiente
El primero de los tres pasos de instalación de dependencias mencionados anteriormente, la identificación de las dependencias necesarias, se denomina resolución de dependencias. En este paso, el gestor de paquetes realiza un seguimiento de los paquetes que utiliza este proyecto y de los paquetes de los que dependen, y planea instalarlos todos.
Hasta la versión 2 de npm, solíamos instalar todos los paquetes en esta etapa, lo que causaba dos problemas.
Primero, si tanto el paquete A
como el paquete B
tenían el paquete C
como dependencia, se instalaban dos veces, aunque fueran duplicados.
Esto es una duplicación innecesaria.
En segundo lugar, el directorio node_modules
de cada paquete se instalaba con el rabo entre las piernas.
Esto se llama nested node_modules, como la estructura de directorios de abajo.
▾ node_modules
▾ paquete A
▾ node_modules
▸ paquete C
▾ paquete B
▾ node_modules
▾ paquete C
▸ node_modules
En npm 3+ y yarn, usamos la estructura flat node_modules para resolver este problema.
Esta es una forma de instalar todos los paquetes bajo node_modules
en un proyecto, independientemente de su profundidad de dependencia.
▾ node_modules
▾ .bin
▾ accepts
▾ array-flatten
...
▾ etag
▾ express
Esta estructura plana evita instalaciones duplicadas, pero también introduce otro problema.
Este es que cualquier paquete que instale como dependencia puede ser utilizado en este proyecto, incluso si no está explícitamente instalado a través de package.json
.
Por ejemplo, estoy usando la versión 1 del paquete S
, que instalé como dependencia del paquete A
sin ponerlo en package.json
,
¿Qué pasa si necesitamos actualizar a la versión 2 del paquete S
?
Como no hacemos un seguimiento del paquete S
, sería imposible actualizarlo automáticamente, lo que provocaría un error de ejecución.
PNPM evita esto.
Los archivos de paquete en node_modules
creados con pnpm son todos enlaces simbólicos o enlaces duros a los archivos reales en el repositorio CAS, por lo que pueden ser libremente reestructurados y optimizados.
Esto nos permite resolver el problema de los paquetes duplicados sin tener que usar una estructura plana, y restringir el acceso sólo a aquellos paquetes que hayamos instalado explícitamente.
3. Organización intermedia
Como puedes ver, pnpm es más del doble de eficiente que los gestores de paquetes tradicionales simplemente eliminando toda la duplicación posible mediante el uso de repositorios CAS. También hemos ganado mucha estabilidad en el proceso.
Ahora echemos un vistazo rápido a cómo instalar y utilizar pnpm.
4. Cómo instalar
Se recomienda instalar pnpm globalmente usando npm. Se puede instalar con un simple comando. Por supuesto también funciona en Windows.
npm install -g pnpm
Resultado de la ejecución:
También es posible instalar usando Corepack para Node.js, pero esto es todavía experimental, así que no lo describiré.
5. Cómo usarlo
El uso es casi el mismo que para npm y yarn.
5.1. Gestionar paquetes en el proyecto
-
pnpm init
: Inicia un nuevo proyecto que será gestionado por pnpm. -
pnpm install
: Instala una lista precompilada de paquetes de dependencias para el proyecto. -
pnpm add [nombre_paquete]
: Añade uno o más paquetes nuevos a tu proyecto. -
pnpm exec [nombre_paquete]
: Ejecuta un paquete que hayas instalado en tu proyecto desde la línea de comandos. -
pnpm run [script_name]
: Ejecuta el script npm especificado en el proyecto.
5.2. Gestión global de paquetes
-
pnpm dlx [nombre_paquete]
: Descarga y ejecuta un paquete temporalmente sin instalarlo. -
pnpm create [nombre_paquete]
: Crea un nuevo proyecto usando el kit de inicio de un paquete que soporte create. -
pnpm add -g [nombre_paquete]
: Añade un paquete global. -
pnpm list -g
: Lista todos los paquetes globales instalados.
Para más comandos, escriba pnpm
.
