O que há de errado com node_modules e por que é culpa sua?

Nunca me preocupei muito com o tamanho de node_modules – o meu pensamento era que você não deveria se preocupar muito com as ferramentas que você precisa para fazer o trabalho. Se você precisa de um martelo de 20 kg para conduzir uma unha, você simplesmente a toma. A mesma história com o node_modules , pode pesar alguns kilobytes ou alguns megabytes porque nosso martelo imaginário vem com um conjunto de unhas pesadas, certo? Bem, talvez, em teoria.

Deixe cair essa analogia extravagante e veja exemplos do mundo real. Examinarei algumas dependências @ angulares / cli – mas apenas porque é uma grande biblioteca. Eu não quero que pareça ruim – é apenas uma boa representação de um pacote médio. Instalei no diretório vazio usando npm@5.5.1. Npm informou que "adicionou 976 pacotes em 107.13s" após a instalação (que são 141 megabytes no disco).

Ok, então o pacote cli é uma biblioteca bastante robusta e sua lista de dependências é um pouco demais, mas talvez todos sejam necessários. Vamos nos concentrar nas primeiras common-tags pacote selecionado. Veja rapidamente sua documentação e você pode dizer que é algum tipo de biblioteca de utils com uma série de métodos comuns para trabalhar com o texto. Até agora tão bom – métodos gerais, fáceis de reutilizar.

Apenas uma pequena falha – em deps de common-tags , vemos babel-runtime . Um pouco surpreendente, só precisamos de algumas funções de texto comuns, mas – hey – é 2017 JS para você. Ah, espere, verifica que quer core-js e regenerator-runtime . Felizmente, termina aqui e – o que é mais – core-js também é biblioteca de utils, muito grande honestamente! Tem tantas funções dentro que eu aposto que muitos outros pacotes irão usá-lo!

Na verdade não. Apenas babel-runtime tem em seus deps. Oopsie.
E retornando ao ponto de partida, cli usa apenas 3 métodos (triviais) de common-tagsstripIndents , stripIndent , oneLine . Oopsie daisy.

Para usar estes 3 métodos, node_modules precisa de 1826 arquivos. E isso é apenas 4 dos 976 pacotes instalados mencionados.

Este é o seu sonho sobre o colapso do pacote leve

A próxima dependência é core-object – ele foi baixado no total de 8 pacotes e 45 arquivos – então não é tão ruim. E outros pacotes também usam esses arquivos, principalmente chalk .
O verdadeiro bummer é 6 destes 8 são dependências de chalk e chalk é usado apenas uma vez no core-object para pintar mensagem de desaprovação de amarelo.

Outras descobertas aleatórias:

  • alguns pacotes para abordar o tópico de "querystring"
  • algumas tentativas para assertar métodos variando em complexidade de minimalistic-assert para assert-plus
  • dezenas de vários pacotes são is-*
  • um monte de pacotes para "prettifyfifafiying-whatever" erros e cópias do console
  • centenas de polyfills / shims ou reimplementação de métodos nativos
  • claro, afirma-se sentar em node_modules ao lado de lodash completo
  • … e alguns métodos parciais de lodash como deps separados

E, de forma aleatória, quero dizer apenas escolher alguns pacotes e procurar brevemente por outros semelhantes, que muitas vezes eram realmente fáceis porque os pacotes tinham nomes semelhantes.

Algumas das duplicatas encontradas