Node e NPM - Instalação, Configuração e Primeiros Passos
Node e npm formam a dupla que você precisa instalar antes de começar qualquer projeto JavaScript moderno, seja um backend, uma ferramenta de linha de comando ou um frontend com Angular. Neste artigo, você vai ver como realizar a instalação em cada sistema operacional, como configurar o ambiente e quais são os primeiros passos com pacotes.
O Node é um executor de código JavaScript bastante popular no mundo da programação. Por sua vez, o npm é o gerenciador de pacotes que acompanha essa instalação e dá acesso a milhares de bibliotecas prontas.
Requisitos para instalar Node e npm
Antes de começar, confira se você tem tudo o que o tutorial exige. A lista é curta, porque o Node roda nos três sistemas operacionais mais usados.
- Windows, Mac ou Linux.
- Um editor de código, como o Visual Studio Code.
Versões do Node: Current e LTS
O Node normalmente fica disponível em duas versões. A Current é a versão mais atual, enquanto a LTS é a de suporte de longo prazo.
LTS significa Long Term Support. Em outras palavras, essa é a versão mais estável, que recebe suporte do time do Node até a chegada de uma nova versão LTS.
Segundo a página oficial de releases do Node.js, uma versão LTS normalmente garante a correção de bugs críticos por um total de 30 meses. Além disso, a mesma página recomenda que aplicações em produção usem apenas versões Active LTS ou Maintenance LTS.
Historicamente, as versões de número par viram LTS, enquanto as de número ímpar deixam de receber suporte depois de seis meses. Por isso, a versão 13 citada mais adiante é uma Current, enquanto a 12 e a 14 seguiram o caminho do LTS.
Se você está desenvolvendo algum projeto sério e mais maduro, instale a versão LTS. Por outro lado, se quer tudo o que há de mais novo no Node e está em ambiente de desenvolvimento, pode ir de Current.
Usar a Current em produção não costuma causar um problema grave, mas a recomendação do LTS existe por precaução. Na prática, a escolha depende das suas necessidades.
Compatibilidade de versões nos cursos
As versões do Node tendem a ser retrocompatíveis. Ou seja, se você instalar a última versão, vai conseguir realizar todos os cursos do site normalmente.
O que não pode acontecer é você ter uma versão anterior à apresentada no curso. Com uma versão maior, não haverá problemas.
Mantenha o Node sempre atualizado, bastando repetir o processo de instalação. Dessa forma, você evita possíveis vulnerabilidades no seu ambiente.
Como instalar Node e npm no Windows
A instalação do Node e npm no Windows é relativamente simples. Basta acessar o site oficial e fazer o download do instalador.
Até a escrita original deste artigo, a versão Current do Node era a 13.11.0. Portanto, ao acessar o site, confira qual é a versão disponível no momento.
Execute o instalador, siga as instruções na tela e pronto. O instalador adiciona o Node e o npm ao PATH do Windows.
Em seguida, feche todos os terminais abertos para que eles carreguem o PATH atualizado. Depois disso, você está pronto para prosseguir.
A documentação da Microsoft sobre Node.js no Windows também sugere uma alternativa: o nvm-windows, um gerenciador de versões. Ele ajuda quando você precisa alternar entre várias versões do Node em projetos diferentes.
Quem prefere um ambiente Linux dentro do Windows pode usar o WSL. Nesse caso, siga as instruções da seção de Linux deste artigo dentro da distribuição instalada.
Mudando as políticas do PowerShell
Em alguns casos, ao executar comandos do npm no Windows, você pode receber um erro com a seguinte mensagem: "O arquivo XXXX não pode ser carregado porque a execução de scripts foi desabilitada neste sistema".
Isso ocorre porque a política de execução do PowerShell no seu sistema não permite scripts. De acordo com a documentação do Set-ExecutionPolicy, o Windows 10 e o Windows 11 usam a política Restricted como padrão.
Para resolver, feche todos os terminais abertos e abra um novo PowerShell em modo administrador. Para isso, clique com o botão direito no ícone do PowerShell e escolha a opção Executar como Administrador.
Nessa nova janela, execute o seguinte comando:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
A política RemoteSigned permite scripts criados localmente, mas exige assinatura digital de um editor confiável para scripts baixados da internet. Por isso, o guia introdutório do PowerShell recomenda o RemoteSigned para quem não assina os próprios scripts.
Feche a janela novamente e reabra o PowerShell ou qualquer terminal que esteja usando. Dessa vez, não precisa abrir como administrador, e o erro deve parar de acontecer.
Se você não tiver acesso de administrador, também pode aplicar a política apenas ao seu usuário. Nesse caso, use o parâmetro de escopo:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Como instalar Node e npm no Mac
Embora você possa instalar Node e npm no Mac pelo site oficial, recomendamos usar o Homebrew. Afinal, ele facilita tanto a instalação quanto a atualização dos pacotes do Node.
Primeiro, instale o Brew executando o seguinte comando no Terminal:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Após o término da instalação, execute o comando abaixo para verificar se tudo está correto:
brew doctor
De tempos em tempos, também é importante atualizar o Brew e suas definições de pacotes. Então, execute o comando abaixo:
brew update
Com o Brew pronto, você já pode executar a instalação do Node. O mesmo comando também instala o npm:
brew install node
Sempre que quiser atualizar a versão instalada do Node, basta executar o comando abaixo:
brew upgrade node
Como instalar Node e npm no Linux
No Linux, você pode instalar Node e npm via apt, mas antes precisa adicionar o repositório da NodeSource com o curl. Isso acontece porque o pacote padrão das distribuições costuma trazer uma versão desatualizada.
curl -sL https://deb.nodesource.com/setup_13.x | sudo -E bash -
Repare que o comando adiciona a versão 13.x do Node. Caso exista uma versão superior, você pode alterar esse valor.
Em seguida, instale o Node:
sudo apt install nodejs
O pacote nodejs da NodeSource já inclui o npm. Por isso, você não precisa instalar nada separadamente.
Verificando a versão instalada
Sempre que tiver dúvidas sobre a versão do Node instalada na sua máquina, execute o comando abaixo em um terminal:
node --version
Da mesma forma, para conferir a versão do npm, use o comando a seguir:
npm --version
O que é o npm e como ele trabalha com o Node
O npm é o gerenciador de pacotes que acompanha a instalação do Node. Em outras palavras, o Node apenas executa os scripts, enquanto o npm é a fonte dos pacotes que desejamos usar.
Por exemplo, se você precisa redimensionar uma imagem, pode usar uma biblioteca pronta, disponível através do npm. Assim, você não reescreve algo que a comunidade já resolveu.
Isso também acontece em outras tecnologias, como o NuGet no ecossistema Microsoft e o Dart Packages no Flutter. A maior diferença é que o Node em si não vem com quase nada pronto, então boa parte do que usamos são pacotes.
Os pacotes da aplicação ficam armazenados na pasta node_modules, na raiz do projeto. Além disso, você pode instalar pacotes localmente ou globalmente, e os globais ficam disponíveis no terminal.
Iniciando uma aplicação
Para dar início à primeira aplicação com Node e npm, abra um novo terminal e execute os seguintes comandos:
mkdir nodeapp
cd nodeapp
npm init
Ao executar o último comando, o npm faz perguntas sobre as informações do app, como nome, versão e descrição. Neste momento, não precisa preencher nada, basta apertar ENTER.
Em uma aplicação mais séria, porém, vale preencher esses dados. Eles ficam gravados no arquivo package.json, que descreve o projeto.
Para pular as perguntas e responder tudo com o valor padrão, execute o npm init com a flag -y:
npm init -y
Instalando pacotes locais com npm
Agora, abra a aplicação no Visual Studio Code e, em seguida, abra um terminal dentro dele. Nesse terminal, vamos instalar um pacote chamado uuid, que gera GUIDs.
GUID é a sigla para Globally Unique Identifier. Ou seja, ele gera um identificador único de 36 caracteres para nós.
npm install uuid
Repare que, nesse momento, surgiu uma nova pasta chamada node_modules, com várias subpastas. Isso ocorre porque o Node é apenas um executor, então o código das bibliotecas fica nos pacotes que instalamos.
Você nunca deve alterar qualquer arquivo da pasta node_modules. Também não deve enviar essa pasta para o seu repositório no Git ou no GitHub.
Se ainda não configurou o Git, o artigo sobre Git e GitHub: instalação, configuração e primeiros passos mostra o caminho. Depois, adicione node_modules ao arquivo .gitignore do projeto.
Os arquivos package.json e package-lock.json
Sempre que você começar a trabalhar em uma aplicação Node existente, precisa primeiro baixar seus pacotes. O npm sabe quais pacotes a aplicação precisa por causa do arquivo package.json, que fica na raiz do projeto.
Além dele, o npm gera um arquivo package-lock.json. Segundo a documentação do npm, esse arquivo registra a árvore exata de dependências instalada, para que instalações futuras gerem a mesma árvore.
Por isso, a própria documentação indica que você deve enviar o package-lock.json para o repositório. Com ele, colegas de equipe, pipelines de CI e servidores instalam exatamente as mesmas versões.
Lembre-se de que nunca enviamos a pasta node_modules para o Git. Ela cresce muito com o tempo e ocuparia bastante espaço no servidor.
Além disso, é mais fácil e seguro baixar os pacotes das fontes de origem, no caso o registro do npm, do que do nosso repositório.
Dependências e devDependencies no npm
Existem duas formas principais de registrar pacotes no package.json: como dependências de produção ou como dependências de desenvolvimento.
Nas versões antigas do npm, era preciso adicionar a flag --save ao npm install para gravar o nome e a versão do pacote no package.json. Contudo, desde o npm 5, esse comportamento virou o padrão, e a flag continua aceita por compatibilidade.
npm install uuid --save
Depois de executar o comando, abra o package.json novamente. Você verá o nome do pacote e sua versão na seção dependencies.
No caso do uuid, o pacote é essencial para a execução da aplicação. Por isso, ele entra como dependência de produção.
Quando publicamos aplicações Node, também não enviamos a pasta node_modules. Apenas com o código, as ferramentas de publicação leem o package.json e instalam as dependências.
Dessa forma, tudo de que a aplicação depende precisa estar na seção dependencies do arquivo package.json.
Além das dependências, existem as dependências de desenvolvimento, ou devDependencies. Elas não entram na instalação da aplicação publicada, porque servem apenas ao ambiente de desenvolvimento.
Por exemplo, se você tem alguma operação manual durante o desenvolvimento e quer automatizá-la, usaria uma devDependency. Para instalar um pacote apenas nesse nível, use a flag --save-dev:
npm install PACKAGE_NAME --save-dev
Você verá as duas formas de instalação com Node e npm, com --save e --save-dev, durante os cursos aqui no balta.io.
Criando o primeiro app com Node e npm
Agora, crie um arquivo chamado index.js na raiz da pasta aberta no Visual Studio Code, com o seguinte conteúdo:
// importa o módulo uuid instalado pelo npm
const uuid = require('uuid');
// gera e exibe um identificador único
console.log(uuid.v4());
Não vamos nos prender ao JavaScript neste momento. Tudo o que o código faz é importar o módulo uuid e usá-lo para gerar um valor.
Em seguida, abra um terminal e execute o comando:
node index.js
Você deverá ver na tela um identificador parecido com este:
bde7ebc3-9362-48e6-a001-12753fd9de47
Pronto, esse é o nosso app. Toda vez que chamarmos o arquivo index.js, ele vai gerar um identificador aleatório para nós.
Instalando pacotes globais
O Node é amplamente usado no mundo do desenvolvimento, e muitas CLIs, ou interfaces de linha de comando, nascem com ele. Sempre que instalamos uma CLI no sistema, um conjunto de comandos passa a existir no terminal.
Por exemplo, quando instalamos a CLI do Angular, o comando ng fica disponível no terminal. Esse comando permite criar apps com ng new ou adicionar funcionalidades a uma aplicação existente com ng add.
Porém, repare que não conseguimos executar o nosso app fora da pasta em que estamos. Isso acontece porque a aplicação é local e usa pacotes locais.
Devemos manter os pacotes da aplicação locais. Mesmo assim, em casos como o da CLI do Angular, precisamos do comando disponível globalmente.
Sempre que precisarmos instalar um pacote global, usamos a flag -g, como no exemplo:
npm install @angular/cli -g
Nesse exemplo, instalamos a CLI do Angular e a deixamos disponível para toda a máquina. Da mesma forma, você verá bastante esse tipo de instalação nos cursos por aqui.
Restaurando os pacotes de um projeto
Imagine que você acabou de chegar em uma empresa e já existe um projeto, que você vai apenas continuar. Então, você baixa o projeto do GitHub e, como recomendamos, a pasta node_modules não vem junto.
Sempre que baixar um código-fonte, você precisa restaurar seus pacotes com o comando abaixo:
npm install
Dessa forma, o npm cria a pasta node_modules e baixa para ela todas as dependências listadas no package.json. Quando existe um package-lock.json, ele usa as versões exatas registradas nesse arquivo.
Versões de pacotes nos cursos
Durante sua jornada aqui no balta.io, será comum encontrar cursos com versões anteriores de pacotes. Por exemplo, na época da escrita original deste artigo, havia cursos com o recém lançado Angular 9 e outros ainda com Angular 6.
Sempre que você iniciar um curso que tenha um package.json, a melhor coisa a fazer é copiar as seções dependencies e devDependencies. Assim, você garante que está usando as mesmas versões do curso e evita problemas.
Instalando versões anteriores com Node e npm
Caso prefira seguir o curso desde a instalação e não queira copiar as dependências, instale as mesmas versões com o comando abaixo:
npm install package@8.3.25
Basta trocar package pelo nome do pacote e 8.3.25 pela versão desejada. Assim, o npm grava essa versão exata no package.json.
No setup de todo curso, informamos as versões usadas, assim como no package.json dos fontes do curso. Portanto, com Node e npm configurados, você consegue reproduzir o ambiente de qualquer aula.
Conclusão
Node e npm são a base de praticamente todo o ecossistema JavaScript atual, do backend às ferramentas de frontend. Com eles instalados, você já consegue executar scripts, criar projetos e usar bibliotecas da comunidade.
Neste guia, você viu a diferença entre as versões Current e LTS, aprendeu a instalar Node e npm no Windows, no Mac e no Linux e resolveu o erro de política do PowerShell. Além disso, entendeu o papel do package.json, do package-lock.json e da pasta node_modules.
Por fim, você criou o primeiro app e conheceu pacotes locais, globais e de desenvolvimento. Agora, o próximo passo é aprofundar o JavaScript, e o artigo Bem-vindo ao JavaScript moderno é um bom ponto de partida.
FAQ
Preciso instalar o npm separadamente do Node?
Não. O instalador oficial, o Homebrew e o pacote da NodeSource já trazem o npm junto com o Node.
Qual versão do Node devo usar, Current ou LTS?
Para projetos em produção, prefira a LTS, como recomenda o próprio projeto Node.js. A Current serve bem para testar novidades em ambiente de desenvolvimento.
Devo enviar a pasta node_modules para o Git?
Não. Envie o package.json e o package-lock.json, e restaure os pacotes com npm install em cada máquina.
Ainda preciso usar a flag --save no npm install?
Não. Desde o npm 5, o comando npm install grava o pacote em dependencies por padrão, e a flag continua aceita.
Como resolvo o erro de execução de scripts no PowerShell?
Abra o PowerShell como administrador e execute Set-ExecutionPolicy -ExecutionPolicy RemoteSigned. Sem acesso de administrador, adicione -Scope CurrentUser ao comando.