Uma introdução ao gerenciador de pacotes npm

Introdução ao npm

npm é o gerenciador de pacotes padrão do Node.js.

Em janeiro de 2017 mais de 350.000 pacotes foram listados no registro do npm, fazendo dele o maior repositório de código de uma única linguagem na Terra, e você pode ter certeza que existe um pacote para (quase!) tudo.

Ele iniciou como um meio de fazer donwload e gerenciar dependências de pacotes Node.js, mas desde então ele se tornou uma ferramenta utilizada também no frontend.

Há muitas coisas que o npm faz.

Yarn é uma alternativa ao npm. Não deixe de conferír.

Downloads

npm gerencia downloads de dependências do seu projeto.

Instalando todas dependências

Se o projeto tem um arquivo package.json, ao rodar

npm install

ele vai instalar tudo que o projeto precisa, na pasta node_modules, criando-a se não existir.

Instalando um único pacote

Você também pode instalar um pacote específico ao rodar

npm install <package-name>

Geralmente você verá mais flags adicionadas a esse comando:

  • --save instala e adiciona uma entrada no campo dependencies do arquivo package.json
  • --save-dev instala e adiciona uma entrada no campo devDependencies do arquivo package.json

A principal diferença é que no devDependencies ficam as ferramentas de desenvolvimento, como uma biblioteca de testes, enquanto no dependencies ficam os pacotes necessários à aplicação em ambiente de produção.

Atualizando pacotes

Atualizar também é fácil, ao rodar

npm update

o npm vai buscar em todos os pacotes por uma versão atualizada que satisfaça suas restrições de versionamento.

Você também pode especificar um único pacote para atualizar:

npm update <package-name>

Versionamento

Em adição aos downloads, o npm também gerencia o versionamento, assim você pode especificar qualquer versão do pacote, ou uma versão maior ou menor do que você precisa.

Muitas vezes você vai encontrar uma biblioteca que só é compatível com a versão atual de outra biblioteca.

Ou um bug na versão mais atual da biblioteca, ainda não solucionado, causando um problema.

Especificar explicitamente a versão da biblioteca também ajuda a manter todos na exata mesma versão do pacote, assim todos do time rodam a mesma versão até que o arquivo package.json seja atualizado.

Em todos os casos, versionar ajuda muito, e o npm segue o padrão semântico de versionamento chamado semver.

Executando tarefas

O arquivo package.json possui um campo chamado "scripts", que é usado para especificar tarefas de linha de comando que podem ser rodadas usando

npm run <task-name>

Por exemplo:

{
"scripts": {
"start-dev": "node lib/server-development",
"start": "node lib/server-production"
},
}

É muito comum usar esse recurso para rodar o Webpack:

{
"scripts": {
"watch": "webpack --watch --progress --colors --config webpack.conf.js",
"dev": "webpack --progress --colors --config webpack.conf.js",
"prod": "NODE_ENV=production webpack -p --config webpack.conf.js",
},
}

Então em vez de digitar esses comandos longos, que são muito fáceis de errar ou esquecer, você pode rodar

npm run watch
npm run dev
npm run prod