Redémarrez le nœud lors de la modification d'un fichier


172

Pour quelqu'un qui vient de l'arrière-plan PHP, le processus de suppression du nœud et de le redémarrage après chaque changement de code semble très fastidieux. Y a-t-il un indicateur lors du démarrage d'un script avec un nœud pour redémarrer automatiquement le nœud lorsque le changement de code est enregistré?

Réponses:


94

Le module forever a le concept de plusieurs serveurs node.js et peut démarrer, redémarrer, arrêter et répertorier les serveurs en cours d'exécution. Il peut également surveiller les changements de fichiers et redémarrer le nœud si nécessaire.

Installez-le si vous ne l'avez pas déjà:

npm install forever -g

Après l'avoir installé, appelez la forevercommande: utilisez l' -windicateur pour surveiller le fichier pour les modifications:

forever -w ./my-script.js

De plus, vous pouvez regarder le répertoire et ignorer les modèles:

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

+1 forever est assez polyvalent pour le développement / test et la production.
— smertrios

1
J'ai essayé d'utiliser pour toujours pour redémarrer mon serveur ES2015 Expess.js / Webpack avec cette commande, forever -c babel-node -w --watchDirectory ./server ./server/index.js mais malheureusement, il semble envoyer pour toujours dans un tailspin et il redémarre le serveur trop souvent, ce qui entraîne des erreurs de port déjà utilisées ... ajouter une pause après un redémarrage?
— Brian Di Palma

1
@BrianDiPalma Vous devriez peut-être ajouter des modèles d'ignorance, s'il y a des fichiers changeants, tels que des journaux, sous le répertoire de surveillance. Consultez la documentation pour voir si vous pouvez définir un délai entre les redémarrages.
— hyde

1
@hyde Ce n'était pas un délai nécessaire, c'était l' option -tou killTreequi était requise, je suppose que babel-node était en train d'être tué mais pas le serveur Express qu'il a engendré.
— Brian Di Palma

2
Forever JS a un bogue dans Windows qui ne tue pas le processus Node lorsque le script est terminé. Vous devez tuer manuellement le processus Node :( stackoverflow.com/questions/14556852/…
— pmont

157

Une bonne option est Node-supervisor et Node.js Restart on File Change est un bon article sur la façon de l'utiliser, généralement:

 npm install supervisor -g

et après la migration vers la racine de votre application, utilisez les éléments suivants

 supervisor app.js

même ici, pour une raison quelconque, car j'ai utilisé nodemon auparavant sans aucun problème.
— ZenMaster

1
A travaillé pour moi aussi. J'ai dû remplacer le paramètre de surveillance générique par défaut server.jscar il redémarrait constamment, cela était dû au fait que mon serveur construisait le client au démarrage et changeait ainsi les fichiers. supervisor --watch server.js server.jsrésolu.
— scipilot

2
Node-supervisor n'est plus maintenu.
— aleung le

Fonctionne comme un charme !!
— JRichardsz

Mon préféré, rafraîchir les intervalles pour vérifier si le fichier est modifié est presque instantané!
— NiCk Newman

100

Vous devriez regarder quelque chose comme nodemon .

Nodemon surveillera les fichiers dans le répertoire dans lequel nodemon a été démarré, et s'ils changent, il redémarrera automatiquement votre application de nœud.

Exemple:

nodemon ./server.js localhost 8080

ou simplement

nodemon server

Une idée de pourquoi Node nécessite un redémarrage pour implémenter les modifications de code? Et pourquoi d'autres serveurs (comme Apache / PHP) ne nécessitent pas de redémarrage?
— maverick

2
@ dk49 car les scripts PHP dans ce cas sont lancés pour chaque requête entrante et arrêtés après avoir généré la page.
— Daerdemandt

@Daerdemandt merci pour le partage ... mais je n'ai toujours pas compris pourquoi le serveur (sur n'importe quelle plate-forme) doit-il démarrer et s'arrêter? Est-ce parce qu'il maintient un cache de fichiers (réponses)? Je pensais que le serveur chargerait les fichiers à partir du disque au moment de la demande, les traiterait puis enverrait la réponse. Je suis nouveau dans la programmation côté serveur.
— maverick

Pouvez-vous / devriez-vous utiliser nodemon dans un environnement de production?
— JoeTidee

1
Je ne sais pas comment nodemon tient encore aujourd'hui (comme c'était en 2012), mais pour des raisons de sécurité, je ne suis pas sûr de vouloir que mon serveur redémarre sur prod chaque fois qu'un fichier change. Quelque chose comme pm2 pourrait être plus approprié pour un environnement de production.
— Menztrual

43

Différents packages NPM sont disponibles pour faciliter cette tâche.

Pour le developpement

Pour la production (avec des fonctionnalités étendues telles que le clustering, le déploiement à distance, etc.)

Une comparaison entre Forever, pm2 et StrongLoop est disponible sur le site Web de StrongLoop .


3
@ 2019 nodemon semble la seule des 4 options de développement qui soit encore maintenue.
— mvermand

1
@mvermand Oui, aucune nouvelle version n'a été publiée récemment pour l'un ou l'autre, à l'exception de nodemon. Pour la production, les PM2 sont toujours bien entretenues.
— Kay

16

Vous pouvez également essayer nodemon

Pour installer Nodemon

npm install -g nodemon

Pour utiliser Nodemon

Normalement, nous démarrons un programme de nœuds comme:

node server.js

Mais ici, vous devez faire comme:

nodemon server.js

Bonne et simple réponse !!
— lesimoes

1
nodemon a des bugs ennuyeux. C'était une perte de temps pour moi.
— kta

En quoi cette réponse est-elle différente de la réponse nodemon 2012 ?
— Dan Dascalescu le

9

node-dev

node-dev est une excellente alternative à la fois à nodemon et au superviseur pour les développeurs qui aiment recevoir des notifications de grognement (ou de libnotify) sur leur bureau chaque fois que le serveur redémarre ou lorsqu'une erreur ou un changement se produit dans le fichier.

Installation:

npm install -g node-dev

Utilisez node-dev, au lieu de node:

node-dev app.js

Notification lors du changement de fichier pour que le serveur démarre automatiquement

entrez la description de l'image ici

console out mis

entrez la description de l'image ici


3

J'utilise runjscomme:

runjs example.js

Le package s'appelle simplement run

npm install -g run

2
ce n'est pas mieux, juste une autre option
— sp2danny

Cette réponse serait beaucoup plus précieuse si elle expliquait pourquoi vous utilisez runet comment elle se compare aux alternatives existantes. Le simple fait de jeter une autre option ne fait que contribuer au paradoxe du choix. (Heureusement, runn'a pas été mis à jour depuis 2015, donc maintenant ce n'est pas une grande option.)
— Dan Dascalescu

0

Suis les étapes:

  1. npm install --save-dev nodemon

  2. Ajoutez les deux lignes suivantes à la section "script" de package.json:

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

comme indiqué ci-dessous:

"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


Eh bien, c'est essentiellement la même réponse que celle de 2012 , mais présente avec plus de «magie» autour d'elle. Mais l' essence de la réponse est "utiliser nodemon". La réinitialisation est tangentielle. Et il était mal formaté, mais je vois que David a corrigé cela, alors je vais annuler mon vote défavorable.
— Dan Dascalescu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.