Как я могу редактировать свои файлы на сервере без перезагрузки nodejs, когда я хочу увидеть изменения?

Я пытаюсь настроить собственный сервер nodejs, но у меня проблема. Я не могу понять, как увидеть изменения в моем приложении, не перезагружая его. Есть ли способ редактировать приложение и просматривать изменения в режиме реального времени с помощью node.js?

Ответ 1

Проверьте Node-Supervisor. Вы можете предоставить ему коллекцию файлов для просмотра изменений, и она перезапустит ваш сервер, если какой-либо из них изменится. Он также перезапускает его, если он сбой по какой-либо другой причине.

В "NodeJS" код "Горячая замена" не включен, поскольку он настолько легко случайно заканчивается утечками памяти или несколькими копиями объектов, которые не собираются в мусор. Node рассказывает о том, как сделать ваши программы случайными, а не случайными.

EDIT, через 7 лет после факта: Отказ от ответственности, я написал node -supervisor, но передал проект другому помощнику, прежде чем писать этот ответ.

Ответ 2

Nodules - это загрузчик модулей для Node, который обрабатывает автоматическую перезагрузку модулей без перезапуска сервера (так как об этом вы спрашивали):

http://github.com/kriszyp/nodules

Nodules выполняет интеллектуальное отслеживание зависимостей, поэтому соответствующие фабрики модулей повторно выполняются для сохранения правильных ссылок при перезагрузке модулей без полного перезапуска.

Ответ 3

Используйте это: https://github.com/remy/nodemon

Просто запустите приложение следующим образом: nodemon yourApp.js

Ответ 4

Должен быть какой-то акцент на том, что происходит, а не только на съемках модулей на OP. Кроме того, мы не знаем, что файлы, которые он редактирует, это все JS-модули или все они используют вызов "require". Возьмите следующие сценарии с солью, они предназначены только для описания того, что происходит, чтобы вы знали, как с этим работать.

  • Ваш код уже загружен и сервер работает с ним

    • РЕШЕНИЕ. У вас должен быть способ сообщить серверу, какой код изменился, чтобы он мог его перезагрузить. У вас может быть конечная точка, настроенная для приема сигнала, команды в командной строке или запроса через tcp/http, который расскажет, какой файл был изменен, и конечная точка перезагрузит его.

      //using Express
      var fs = require('fs');
      app.get('reload/:file', function (req, res) {
          fs.readfile(req.params.file, function (err, buffer) {
              //do stuff...
          });
      });
      
  • В вашем коде могут быть "требуются" вызовы, в которых загружаются модули и кешировать

    • РЕШЕНИЕ, поскольку эти модули кэшируются по требованию, следуя предыдущему решению, вам понадобится строка в конечной точке для удаления этой ссылки

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

Есть много предостережений, чтобы уйти за все это, но, надеюсь, у вас есть лучшее представление о том, что происходит и почему.

Ответ 5

Что такое "Живое кодирование"?

В сущности, это способ изменить программу во время ее запуска, без перезапустив его. Однако цель состоит в том, чтобы в конечном итоге работает правильно, когда мы (повторно) начинаем его. Чтобы быть полезным, это помогает редактор, который можно настроить для отправки кода на сервер.

Посмотрите: http://lisperator.net/blog/livenode-live-code-your-nodejs-application/

Ответ 6

если вы хотите перезагрузить модуль без перезапуска процесса node, вы можете сделать это с помощью функции watchFile в модуле fs и очистка кеша требуется:

Допустим, вы загрузили модуль с простым требованием:

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

Чтобы посмотреть этот файл и перезагрузить его, добавьте следующее в удобное место в коде.

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

Если ваш модуль требуется в нескольких файлах, эта операция не повлияет на другие назначения, поэтому сохранение модуля в глобальной переменной и использование его там, где это необходимо от глобального, а не для нескольких раз, является опцией. Таким образом, приведенный выше код будет таким:

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');
});

Ответ 8

Вы также можете использовать инструмент PM2. Это усовершенствованный инструмент производственного процесса для node js.  http://pm2.keymetrics.io/

Ответ 9

Простое прямое решение со ссылкой на все доступные здесь ответы:

Документация

Node гласит, что fs.watch более эффективен, чем fs.watchFile, и он может просматривать целую папку.

(я только начал использовать это, поэтому не совсем уверен, есть ли какие-то недостатки)

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