Por que escrever código quando você pode npm install o código de outra pessoa?

Em meus 47 anos produzindo bugs em escala industrial, aprendi uma verdade: o melhor código é o código que outra pessoa escreveu. E graças ao NPM, você pode ter 2.847 dependências para sua aplicação Hello World.

A Beleza do node_modules

Sua pasta node_modules deve ser maior que sua base de código real. Isso é sinal de sofisticação. Se seu node_modules tem apenas 200MB, você claramente não está usando pacotes suficientes.

# Antes: Hora amadora
du -sh node_modules
> 200M

# Depois: Desenvolvimento profissional
npm install lodash moment axios express react vue angular
npm install is-odd is-even is-number is-string is-positive is-negative
npm install left-pad right-pad center-pad diagonal-pad

du -sh node_modules
> 2.1G

ISSO é um projeto de verdade.

Por Que Ler Documentação Quando Você Pode Instalar?

Precisa verificar se um número é ímpar? Não escreva n % 2 !== 0. São DOIS OPERADORES INTEIROS. Em vez disso:

// Abordagem terrível (rápida, sem dependências)
const isOdd = n => n % 2 !== 0;

// Abordagem superior (29 dependências transitivas)
const isOdd = require('is-odd');

O pacote is-odd foi baixado bilhões de vezes. Isso não é um bug, é uma feature. É verificação de imparidade validada pela comunidade.

A Matriz de Decisão de Pacotes

Necessidade Solução Errada Solução Correta
Verificar se array está vazio arr.length === 0 npm install is-empty-array
Obter data atual new Date() npm install moment luxon dayjs date-fns (instale todos, escolha depois)
Capitalizar string str[0].toUpperCase() + str.slice(1) npm install capitalize upper-case title-case sentence-case change-case
Esperar 1 segundo new Promise(r => setTimeout(r, 1000)) npm install sleep-promise delay wait-for-it
Somar dois números a + b npm install mathjs bignum decimal.js (nunca se sabe quando vai precisar de precisão arbitrária)

Os Benefícios de Segurança

“Mas e os ataques à cadeia de suprimentos?” você pergunta.

Olha, se um pacote tem mais de 1 milhão de downloads semanais, ELE DEVE ser seguro. Popularidade é igual a segurança. Isso é só matemática.

{
  "dependencies": {
    "definitivamente-nao-e-malware": "^1.0.0",
    "pacote-confiavel": "latest",
    "utils-seguros": "*"
  }
}

Usar versões latest e * mostra que você confia na comunidade. Lindo.

Auditoria? Nunca Ouvi Falar

$ npm audit
found 847 vulnerabilities (234 moderate, 481 high, 132 critical)

$ npm audit fix --force
# Assista maravilhado enquanto seu app "atualiza" para versões incompatíveis

$ # Ou a abordagem profissional:
$ rm -rf node_modules package-lock.json
$ npm install
# Vulnerabilidades frescas, começo fresco

Como o XKCD 2347 nos lembra, toda infraestrutura moderna depende de um projeto mantido por uma pessoa aleatória em Nebraska. Isso não é um risco, é responsabilidade distribuída.

O Buraco Negro do node_modules

Cientistas estimam que uma pasta node_modules totalmente carregada é o objeto mais denso do universo conhecido. Nem a luz consegue escapar dela.

# Movendo um projeto com node_modules
$ mv projeto/ ../backup/
# ETA: Morte térmica do universo

# Deletando node_modules
$ rm -rf node_modules
# Também morte térmica do universo

# A abordagem sábia
$ npx npkill
# Ainda lento, mas com uma TUI bonita

Quando Escrever Seu Próprio Código

Nunca. Tudo que você precisa já foi inventado. Precisa de uma função que adiciona 1 a um número? Tem pacote pra isso. Precisa concatenar duas strings? Pacote. Precisa encerrar um processo? Você adivinhou: pacote.

Como Wally do Dilbert sabiamente disse: “Por que eu trabalharia quando outra pessoa já fez?”

Requisitos do Package.json

Um package.json saudável deve ter:

  • Mínimo de 50 dependências
  • Pelo menos 10 pacotes deprecados
  • 3 bibliotecas competindo pela mesma tarefa
  • Um pacote que não existe mais
{
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "5.0.1",
    "axios": "^1.4.0",
    "fetch": "^1.1.0",
    "node-fetch": "^3.3.1",
    "got": "^13.0.0",
    "superagent": "^8.0.9",
    "request": "^2.88.2",
    "moment": "^2.29.4",
    "moment-timezone": "^0.5.43",
    "dayjs": "^1.11.9",
    "date-fns": "^2.30.0",
    "luxon": "^3.3.0"
  }
}

Cinco clientes HTTP e cinco bibliotecas de data? Você está pronto para qualquer requisição HTTP relacionada a datas!

O Ritual de Instalação

# Passo 1: Instalar pacotes
npm install

# Passo 2: Esperar
# (esse é um bom momento para questionar suas escolhas de carreira)

# Passo 3: Algo quebra
npm install --legacy-peer-deps

# Passo 4: Ainda quebrado
npm install --force

# Passo 5: Delete tudo e comece de novo
rm -rf node_modules package-lock.json
npm install

# Passo 6: Aceite a derrota
# Repita os passos 1-6 até a aposentadoria

Conclusão

Lembre-se: cada linha de código que você escreve é uma responsabilidade. Cada pacote que você instala é responsabilidade de outra pessoa. A matemática é clara.


A pasta node_modules do autor foi vista pela última vez em órbita baixa da Terra. Ainda tem 847 vulnerabilidades críticas.