O Melhor gerenciador de pacotes da atualidade
Tags: webdev, node, javascript, beginners
Published: 2023-05-25 16:50:32

Caso você já está confortável com o básico de javascript provavelmente conhece o que é um gerenciador de pacotes, mas caso não saiba trata-se de um executável que instala, atualiza ou deleta pacotes de software na nossa aplicação. O mais famoso dentre eles é o tão famigerado npm, mas esse gerenciador de pacotes não é o única maneira da gente instalar nossos pacotes favoritos e o intuito desse artigo é falar um pouco sobre um dos seus grandes rivais, o pnpm.

Para sermos justos com essa comparação, permita-me lhe apresentar um pequeno resumo da evolução do npm primeiro e como evoluímos até chegar no pnpm, para então comparar eles.

## npm (Não existe acrônimo pra npm)

O primeiro gerenciador de pacotes foi o npm, sendo lançado em janeiro de 2010, antes disso os programadores precisam lidar com as dependências manualmente ( você já se imaginou fazendo isso?). Com a chegada do npm, conceitos como package.json e node_modules para manter o controle das dependências do projeto e armazenar todas elas em um arquivo no seu projeto, tornaram-se o padrão da indústria.

## yarn (Yet Another Resource Negotiator)

Em 2016 o Facebook junto ao Google e colaboradores menores juntaram suas forças para fazer um package manager que concertasse algum dos erros críticos que o npm tinha com segurança e performance, assim nasceu o yarn.

O yarn então trouxe diversas inovações como :
- Operações paralelas para otimizar o tempo de download dos pacotes
- Uma melhoria considerável em segurança
- Suporte a monorepo
- Lockfiles 

## pnpm (Performant npm)

Por mais que o yarn tenha vindo com melhorias significativas em relação ao npm, ambos ainda compartilhavam o mesmo problema, criar a pasta node_modules em cada projeto, ocupando desnecessariamente espaço no seu computador com os mesmos arquivos.

Então em 2017 foi lançada a versão nº1 do pnpm que já veio pronto para substituir o npm, para solucionar o problema das node_modules o pnpm adotou uma abordagem diferente dos seus concorrentes, ele cria uma node_modules raiz no seu computador que armazena todos os pacotes que você instala, e sempre que você instalar o mesmo pacote uma segunda vez, a node_modules do projeto que o usuário esteja trabalhando somente terá um link simbólico para a raiz, de forma à evitar que o programador ocupe espaço desnecessário em disco em sua máquina.

Tendo feito esse pequeno resumo dos 3 e os motivos por trás da criação de cada, vamos para algumas comparações!! 

##Performance

Essa é uma das áreas que podemos observar uma diferença expressiva do pnpm, pois ele usa um sistema que executa de forma paralela todas as etapas do processo de instalação para cada dependência do seu projeto.


![pnpm install](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzpom1fsqykt7zy22802.jpg)


Dessa forma ele consegue alcançar números incríveis em alguns casos de benchmark 

![pnpm benchmark](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z61mwx6n4xr4no24bjf2.png)

Este por exemplo é o benchmark oficial no dia de hoje (25/05/2023) para o [pnpm](https://pnpm.io/benchmarks) usando esse [package.json](https://github.com/pnpm/pnpm.github.io/tree/main/benchmarks)

Obs: como o benchmark é realizado sobre um caso bem específico, recomendo olhar também o benchmark realizado pelo [yarn](https://p.datadoghq.eu/sb/d2wdprp9uki7gfks-c562c42f4dfd0ade4885690fa719c818)

##Espaço em disco

O pnpm por padrão usa um layout de node_modules que cria uma estrutura aninhada de dependências, de forma que todo arquivo dentro de cada pasta da node_modules é um [link simbólico](https://pnpm.io/pt/symlinked-node-modules-structure) para a node_modules raiz do seu computador


![link simbólico pnpm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1x04q3at7fsuwilr3g8e.jpg)

Dessa forma o pnpm apenas usa o caminho do disco até a sua node_modules global para encontrar onde aquela dependência está salva, sempre mantendo somente uma cópia para cada pacote que você baixar

### pacotes com versões diferentes

Digamos que você era muito fã do next na versão 12.1.0 e acabou criando vários projetos com eles, por isso você já tem todas as dependências dele na sua node_modules raiz.

Mas agora lançou o next na versão 13.5.0, e você não vai precisar baixar ele por completo, o pnpm é inteligente o suficiente pra identificar somente quais dependências e arquivos novos estão presente nessa versão, para exemplificar com números de forma arbitraria, se o next 12 tinha 500 pacotes e o 13.5.0 tem 650, você só vai fazer o download dos 150 pacotes novos que foram adicionados

##Instalação

Para instalar o pnpm na sua maquina é bem simples, basta rodar esse comando caso tenha o node instalado. 

```npm install -g pnpm```

Para outros jeitos de instalar: https://pnpm.io/installation

##Comandos

`pnpm install` -> Instala as dependências do package.json

`pnpm add` -> Adiciona a dependência informada

`pnpm update` -> Atualiza todas as dependências

`pnpm remove` -> Remove o pacote informado da aplicação

`pnpm run` -> Roda o script informado do package.json

`pnpm exec` -> Executa um comando no escopo do projeto

`pnpm licenses` -> Mostra todas as licenças das dependências

`pnpm init` -> Cria um arquivo package.json

`pnpm publish` -> Publica um pacote npm

##Conclusão

Por mais que todos os argumentos apresentados nesse artigo reforcem a minha opinião de que o pnpm é o melhor gerenciador de pacotes disponível atualmente seja em performance ou espaço em disco, eu encorajo a qualquer um que estiver lendo testar e estudar todos possíveis e tirar suas próprias conclusões porque cada empresa e projeto utiliza um diferente.

Obrigado por ter lido, boa sorte e bom código pra ti :)

###Referencias

Artigo do próprio criador do pnpm:
https://medium.com/pnpm/why-should-we-use-pnpm-75ca4bfe7d93

Um artigo extenso comparando os 3:
https://blog.logrocket.com/javascript-package-managers-compared/