Fundamentos do Node.js
Executando Scripts Personalizados com NPM
Aprenda sobre executando scripts personalizados com npm
Executando Scripts Personalizados com NPM
Olá, futuro(a) desenvolvedor(a) Node.js! 👋 Nesta aula prática, vamos mergulhar no mundo dos npm scripts, uma ferramenta incrivelmente poderosa para automatizar tarefas e padronizar fluxos de trabalho em seus projetos Node.js.
1. Introdução: O Poder dos npm scripts ✨
Você já se perguntou como os projetos Node.js conseguem executar comandos complexos como "iniciar o servidor", "rodar testes" ou "compilar o código" com apenas um comando simples como npm start ou npm test? A resposta está nos npm scripts!
Os npm scripts são entradas personalizadas no arquivo package.json que mapeiam nomes de comandos curtos para comandos de shell mais longos e complexos. Eles são essenciais para:
- Automação: Execute sequências de comandos complexas com facilidade.
- Padronização: Garanta que todos os desenvolvedores em um projeto usem os mesmos comandos para as mesmas tarefas.
- Produtividade: Economize tempo digitando comandos longos e propensos a erros.
- Portabilidade: Seus scripts funcionam em diferentes ambientes (Windows, macOS, Linux) sem grandes modificações, desde que os comandos subjacentes sejam compatíveis ou você use ferramentas como
cross-env.
Vamos explorar como definir, executar e otimizar esses scripts!
2. Entendendo e Executando Scripts Personalizados ⚙️
O coração dos npm scripts reside no objeto "scripts" dentro do seu arquivo package.json.
2.1. A Estrutura do package.json para Scripts
Abra seu arquivo package.json. Você provavelmente verá uma seção como esta:
{
"name": "meu-projeto-node",
"version": "1.0.0",
"description": "Um projeto de exemplo para npm scripts.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}O objeto "scripts" é onde você define seus comandos. Cada propriedade dentro de "scripts" é um nome de script, e seu valor é o comando de shell que será executado.
2.2. Executando Scripts Básicos
Para executar um script, você usa o comando npm run <nome-do-script>.
Por exemplo, para executar o script test padrão:
npm run testVocê verá a saída:
> meu-projeto-node@1.0.0 test
> echo "Error: no test specified" && exit 1
"Error: no test specified"
2.3. Scripts Padrão (e suas "atalhos")
Alguns scripts têm atalhos especiais e não precisam do prefixo run:
start: Usado para iniciar o aplicativo principal.npm start(equivalente anpm run start)
test: Usado para executar testes.npm test(equivalente anpm run test)
install: Executado apósnpm install.npm install(equivalente anpm run install)
2.4. Criando Seus Próprios Scripts Personalizados
Vamos adicionar um script simples para dizer "Olá":
// package.json
{
"name": "meu-projeto-node",
"version": "1.0.0",
"description": "Um projeto de exemplo para npm scripts.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"hello": "echo \"Olá, Mundo dos npm scripts!\""
},
"keywords": [],
"author": "",
"license": "ISC"
}Agora, execute-o:
npm run helloSaída:
> meu-projeto-node@1.0.0 hello
> echo "Olá, Mundo dos npm scripts!"
Olá, Mundo dos npm scripts!
2.5. Executando Binários Locais 📦
Uma das características mais úteis dos npm scripts é que eles automaticamente adicionam o diretório node_modules/.bin ao PATH do shell quando executados. Isso significa que você pode usar ferramentas CLI instaladas localmente (como nodemon, eslint, mocha, etc.) diretamente nos seus scripts, sem precisar instalá-las globalmente.
Vamos instalar o nodemon como uma dependência de desenvolvimento para ver isso em ação:
npm install nodemon --save-devCrie um arquivo index.js simples:
// index.js
console.log('Servidor Node.js iniciado!');
let counter = 0;
setInterval(() => {
counter++;
console.log(`Contador: ${counter}`);
}, 1000);Agora, adicione um script para rodar index.js com nodemon:
// package.json
{
"name": "meu-projeto-node",
// ...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"hello": "echo \"Olá, Mundo dos npm scripts!\"",
"dev": "nodemon index.js"
},
// ...
"devDependencies": {
"nodemon": "^3.0.1"
}
}Execute o script dev:
npm run devVocê verá o nodemon iniciando seu arquivo index.js e reiniciando-o automaticamente se você fizer alterações.
2.6. Passando Argumentos para Scripts ➡️
Você pode passar argumentos diretamente para seus scripts usando -- após o nome do script. Tudo o que vier depois de -- será passado como argumentos para o comando subjacente.
Exemplo:
// package.json
{
// ...
"scripts": {
"greet": "echo Olá, $1!"
},
// ...
}Nota para Windows: No Windows,
$1pode não funcionar como esperado. Uma alternativa mais robusta para scripts que precisam de argumentos variáveis é usar um script Node.js intermediário ou uma ferramenta comoyargsdentro de um script Node.js. Para scripts simples como este,$1pode ser substituído por%*(para todos os argumentos) ou%1(para o primeiro argumento) emcmd.exe, mas a compatibilidade entre shells é um desafio. Para fins desta aula, focaremos no comportamento mais comum em ambientes Unix-like.
Execute:
npm run greet -- "João"Saída (em sistemas Unix-like):
> meu-projeto-node@1.0.0 greet
> echo Olá, João!
Olá, João!
2.7. Encadear Scripts (Sequencial e Paralelo) 🔗
Você pode encadear vários comandos em um único script:
- Sequencial (
&&): O próximo comando só executa se o anterior for bem-sucedido. - Paralelo (
&): Todos os comandos são executados simultaneamente.
// package.json
{
// ...
"scripts": {
"clean": "rm -rf dist",
"build:js": "echo 'Compilando JavaScript...' && sleep 1 && echo 'JavaScript compilado.'",
"build:css": "echo 'Compilando CSS...' && sleep 2 && echo 'CSS compilado.'",
"build": "npm run clean && npm run build:js && npm run build:css",
"dev:parallel": "npm run build:js & npm run build:css"
},
// ...
}Nota para Windows:
rm -rfé um comando Unix-like. Para compatibilidade cross-platform, você pode usar a bibliotecarimraf(npm install rimraf --save-dev) e usarrimraf distem vez derm -rf dist. Osleeptambém é Unix-like; em Windows, usetimeout /t 1ou um script Node.js. Para simplicidade, manteremos os comandos Unix-like, mas lembre-se das implicações de plataforma. Para execução paralela em Windows,&pode ter comportamentos ligeiramente diferentes; ferramentas comoconcurrentlysão recomendadas para projetos maiores.
Execute:
npm run build
# Limpa, compila JS, depois compila CSS
npm run dev:parallel
# Compila JS e CSS ao mesmo tempo2.8. Hooks pre e post 🎣
O NPM oferece hooks pre e post para scripts. Se você definir um script chamado myscript, o NPM procurará e executará automaticamente prescript antes de myscript e postscript depois de myscript.
Exemplo:
// package.json
{
// ...
"scripts": {
"predeploy": "echo 'Verificando antes do deploy...'",
"deploy": "echo 'Realizando deploy da aplicação...'",
"postdeploy": "echo 'Deploy concluído!'"
},
// ...
}Execute:
npm run deploySaída:
> meu-projeto-node@1.0.0 predeploy
> echo 'Verificando antes do deploy...'
'Verificando antes do deploy...'
> meu-projeto-node@1.0.0 deploy
> echo 'Realizando deploy da aplicação...'
'Realizando deploy da aplicação...'
> meu-projeto-node@1.0.0 postdeploy
> echo 'Deploy concluído!'
'Deploy concluído!'
2.9. Variáveis de Ambiente 🌍
Você pode definir variáveis de ambiente dentro de seus scripts. Isso é útil para configurar o ambiente de execução (ex: NODE_ENV=production).
// package.json
{
// ...
"scripts": {
"start:prod": "NODE_ENV=production node index.js"
},
// ...
}Nota para Windows:
NODE_ENV=productioné um comando Unix-like. Para compatibilidade cross-platform, use a bibliotecacross-env(npm install cross-env --save-dev). Comcross-env, o script ficaria assim:"start:prod": "cross-env NODE_ENV=production node index.js".
No seu index.js, você pode acessá-lo:
// index.js
console.log('Ambiente:', process.env.NODE_ENV || 'development');
// ... (seu código do servidor)Execute:
npm run start:prodSaída:
> meu-projeto-node@1.0.0 start:prod
> NODE_ENV=production node index.js
Ambiente: production
Servidor Node.js iniciado!
Contador: 1
...
3. Exercícios Práticos 🚀
É hora de colocar a mão na massa! Crie um novo diretório para esta aula e inicialize um projeto Node.js (npm init -y).
Tarefa 1: Configuração Inicial
Crie um novo projeto Node.js e adicione os seguintes scripts ao seu package.json:
"start": Um script que executa um arquivoapp.js(que você criará)."test": Mantenha o script padrão de teste."hello": Um script que exibe "Olá do meu primeiro script NPM!".
Passos:
- Crie um diretório
npm-scripts-aula. - Navegue até ele:
cd npm-scripts-aula. - Inicialize o projeto:
npm init -y. - Crie um arquivo
app.jscom o seguinte conteúdo:// app.js console.log('Aplicação Node.js iniciada!'); - Modifique seu
package.jsonpara incluir os scripts acima.
Tarefa 2: Usando Binários Locais
Instale o eslint como uma dependência de desenvolvimento e crie um script para lintar seu código.
Passos:
- Instale
eslint:npm install eslint --save-dev. - Crie um arquivo de configuração
eslintpadrão:npx eslint --init. (Escolha as opções que preferir, como "To check syntax, find problems, and enforce code style" e "JavaScript modules (import/export)"). - Crie um arquivo
src/index.jscom algum código que tenha erros de lint (ex: variáveis não usadas, ponto e vírgula faltando). - Adicione um script
"lint"ao seupackage.jsonque executeeslint src/**/*.js. - Execute
npm run linte observe a saída.
Tarefa 3: Encadeando Scripts e Hooks
Crie um script build que limpa um diretório dist e depois "compila" alguns arquivos. Use hooks pre e post.
Passos:
- Instale
rimrafpara compatibilidade cross-platform na remoção de diretórios:npm install rimraf --save-dev. - Crie um diretório
dist. - Adicione os seguintes scripts ao seu
package.json:"prebuild": Um script que exibe "Iniciando processo de build...""clean":rimraf dist"compile:assets":echo 'Compilando assets...' && mkdir -p dist && echo 'Conteúdo compilado!' > dist/bundle.js"build":npm run clean && npm run compile:assets"postbuild": Um script que exibe "Build concluído com sucesso!"
- Execute
npm run builde verifique a saída e o conteúdo do diretóriodist.
Tarefa 4: Variáveis de Ambiente e Argumentos
Crie um script que inicia um servidor em uma porta específica, usando uma variável de ambiente e um argumento.
Passos:
- Instale
cross-envpara compatibilidade cross-platform com variáveis de ambiente:npm install cross-env --save-dev. - Crie um arquivo
server.js:// server.js const http = require('http'); const port = process.env.PORT || 3000; const env = process.env.NODE_ENV || 'development'; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end(`Olá do servidor Node.js! Ambiente: ${env}, Porta: ${port}\n`); }); server.listen(port, () => { console.log(`Servidor rodando em http://localhost:${port}/ no ambiente ${env}`); }); - Adicione um script
"start:server"ao seupackage.jsonque usecross-envpara definirNODE_ENVcomoproductionePORTcomo o primeiro argumento passado para o script.- Exemplo de script:
"start:server": "cross-env NODE_ENV=production PORT=$1 node server.js"
- Exemplo de script:
- Execute
npm run start:server -- 8080. - Verifique no navegador (
http://localhost:8080) e na saída do terminal se o servidor iniciou com as configurações corretas.
4. Resumo e Próximos Passos 🔚
Parabéns! Você dominou a arte de criar e executar npm scripts. Eles são uma ferramenta fundamental no ecossistema Node.js, tornando seu desenvolvimento mais eficiente e organizado.
O que aprendemos:
- A estrutura do objeto
"scripts"nopackage.json. - Como executar scripts usando
npm run. - A conveniência dos scripts padrão (
start,test). - Como usar binários de dependências locais sem instalação global.
- Encadear comandos sequencialmente (
&&) e em paralelo (&). - Utilizar hooks
preepostpara automatizar etapas antes e depois de um script. - Passar argumentos e definir variáveis de ambiente para scripts.
Próximos Passos:
- Explore mais ferramentas: Pesquise por pacotes como
concurrently(para execução paralela robusta),cross-env(para variáveis de ambiente cross-platform), enodemon(para desenvolvimento). - Documentação Oficial: Consulte a documentação oficial do NPM sobre
package.jsonscripts para aprofundar seus conhecimentos. - Integre em seus projetos: Comece a usar
npm scriptsem todos os seus novos projetos para automatizar tarefas como linting, formatação, testes e inicialização do servidor.
Continue praticando e explorando! A automação é a chave para um desenvolvimento mais produtivo. 💪