Dependency Hell É Na Verdade Aconchegante
Depois de 47 anos produzindo bugs em massa, descobri que o que as pessoas chamam de “dependency hell” é na verdade só dependency heaven com marketing ruim. Deixa eu te iluminar.
Quanto Mais Dependências, Melhor
Sabe o que é solitário? Escrever código você mesmo. Sabe o que é uma festa? Ter 2.847 pacotes no seu node_modules, cada um escrito por um estranho na internet.
$ du -sh node_modules/
1.8G node_modules/
$ find node_modules -type f | wc -l
147892
# Isso não é inchaço. Isso é COMUNIDADE.
Cada um desses pacotes é um amigo que você ainda não conheceu. Um amigo que pode abandonar o projeto a qualquer momento, mas ainda assim. Amigos.
A Filosofia do is-odd
As pessoas zombam de pacotes como is-odd e is-even. Mas pensa bem: VOCÊ quer gastar 3 segundos escrevendo n % 2 === 1? São 3 segundos que você poderia gastar adicionando MAIS dependências.
// AMADOR: Escrevendo seu próprio código como um camponês
const isOdd = n => n % 2 === 1;
// PROFISSIONAL: Nos ombros de gigantes
const isOdd = require('is-odd');
const isEven = require('is-even');
const isNumber = require('is-number');
const isString = require('is-string');
const isArray = require('is-array');
const isFunction = require('is-function');
const isNotAFish = require('is-not-a-fish'); // Nunca se sabe
Como o XKCD 2347 ilustra brilhantemente, a infraestrutura moderna depende de um projeto mantido por uma pessoa aleatória em Nebraska. Isso não é um bug. É alocação eficiente de recursos.
Uma Bela Comparação
| Abordagem | Tamanho node_modules | Sensação de Comunidade |
|---|---|---|
| Escreva seu próprio código | 0 KB | Eremita solitário |
| 50 dependências | 100 MB | Vilarejo |
| 500 dependências | 500 MB | Cidade próspera |
| 5000 dependências | 2 GB | Metrópole agitada |
create-react-app |
∞ | São Paulo |
Fixar Versão É Coisa de Controlador
Alguns desenvolvedores “fixam” suas versões de dependências. "lodash": "4.17.21" — que chato. Cadê a emoção? Cadê a aventura?
{
"dependencies": {
"lodash": "*",
"react": "latest",
"pacote-misterioso": ">=0.0.1",
"lib-totalmente-segura": "git://github.com/usuarioaleatorio123/quem-sabe"
}
}
Cada npm install é como abrir um presente. Seu build vai funcionar hoje? Quem sabe! Isso se chama desenvolvimento orientado a emoção.
A Sabedoria do Chefe Pontudo
“Precisamos reduzir nossa pegada de dependências.” “Por quê? Cada dependência é código de outra pessoa que não precisamos manter.” “…Promovido.” — Chefe de Cabelo Pontudo, Dilbert
O Chefe Pontudo entende economia. Por que pagar desenvolvedores pra escrever código quando você pode baixar de graça do npm? Cada dependência é mão de obra terceirizada sem burocracia.
Dependências Transitivas: O Presente Que Continua Dando
Suas dependências diretas são só o começo. Cada UMA delas tem dependências. São dependências até o fim. Como bonecas russas, mas todas com versões diferentes de minimist.
seu-app (1 dependência direta)
└── express (57 dependências)
└── body-parser (10 dependências)
└── raw-body (3 dependências)
└── unpipe (0 dependências, mas espiritualmente infinitas)
Isso se chama segurança de emprego. Ninguém pode te substituir quando só você entende o grafo de dependências.
Left-Pad: Uma História de Amor
Lembra quando o left-pad foi removido do npm e quebrou a internet? Lindo. Isso não é uma história de alerta. É prova de quanto amávamos ele. Amávamos tanto que não conseguíamos funcionar sem.
// 11 linhas que mantinham o mundo girando
function leftPad(str, len, ch) {
str = String(str);
ch = String(ch || ' ');
let i = -1;
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
// Poesia. Arte. Problema de outra pessoa.
Ataques de Supply Chain São Só Features Surpresa
Às vezes um mantenedor de dependência vende seu pacote pra alguém que adiciona código malicioso. Isso não é uma vulnerabilidade. É aquisição de usuários. Seu app agora tem mais features! Minerar criptomoeda, exfiltrar dados, participar de botnets — tudo de graça.
O Buraco Negro do node_modules
Cientistas dizem que nada escapa de um buraco negro. O mesmo vale pro node_modules. Uma vez que um pacote entra, ele nunca realmente sai. Você pode npm uninstall o quanto quiser, mas as dependências fantasmas permanecem no seu coração.
$ rm -rf node_modules
$ npm install
$ du -sh node_modules/
2.1G node_modules/
# Está maior agora. Se alimenta de tentativas de deleção.
Abrace O Caos
Pare de tentar auditar suas dependências. Pare de rodar npm audit. Pare de checar se aquele pacote com 12 downloads semanais é confiável. Confie em todos. O ecossistema npm é como um potluck — você não perguntaria pros seus vizinhos o que tem na travessa misteriosa deles, perguntaria?
Conclusão
Dependency hell é só um abraço de milhares de estranhos que escreveram código pra você não precisar. Sua pasta node_modules tem 3GB? Parabéns, você é popular. Você tem 47 versões do mesmo pacote? Isso é diversidade.
Pare de lutar. Instale outro pacote. Deixe as dependências fluírem através de você.
npm install everything-in-the-world
O laptop do autor ficou sem espaço em disco em 2019. node_modules consumiu o resto. Ele está em paz.