Javascript
Entorno de desarrollo
Pnpm: Gestor de paquetes

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

logo 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: Explicación de cómo funciona CAS

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.

Registro de progreso de pnpm

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 necesarios
  • reused : número de paquetes ya instalados en el repositorio CAS entre los resolved.
  • downloaded : número de paquetes recién descargados entre los resolved.
  • 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.

Instalando paquetes pnpm en paralelo

Ejemplo de instalación en paralelo de paquetes pnpm (source (opens in a new tab))
.

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.

nested node_modules
▾ 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.

flat node_modules
▾ 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: Instalando pnpm con npm

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. Ejemplo de pnpm init

  • pnpm install : Instala una lista precompilada de paquetes de dependencias para el proyecto. Ejemplo de pnpm install

  • pnpm add [nombre_paquete]: Añade uno o más paquetes nuevos a tu proyecto. Ejemplo de pnpm add

  • pnpm exec [nombre_paquete]: Ejecuta un paquete que hayas instalado en tu proyecto desde la línea de comandos. Ejemplo de pnpm exec

  • pnpm run [script_name] : Ejecuta el script npm especificado en el proyecto. pnpm run ejemplo pnpm run dev result

5.2. Gestión global de paquetes

  • pnpm dlx [nombre_paquete] : Descarga y ejecuta un paquete temporalmente sin instalarlo. phpm dlx ejemplo

  • pnpm create [nombre_paquete] : Crea un nuevo proyecto usando el kit de inicio de un paquete que soporte create. Ejemplo de pnpm create

  • pnpm add -g [nombre_paquete] : Añade un paquete global. pnpm add -g Ejemplo

  • pnpm list -g : Lista todos los paquetes globales instalados. pnpm list -g Ejemplo

Para más comandos, escriba pnpm.

pnpm command list

copyright for Javascript pnpm install

© 2023 All rights reserved.