Tutorial Nodemon: Reinicie automaticamente aplicativos Node.js com o Nodemon

Tutorial Nodemon: Reinicie automaticamente aplicativos Node.js com o Nodemon
AdsTerra, Junte-se ao AdsTerra

Em ambientes de desenvolvimento, especialmente aqueles que envolvem muitas iterações, não queremos reiniciar nosso servidor ou aplicativo backend manualmente sempre que fazemos alterações no código-fonte.

Este é um problema que o Nodemon resolve. Ele atua como uma biblioteca utilitária para monitorar as alterações no servidor e reiniciar automaticamente nosso aplicativo para nós.

De acordo com a documentação, o Nodemon é uma ferramenta perfeita para o desenvolvimento de aplicações baseadas em Node.js. De fato, ele foi construído com as propriedades do comando CLI do Node em mente, já que é um wrapper ao redor do comando node.

Basicamente, ele funciona detectando mudanças no diretório atual do nosso código-fonte e reinicia o servidor para se adaptar a essas novas mudanças.

Lembre-se de que, para executar um aplicativo Node.js, começamos com o comando node seguido do nome do arquivo. No desenvolvimento com o Nodemon, tudo o que precisamos fazer é executar nodemon nome_do_arquivo, e o Nodemon irá monitorar nossos arquivos para nós.

No entanto, para utilizar o Nodemon, precisamos instalá-lo globalmente em nossas máquinas ou localmente, por projeto.

Quando instalado por projeto, tudo o que precisamos fazer é atualizar a tag script no arquivo package.json do nosso projeto. Para usar o Nodemon em modo de desenvolvimento, podemos adicionar uma linha "dev": "nodemon app.js" na tag script do mesmo arquivo.

Quando instalado globalmente, o Nodemon fica disponível no caminho do nosso sistema e funciona imediatamente.

Neste tutorial, explicarei como o Nodemon funciona explorando suas funcionalidades e como elas são utilizadas.

Vamos cobrir os seguintes tópicos:

  • O que é o Nodemon?
  • Instalando o Nodemon tanto localmente quanto globalmente
  • Configurações e uso do Nodemon
  • Funcionalidades do Nodemon

Para acompanhar este tutorial, os leitores devem ter um entendimento básico de Node.js e Express.

O que é o Nodemon?

Como mencionei anteriormente, o Nodemon é uma ferramenta utilitária que monitora mudanças nos arquivos e reinicia automaticamente nossas aplicações Node.js. É uma ferramenta de código aberto, bem mantida e utilizada por muitas pessoas na comunidade.

Para ver uma lista de comandos disponíveis no Nodemon, podemos usar a flag -h ou --help mostrada abaixo. Podemos executar:

nodemon -h 
// ou 
nodemon --help

Existem várias razões pelas quais devemos usar o Nodemon no desenvolvimento de aplicações baseadas em Node.js.

Primeiro, ele é muito fácil de configurar. Em segundo lugar, uma vez instalado, ele roda automaticamente, pois não requer nenhuma instância para ser chamado e, por último, facilita iterações mais rápidas para ambientes de desenvolvimento.

Agora, vamos explorar como podemos instalar o Nodemon abaixo.

Instalando o Nodemon

Como mencionamos anteriormente, o Nodemon pode ser instalado globalmente no caminho do nosso sistema ou localmente como uma dependência de desenvolvimento.

Para instalar o Nodemon globalmente no nosso caminho, podemos executar o comando abaixo com a flag global -g:

npm install -g nodemon

Isso significa que o pacote pode ser usado e executado a partir do caminho do sistema em nossa máquina de desenvolvimento.

Caso contrário, podemos executar:

npm install --save-dev nodemon

O comando acima instalará o Nodemon localmente em nossa máquina ou como uma dependência de desenvolvimento. Note aqui que estamos instalando o Nodemon como uma dependência de desenvolvimento com a flag --save-dev, pois não queremos que ele seja uma dependência de produção.

Após executar o comando acima, nosso arquivo package.json será modificado e a biblioteca Nodemon com seu número de versão será salva sob a chave "devDependencies" conforme mostrado abaixo:

{
  "name": "test-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "private": false,
  "devDependencies": {
    "nodemon": "^2.0.7"
  }
}

Como uma dependência de desenvolvimento, tudo o que precisamos fazer é adicionar um script dev no nosso arquivo package.json para poder usar o Nodemon na nossa configuração local. Vamos agora prosseguir exibindo uma simples aplicação Node.js para entender todas as funcionalidades e opções de configuração do Nodemon.

Vamos começar pequeno com a configuração do servidor localizada no arquivo app.js. O conteúdo desse arquivo é mostrado abaixo:

require('dotenv').config();
require('./mongoClient');

const express = require('express');
const config = require('./config');
const routes = require('./routes');
const app = express();

// adicionar rotas aqui
routes(app);

// captura 404 e encaminha para o manipulador de erros
app.use((req, res, next) => {
    const err = new Error('Not Found');
    console.log(err);
    err.status = 404;
    res.send('Route not found');
    next(err);
});

app.listen(process.env.PORT || config.port, () => {
    console.log(`${config.appName} listening on port ${config.port}!`);
});

module.exports = app;

Vamos também dar uma olhada em como executar este arquivo de servidor usando o Nodemon. A configuração mais básica e mínima para utilizar o Nodemon em nosso projeto é mostrada abaixo no arquivo package.json localizado na raiz:

{
  "name": "nodemon_tutorial",
  "version": "1.0.0",
  "description": "Um Tutorial para Entender o Nodemon",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },
  "directories": {
    "model": "model",
    "controllers": "controllers"
  },
  "repository": {
    "type": "git",
    "url": ""
  },
  "keywords": [
    "Node.js",
    "JavaScript"
  ],
  "license": "MIT",
  "devDependencies": {
    "nodemon": "^2.0.4"
  },
  "dependencies": {
    "bcrypt": "^5.0.1",
    "debug": "^4.1.1",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "express-async-handler": "^1.1.4",
    "mongoose": "^5.9.25",
    "mongoose-paginate": "^5.0.3",
    "path": "^0.12.7",
    "uuidv4": "^6.2.0"
  },
  "engines": {
    "node": "13.7.0",
    "npm": "6.13.6"
  }
}

Como podemos ver pela configuração na tag scripts abaixo:

"scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js"
  },

Então, quando executamos npm run dev, ele executa o Nodemon e monitora nossos arquivos para nós.

O conteúdo quando executamos o arquivo com Nodemon é mostrado abaixo:

[nodemon] clean exit - waiting for changes before restart
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
(node:97775) ExperimentalWarning: Conditional exports is an experimental feature. This feature could change at any time
Nodemon_tutorial listening on port 5000!
mongodb connected
Mongoose: users.createIndex({ email: 1 }, { unique: true, background: true })
Mongoose: users.createIndex({ phoneNumber: 1 }, { unique: true, background: true })

Com a flag --inspect (útil para um processo Node.js ouvindo um depurador) no arquivo package.json, a saída quando executamos npm run dev é mostrada abaixo:

desktop@desktop backend-server % npm run dev

> nodemon_tutorial@1.0.0 dev /Users/desktop/Dropbox/My Mac (desktop)/Desktop/nodemon_tutorial/nodemon_tutorial
> nodemon --inspect app.js

[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node --inspect app.js`
Debugger listening on ws://127.0.0.1:9229/8618d563-210c-4070-bed5-b077016abae2
For help, see: https://nodejs.org/en/docs/inspector
(node:98970) ExperimentalWarning: Conditional exports is an experimental feature. This feature could change at any time
Nodemon_tutorial listening on port 5000!

A partir da versão 1.1.x, o Nodemon procurará por uma propriedade scripts.start ou uma propriedade main no arquivo package.json no diretório de trabalho atual e iniciará o aplicativo para nós.

Vamos tentar isso:(aba) desktop@desktop backend-server % nodemon
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
(node:99113) ExperimentalWarning: Conditional exports is an experimental feature. This feature could change at any time
Nodemon_tutorial listening on port 5000!

A partir do exemplo acima, vemos que o Nodemon detecta e lê o valor da propriedade main no arquivo package.json e, em seguida, inicia nosso aplicativo.

Ao adicionar "exec": "npm run dev" na seção de opções do Nodemon, podemos sobrescrever o valor de main mostrado abaixo:(aba) desktop@desktop backend-server % nodemon
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `npm run dev`

Configurando o Nodemon

Podemos configurar o Nodemon de diferentes maneiras. Ele suporta os seguintes métodos de configuração:

  • Um arquivo de configuração chamado nodemon.json localizado na raiz do projeto.
  • Um arquivo de configuração localizado em ~/.config/nodemon/config ou ~/nodemon.json.
  • Um arquivo de configuração nodemon.json localizado em um diretório .nodemon em qualquer um dos diretórios acima.
  • Um argumento de linha de comando nodemon.json fornecido diretamente.

Vamos configurar nosso Nodemon usando uma configuração nodemon.json localizada na raiz do nosso projeto.

Se configurarmos o Nodemon para ser ignorado pelo git, é necessário configurar o caminho do arquivo para que o Nodemon ignore o diretório .git. Podemos fazer isso usando a palavra-chave "ignoreRoot", como mostrado abaixo:

{
  "ignoreRoot": [".git"]
}

Se quisermos ignorar a pasta node_modules em vez de ignorar o diretório .git, podemos usar a configuração "ignore", que sobrescreverá o valor da chave "ignoreRoot" mostrado abaixo:

{
  "ignore": ["node_modules"]
}

Além disso, podemos combinar a configuração acima e incluir as opções ext e verbose. Isso monitora apenas as extensões de arquivos incluídas e exibe os eventos, conforme mostrado abaixo:

{
  "ignoreRoot": [".git"],
  "ignore": ["node_modules"],
  "ext": "js json",
  "verbose": true
}

Vamos adicionar mais algumas opções que poderíamos incluir no Nodemon para configurar nossos arquivos.

A palavra-chave "exec" é usada para sobrescrever a propriedade "main" no arquivo package.json do nosso projeto:

{
  "ignoreRoot": [".git"],
  "ignore": ["node_modules"],
  "ext": "js json",
  "verbose": true,
  "exec": "npm run dev"
}

Para ativar e desativar o depurador, podemos adicionar a configuração inspect ao nosso arquivo nodemon.json localizado na raiz do projeto:

{
  "inspect": "9229"
}

Ou podemos usar a opção "exec" para incluir a palavra-chave "--inspect" para que o Nodemon saiba que queremos usar o depurador:

{
  "exec": "node --inspect app.js"
}

Funcionalidades do Nodemon

Outras opções de configuração incluem:

  • restartable: É uma string de comando que redefine o comando restart padrão. Seu valor padrão é 'rs'.
  • ignore: Para adicionar arquivos e diretórios ao Nodemon para ignorar.
  • delay: Especifica quanto tempo o Nodemon deve esperar antes de reiniciar o servidor. O valor padrão é de 1 segundo.
  • signal: Configura a maneira como o Nodemon deve enviar sinais ao processo de aplicativo subjacente.

Usando o Nodemon com Webpack

O Nodemon pode ser configurado para ser executado junto com o Webpack na fase de desenvolvimento. Este é um uso comum com o servidor Webpack e Express.

Podemos configurar isso adicionando "nodemon": "npm run build && nodemon ./dist/server.js" na chave de "scripts" do nosso arquivo package.json, conforme mostrado abaixo:

"scripts": {
    "nodemon": "npm run build && nodemon ./dist/server.js"
  },

Esta configuração é útil para configurações de servidor com pilha MEAN, MERN e MEVN.

Conclusão

Neste tutorial, vimos como instalar e configurar o Nodemon, tanto globalmente quanto localmente, e algumas de suas funcionalidades e casos de uso.

Espero que agora você tenha um entendimento básico de como o Nodemon funciona.

Recomendo que você leia a documentação oficial para entender melhor suas funcionalidades e ver uma lista de comandos disponíveis.

Espero que este artigo tenha sido útil para você.

Sugestão de Cursos

Descubra o caminho para se tornar um especialista em programação web. Aprenda HTML, CSS, JavaScript e os principais frameworks nesta jornada emocionante. Com instrutores experientes e materiais práticos, você desenvolverá habilidades práticas para criar sites impressionantes e aplicativos interativos. Impulsione sua carreira na indústria de tecnologia e abra portas para oportunidades de emprego lucrativas. Garanta sua vaga hoje mesmo e inicie sua jornada para se tornar um desenvolvedor web de sucesso.

Curso de Node.js, React e React Native

Método Para Aprender a Programar do Absoluto ZERO com Node.js, React e React Native.

As tecnologias ensinadas no curso são responsáveis por muitas vagas no mercado de trabalho.

Além da alta demanda, os salários vão de R$47.000,00 até R$197.000,00 anuais tendo empresas que possibilitam o trabalho remoto e até vagas Internacionais.

Para que você possa estar apto a preencher uma dessas vagas eu vou te apresentar o passo a passo para você se tornar um verdadeiro expert nessas tecnologias.

O curso te dará o passo a passo de como criar estruturar de um sistema do zero com Node.js, React e React Native.

Saiba mais sobre o curso de Node.js, React e React Native.

AdsTerra, Junte-se ao AdsTerra