web-dev-qa-db-fra.com

Comment puis-je éditer sur les fichiers de mon serveur sans redémarrer nodejs quand je veux voir les modifications?

J'essaie de configurer mon propre serveur nodejs, mais j'ai un problème. Je n'arrive pas à comprendre comment voir les modifications apportées à mon application sans la redémarrer. Existe-t-il un moyen de modifier l'application et de voir les modifications en direct avec node.js?

58
Robert Hurst

Départ Node-Supervisor . Vous pouvez lui attribuer une collection de fichiers pour surveiller les modifications et redémarrer votre serveur si l'un d'entre eux change. Il le redémarre également s'il se bloque pour une autre raison.

Le code "d'échange à chaud" n'est pas activé dans NodeJS car il est si facile de se retrouver accidentellement avec des fuites de mémoire ou des copies multiples d'objets non récupérés. Node consiste à rendre vos programmes accidentellement rapides, pas accidentellement fuyants.

EDIT, 7 ans après les faits: Disclaimer, j’ai écrit node-supervisor, mais j’avais confié le projet à un autre responsable avant d’écrire cette réponse.

49
isaacs

Nodules est un chargeur de modules pour Node qui gère le rechargement automatique des modules sans redémarrer le serveur (puisque c'est ce que vous demandiez):

http://github.com/kriszyp/nodules

Nodules effectue un suivi intelligent des dépendances afin que les usines de modules appropriées soient réexécutées afin de conserver les références correctes lors du rechargement des modules sans nécessiter un redémarrage complet.

58
Kris Zyp

Utilisez ceci: https://github.com/remy/nodemon

Il suffit de lancer votre application comme ceci: nodemon yourApp.js

9
Loolooii

Il convient de mettre l’accent sur ce qui se passe au lieu de se limiter aux modules de tir au but au PO. De plus, nous ne savons pas que les fichiers qu'il édite sont tous des modules JS ou qu'ils utilisent tous l'appel "requis". Prenez les scénarios suivants avec un grain de sel, ils sont uniquement destinés à décrire ce qui se passe afin que vous sachiez comment travailler avec cela.

  1. Votre code a déjà été chargé et le serveur tourne avec.

    • SOLUTIONVous devez pouvoir indiquer au serveur quel code a été modifié pour pouvoir le recharger. Vous pouvez avoir un noeud final configuré pour recevoir un signal, une commande sur la ligne de commande ou une requête via tcp/http qui lui indiquera quel fichier a été modifié et le noeud final le rechargera.

      //using Express
      var fs = require('fs');
      app.get('reload/:file', function (req, res) {
          fs.readfile(req.params.file, function (err, buffer) {
              //do stuff...
          });
      });
      
  2. Votre code peut contenir des appels "requis" qui chargent et mettent en cache modules

    • SOLUTIONpuisque ces modules sont mis en cache par require, à la suite de la solution précédente, vous auriez besoin d'une ligne dans votre noeud final pour supprimer cette référence.

      var moduleName = req.params.file;
      delete require.cache[moduleName];
      require('./' + moduleName);
      

Il y a beaucoup de mises en garde à faire derrière tout cela, mais j'espère que vous avez une meilleure idée de ce qui se passe et de pourquoi.

4
Sparkida

Qu'est ce que le "Live Coding"?

En gros, c'est un moyen de modifier le programme en cours d'exécution, sans le redémarrer. Le but, cependant, est de créer un programme qui fonctionne correctement lorsque nous le (re) commençons. Pour être utile, il est utile d’avoir un éditeur qui peut être personnalisé pour envoyer le code au serveur.

Jetez un coup d'œil: http://lisperator.net/blog/livenode-code-votre-nodejs-application/

3

si vous souhaitez recharger un module sans redémarrer le processus de noeud, vous pouvez le faire à l'aide de watchFile function dans fs module et effacement du cache feature of require :

Disons que vous avez chargé un module avec un simple besoin:

var my_module = require('./my_module');

Afin de regarder ce fichier et de le recharger une fois mis à jour, ajoutez ce qui suit à un endroit pratique dans votre code. 

fs.watchFile(require.resolve('./my_module'), function () {
    console.log("Module changed, reloading...");
    delete require.cache[require.resolve('./my_module')]
    my_module = require('./my_module');
});

Si votre module est requis dans plusieurs fichiers, cette opération n'affectera pas les autres affectations. Conservez donc le module dans une variable globale et utilisez-la là où vous en avez besoin, plutôt que d'exiger plusieurs fois, est une option. Donc, le code ci-dessus sera comme ceci:

global.my_module = require ('./my_module');
//..
fs.watchFile(require.resolve('./my_module'), function () {
    console.log("Module changed, reloading...");
    delete require.cache[require.resolve('./my_module')]
    global.my_module = require('./my_module');
});
3
Tahsin Turkoz

Je pense que node-inspector est votre meilleur choix. 

Semblable à la manière dont vous pouvez Live Edit Code JS côté client dans les outils de développement Chrome, cette option utilise l'interface des outils de développement Chrome (Blink) pour permettre l'édition en temps réel du code.

https://github.com/node-inspector/node-inspector/wiki/LiveEdit

1
Gaurav Ramanan

Vous pouvez également utiliser l'outil PM2. Quel est un outil de processus de production avancé pour le noeud js . http://pm2.keymetrics.io/

1
nidhin

Une solution directe simple avec référence à toutes les réponses disponibles ici:

La documentation de nœud indique que fs.watch est plus efficace que fs.watchFile & il peut regarder un dossier entier.

(Je viens juste de commencer à l'utiliser, donc je ne sais pas vraiment s'il y a des inconvénients)

fs.watch("lib", (event_type, file_name) => {
    console.log("Deleting Require cache for " + file_name);
    delete require.cache[ require.resolve("./lib/" + file_name)];
});
0
Duminda Jayasena