Reinicie o nó ao alterar um arquivo


172

Para alguém que é oriundo do PHP, o processo de matar o nó e iniciá-lo novamente após cada alteração de código parece muito tedioso. Existe algum sinalizador ao iniciar um script com nó para reiniciar automaticamente o nó quando a alteração de código é salva?

Respostas:


94

O módulo forever possui um conceito de vários servidores node.js. e pode iniciar, reiniciar, parar e listar servidores atualmente em execução. Ele também pode observar a alteração de arquivos e reiniciar o nó conforme necessário.

Instale-o se você ainda não o possui:

npm install forever -g

Após instalá-lo, chame o forevercomando: use o -wsinalizador para observar o arquivo quanto a alterações:

forever -w ./my-script.js

Além disso, você pode observar o diretório e ignorar padrões:

forever --watch --watchDirectory ./path/to/dir --watchIgnore *.log ./start/file

+1 para sempre é bastante versátil para desenvolvimento / teste e produção.
Smertrios

1
Eu tentei usar para sempre para reiniciar o servidor ES2015 Expess.js / Webpack com este comando, forever -c babel-node -w --watchDirectory ./server ./server/index.js mas, infelizmente, ele parece ser enviado para sempre em um desvio e reinicia o servidor com muita freqüência, resultando em erros de porta já em uso ... existe alguma maneira de adicionar uma pausa após uma reinicialização?
Brian Di Palma

1
@BrianDiPalma Talvez você deva adicionar alguns padrões de ignorar, se houver algum arquivo alterado, como logs, no diretório watch. Verifique os documentos para ver se você pode definir um atraso entre as reinicializações.
Hyde

1
@hyde Não foi necessário um atraso, era a opção -tou, killTreefoi necessário, acho que o babel-node estava sendo morto, mas não o servidor Express que gerou.
Brian Di Palma

2
O Forever JS possui um bug no Windows que não mata o processo do Node quando o script é finalizado. É necessário eliminar manualmente o processo do nó :( stackoverflow.com/questions/14556852/…
pmont:

157

Uma boa opção é o Node-supervisor e o Node.js. Reiniciar na alteração de arquivo é um bom artigo sobre como usá-lo, normalmente:

 npm install supervisor -g

e depois de migrar para a raiz do seu aplicativo, use o seguinte

 supervisor app.js

o mesmo aqui, por qualquer motivo, como usei o nodemon antes sem nenhum problema.
ZenMaster 01/01

1
Trabalhou para mim também. Eu tive que substituir o parâmetro padrão de observação de curinga server.jsporque, porque ele estava sendo reiniciado constantemente, isso ocorreu devido ao meu servidor criar o cliente na inicialização e alterar os arquivos. supervisor --watch server.js server.jsResolvi-o.
usar o seguinte código

2
O supervisor de nó não é mais mantido.
aleung 6/06/2015

Funciona como um encanto!!
JRichardsz 18/04

Meu favorito, intervalos de atualização para verificar se o arquivo é modificado é quase instantâneo!
NiCk Newman 27/03

100

Você deve olhar algo como nodemon .

O Nodemon observará os arquivos no diretório em que o nodemon foi iniciado e, se eles mudarem, reiniciará automaticamente o aplicativo do nó.

Exemplo:

nodemon ./server.js localhost 8080

ou simplesmente

nodemon server

Alguma idéia de por que o Node requer reinicialização para implementar alterações de código? E por que outros servidores (como Apache / PHP) não exigem reinicialização?
maverick

2
@ dk49 porque, nesse caso, os scripts PHP são iniciados para cada solicitação recebida e interrompidos após a geração da página.
Daerdemandt

@Daerdemandt, obrigado por compartilhar isso ... mas ainda não entendi por que o servidor (em qualquer plataforma) precisa iniciar e parar? É porque mantém um cache de arquivos (respostas)? Eu pensei que o servidor estaria carregando os arquivos do disco no momento da solicitação, processe-o e envie a resposta. Eu sou novo na programação do lado do servidor.
Maverick

Você pode / deve usar o nodemon no ambiente de produção?
JoeTidee

1
Não tenho certeza de como o nodemon ainda se mantém hoje (como isso foi em 2012), mas por motivos de segurança, não tenho certeza se gostaria que meu servidor fosse reiniciado no prod sempre que um arquivo fosse alterado. Algo como pm2 pode ser mais apropriado para um ambiente de produção.
Menztrual

43

Vários pacotes NPM estão disponíveis para facilitar essa tarefa.

Para desenvolvimento

Para produção (com funcionalidade estendida, como cluster, implantação remota etc.)

A comparação entre Forever, pm2 e StrongLoop pode ser encontrada no site da StrongLoop .


3
O nodemon do @ 2019 parece ser a única das 4 opções de desenvolvimento que ainda é mantida.
precisa saber é

1
Sim, nenhum novo lançamento foi lançado recentemente para nenhum deles, exceto o nodemon. Para produção, o PM2 ainda está bem conservado.
Kay


9

node-dev

O node-dev é uma excelente alternativa ao nodemon e ao supervisor para desenvolvedores que gostam de receber notificações de rosnado (ou libnotify) em sua área de trabalho sempre que o servidor reiniciar ou quando ocorrer um erro ou alteração no arquivo.

Instalação:

npm install -g node-dev

Use node-dev, em vez de node:

node-dev app.js

Notificação sobre alteração de arquivo para que o servidor inicie automaticamente

insira a descrição da imagem aqui

consola

insira a descrição da imagem aqui


3

Eu uso runjscomo:

runjs example.js

O pacote é chamado apenas run

npm install -g run

2
Não seria melhor é, apenas uma outra opção
sp2danny

Essa resposta seria muito mais valiosa se explicasse por que você usa rune como é comparada às alternativas existentes. Apenas despejar outra opção apenas contribui para o paradoxo da escolha. (Felizmente runnão é atualizado desde 2015, então agora não é muita opção.)
Dan Dascalescu 17/04

0

Siga os passos:

  1. npm install --save-dev nodemon

  2. Adicione as duas linhas a seguir na seção "script" do package.json:

"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"

como mostrado abaixo:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www"
}
  1. npm run devstart

https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs/skeleton_website


Bem, é essencialmente a mesma resposta que a de 2012 , mas apresenta mais "mágica" ao seu redor. Mas a essência da resposta é "use nodemon". A redefinição é tangencial. E estava mal formatado, mas vejo que David corrigiu isso, então vou desfazer meu voto negativo.
Dan Dascalescu 28/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.