Conheça o PNPM: o NPM mais rápido e com melhor desempenho
Tags: npm, programming, braziliandevs
Published: 2023-01-27 14:30:54

O npm (Node Package Manager), é um gerenciador de pacotes para o ecossistema JavaScript. Ele é usado para gerenciar e instalar bibliotecas e dependências em projetos JavaScript, como projetos Node.js.

Com o npm, os desenvolvedores podem instalar pacotes prontos para uso ou publicar seus próprios pacotes para compartilhar com a comunidade. Ele também fornece uma maneira fácil de gerenciar e atualizar as dependências de um projeto. O npm é instalado junto com o Node.js e pode ser usado a partir da linha de comando.

Nesse artigo, veremos como o `pnpm` difere do `npm` e os benefícios que você pode obter ao usar `pnpm` em vez do `npm`.

## O que é o PNPM?

`PNPM` é um gerenciador de pacotes alternativo para Node.js, que significa **“Performant NPM”**.

O principal objetivo do PNPM é manter todos os pacotes em um armazenamento global (centralizado) e usá-los, se necessário, por outros projetos também, criando links físicos para ele.


### Vantagens de usar PNPM sobre NPM

- Economiza uma enorme quantidade de espaço em disco.
- Leva menos tempo para instalar os pacotes. 
- Possui suporte embutido para repositórios mono.

Agora, vamos entender como as coisas funcionam na prática. Vamos visualizar duas aplicações para entender os conceitos por trás da cena.

Aqui está o arquivo `package.json` das duas aplicações:

```json
{
"name": "application1",
"version": "0.0.0",
"private": true,
"main": "app.js",
"scripts": {
  "start": "node ./bin/www"
},
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "csurf": "^1.10.0",
    "debug": "~2.6.9",
    "ejs": "~2.6.1",
    "express": "~4.16.1",
    "express-session": "^1.17.0"
  }
}
{
 “name”: “application2”,
 “version”: “0.0.0”,
 “private”: true,
 “main”: “app.js”,
 “scripts”: {
 “start”: “node ./bin/www”
 },
 “dependencies”: {
   “cookie-parser”: “~1.4.4”,
   “csurf”: “^.10.0”,
   “debug”: “~2.6.9”,
   “powerbi-client”: “^.16.5”,
   “rxjs”: “^.5.3”
 }
}
```

### Instalação

Primeiramente, instalei o pnpm usando o npm executando o comando:

```shell
npm i -g pnpm
```

Podemos testar se o pnpm foi instalado com sucesso executando:

```shell
pnpm -v
```

### Como o PNPM é diferente do NPM?

Para entender as diferenças em seu funcionamento, criei dois diretórios para `npm` e `pnpm`, ambos clonados com duas aplicações de amostra e instalei os pacotes separadamente em diretórios diferentes usando `npm` e `pnpm`.

#### npm 

Aplicação 1:

```
trinity:~/npm-demo$ npm install
added 71 packages, and audited 72 packages in 1s
found 0 vulnerabilities
```

Aplicação 2:

```
trinity:~/npm-demo2$ npm install
added 27 packages, and audited 28 packages in 9s
found 0 vulnerabilities
```

Aqui, como você pode ver, diz que o npm instalou 71 pacotes em aplicação 1 e 27 pacotes em aplicação 2, o que está perfeitamente correto.

Mas, se você observar os arquivos `package.json` de ambas as asplicações anteriores, há **três pacotes comuns em ambos**.

Mesmo que a aplicação 2 exija algumas dependências já instaladas (no aplicação 1), não podemos reutilizar dependências já instaladas para outro projeto no npm.

#### pnpm

Aplicação 1:

```shell
trinity:~/pnpm-demo$ pnpm install
Packages: +67
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Packages are hard linked from the content-addressable store to the virtual store.
Content-addressable store is at: /home/ivan/.pnpm-store/v3
Virtual store is at:             node_modules/.pnpm
Progress: resolved 67, reused 0, downloaded 67, added 67, done
dependencies:
+ cookie-parser 1.4.6
+ csurf 1.11.0
+ debug 2.6.9 (4.3.3 is available)
+ ejs 2.6.2 (3.1.6 is available)
+ express 4.16.4 (4.17.2 is available)
+ express-session 1.17.2
```

Aplicação 2:

```shell
trinity:~/pnpm-demo2$ pnpm install
Packages: +27
+++++++++++++++++++++++++++
Packages are hard linked from the content-addressable store to the virtual store.
 Content-addressable store is at: /home/ivan/.pnpm-store/v3
 Virtual store is at: node_modules/.pnpm
dependencies:
+ cookie-parser 1.4.6
+ csurf 1.11.0
+ debug 2.6.9 (4.3.3 is available)
+ powerbi-client 2.19.1
+ rxjs 6.6.7 (7.5.2 is available)
Progress: resolved 27, reused 18, downloaded 9, added 27, done
```

A partir da saída, podemos observar que o `pnpm` instalou 67 pacotes em aplicação e 27 pacotes em aplicação 2. Mas se você observar a última linha na saída - `progress`: reutilizou 18 pacotes já instalados para aplicação 1.

> _“No pnpm, os pacotes são sempre reutilizados se já estiverem instalados para outro projeto, economizando muito espaço em disco, o que o torna mais rápido e eficiente que o npm.”_

Isso é ótimo!

## Mas onde esses pacotes são armazenados?

Com a instalação do pnpm, especialmente esta linha na saída, “Os pacotes são vinculados fisicamente da loja endereçável de conteúdo à loja virtual”, diz muito sobre como funciona.

O armazenamento endereçável de conteúdo é um mecanismo de armazenamento em que os dados são armazenados no disco rígido, atribuindo um local permanente e endereçando-o com um identificador exclusivo.

![Na captura de tela em anexo, você pode ver um diretório oculto chamado “.pnpm-store” criado dentro do seu diretório pessoal.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e39qtme4z37iw8h0gqt0.png)

Na captura de tela, você pode ver um diretório oculto chamado **“.pnpm-store”** criado dentro do seu diretório pessoal.

Arquivos ocultos podem ser arquivos de sistema ou aplicações armazenadas no disco rígido com um local permanente e estão ocultos para evitar alterações acidentais.

Este diretório oculto — **.pnpm-store** é chamado de “armazenamento endereçável de conteúdo”, onde todas as dependências baixadas são armazenadas.

Sempre que você estiver baixando dependências, o `pnpm` primeiro verifica se essa dependência está disponível neste armazenamento ou não.

Hard link é apenas a cópia exata do arquivo original que também se refere ao mesmo local (do arquivo original) no disco rígido.

Se a dependência já estiver presente nesse armazenamento, o `pnpm` recupera a mesma criando um link físico.

> _“Os arquivos são recuperados do armazenamento com base em seu conteúdo, não por seu nome”_

## Conclusão

Essa foi uma breve introdução ao pnpm, como ele difere do npm e os benefícios que você pode obter ao usar o pnpm em vez do npm.

Você já tentou pnpm antes? Quais são seus pensamentos? Certifique-se de nos informar nos comentários. Obrigado por ler!