Anos atrás, eu estava entre o NPM e o Yarn, uma questão comum entre desenvolvedores Node.js. Eu sempre mantive ambos instalados e depois de uma melhoria de performance no NPM, o Yarn virou plano B, “se o NPM falhar bora de Yarn”.

Em busca de conhecimento 👽, encontrei o PNPM há algum tempo e resolvi testá-lo. Notei uma melhoria gigante na instalação de pacotes e o mais interessante é que essa estratégia aprimorada de reuso de pacotes do projeto, reduz o espaço em disco consumido pelos pacotes.

PNPM

É um gerenciador de pacotes que lida com instalação, atualização e remoção de pacotes. Esses pacotes contêm principalmente JavaScript/Typescript e assets utilizados por seus diversos bundlers. Assim como Yarn o registry NPM é usado pelo PNPM.

Melhorias

Redução no tempo de instalação e tamanhos dos pacotes são pontos positivos do PNPM, essas características ajudam e muito, desde a criação de imagens de container até o ambiente de desenvolvimento.

Hoje em dia instalamos um pacote NPM que instala uma dependência que tem outra dependência e você acaba colocando tanta coisa no seu projeto que só percebe no seu lock file.

Por que o PNPM?

Não estou dizendo que devemos parar de usar Yarn ou NPM, ambos funcionam, mas quando há aqueles projetos com vários pacotes e usando um bundler com diversas dependências enraizadas e comuns…

Podemos dizer que com o PNPM, seus problemas acabaram e eu agarantio…

Quem utiliza o PNPM?

O projeto é bem maduro e utilizado por grandes empresas.

Instalando PNPM

Bora vamos instalar o PNPM, existem vários métodos disponíveis, como em todo ambiente Node.js, o NPM já está instalado, podemos instalá-lo através dele assim como o Yarn ou uma instalação desvinculada.

# powershell (windows)
iwr https://get.pnpm.io/install.ps1 -useb | iex

# using curl
curl -fsSL https://get.pnpm.io/install.sh | sh -

# using wget
wget -qO- https://get.pnpm.io/install.sh | sh -

# using npm
npm install -g pnpm

Testes

Abaixo iremos testar a instalação da biblioteca React e suas dependências:

mkdir /tmp/pnpm-test
cd /tmp/pnpm-test
npm init -y foo bar

pnpm install react @testing-library/react @testing-library/jest-dom

O comando abaixo lista links simbólicos, ou seja, uma forma de validar o reuso de pacotes no projeto.

ls -lhaF node_modules | grep ^l

As bibliotecas usadas tem o React como um pacote comum, que será reutilizado,  o que é uma das estratégias do PNPM para tornar o processo de instalação mais rápido e reduzindo o uso do armazenamento, conforme mencionado anteriormente, os pacotes serão armazenados uma única vez, abaixo temos uma referência de link simbólico para node_modules/react.

.pnpm/[email protected]/node_modules/react/

Não que eu goste de projetos que compartilham uma lista enorme de dependências, mas os benefícios são ainda maiores com o PNPM.

Performance

O site oficial do PNPM fornece benchmarks entre gerenciadores de pacotes, recursos e tempos de execução.

Compatibilidade

O PNPM é compatível com o [Node](https://nodejs.org/en)[.js](Node.js) desde a versão 16x, hoje estamos na versão 18x como LTS, segue abaixo uma tabela de compatibilidade considerando a versão *LTS *como partida.

Node.jspnpm 5pnpm 6pnpm 7pnpm 8
18?
20??

Recursos

Esta lista de recursos e comparação foram retiradas do site oficial.

FeaturepnpmYarnnpm
Workspace support✔️✔️✔️
Isolated node_modules✔️ – The default✔️✔️
Hoisted node_modules✔️✔️✔️ – The default
Autoinstalling peers✔️✔️
Plug’n’Play✔️✔️ – The default
Zero-Installs✔️
Patching dependencies✔️✔️
Managing Node.js versions✔️
Has a lockfile✔️ – pnpm-lock.yaml✔️ – yarn.lock✔️ – package-lock.json
Overrides support✔️✔️ – via resolutions✔️
Content-addressable storage✔️
Dynamic package execution✔️ – via pnpm dlx✔️ – via yarn dlx✔️ – via npx
Side-effects cache✔️
Listing licenses✔️ – via pnpm licenses list✔️ – via a plugin

Principais comandos

pnpmnpmyarn
pnpm installnpm installyarn install
pnpm install reactnpm install reactyarn add react
pnpm uninstall reactnpm uninstall reactyarn remove react
pnpm store prunenpm cache clean --forceyarn cache clean

Maiores informações na documentação oficial.

Fim!

O objetivo deste artigo foi demonstrar uma opção rápida de gerenciar seus pacotes, estejam eles instalados em seu ambiente de desenvolvimento ou em seu container. Outra vantagem é que o lock file PNPM possui sintaxe yaml, o que torna o arquivo mais fácil de ler em minha humilde opinião.

Deus abenç️️oe 🕊️ uma excelente semana para você! ️

Mantenha seu kernel 🧠 atualizado.

Referências