59 votes

Comment puis-je modifier les fichiers de mon serveur sans redémarrer nodejs lorsque je veux voir les changements ?

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

60voto

Kris Zyp Points 121

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 de sorte que les fabriques de modules appropriées sont réexécutées pour préserver les références correctes lorsque les modules sont rechargés sans nécessiter un redémarrage complet.

50voto

isaacs Points 6050

Vérifier node-supervisor. Vous pouvez lui donner une collection de fichiers à surveiller pour les changements, et il redémarre votre serveur si l'un d'eux change. Il le redémarre également s'il se bloque pour une autre raison.

http://github.com/isaacs/node-supervisor

Le code "hot-swapping" n'est pas autorisé dans NodeJS car il est très facile de se retrouver accidentellement avec des fuites de mémoire ou des copies multiples d'objets qui ne sont pas collectés. Node a pour but de rendre vos programmes accidentellement rapides, et non accidentellement fuyants.

11voto

Tahsin Turkoz Points 1803

Si vous souhaitez recharger un module sans redémarrer le processus du nœud, vous pouvez le faire à l'aide de la fonction watchFile fonction dans fs et suppression du cache caractéristique de exiger :

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

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

Afin de surveiller ce fichier et de le recharger lorsqu'il est mis à jour, ajoutez ce qui suit à un endroit approprié de 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, donc garder le module dans une variable globale et l'utiliser là où il est nécessaire à partir de la variable globale plutôt que de le requérir plusieurs fois est une option. Ainsi 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');
});

9voto

Loolooii Points 1159

Utilisez ça : https://github.com/remy/nodemon

Exécutez votre application comme ceci : nodemon yourApp.js

6voto

ScrewLoos3 Points 11

Il faudrait mettre l'accent sur ce qui se passe, au lieu de tirer des modules sur le PO. De plus, nous ne savons pas si les fichiers qu'il édite sont tous des modules JS ou s'ils utilisent tous l'appel "require". Prenez les scénarios suivants avec un grain de sel, ils sont seulement destinés à décrire ce qui se passe afin que vous sachiez comment travailler avec.

  1. Votre code a déjà été chargé et le serveur est en train de l'utiliser.

    • SOLUTION Vous devez avoir un moyen d'indiquer au serveur le code qui a changé pour qu'il puisse le recharger. Un point de terminaison pourrait être configuré pour recevoir un signal, une commande sur la ligne de commande ou une requête via tcp/http qui lui indiquerait quel fichier a été modifié et le point de terminaison le rechargerait.

      //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 comporter des appels "require" qui chargent et les caches modules

    • SOLUTION puisque ces modules sont mis en cache par require, en suivant la solution précédente, vous auriez besoin d'une ligne dans votre endpoint pour supprimer cette référence

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X