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


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

9 56

9 ответов:

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

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

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

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

http://github.com/kriszyp/nodules

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

использовать этот: https://github.com/remy/nodemon

просто запустите приложение, как это: nodemon yourApp.js

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

  1. ваш код уже загружен и сервер работает с это

    • решение у вас должен быть способ сообщить серверу, какой код изменился, чтобы он мог его перезагрузить. Вы можете настроить конечную точку для получения сигнала, команды в командной строке или запроса через 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...
          });
      });
      
  2. ваш код может иметь" require " вызовы в нем, который загружает и кэши модули

    • решение поскольку эти модули кэшируются require, после предыдущего решения вам понадобится строка в конечной точке, чтобы удалить эту ссылку

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

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

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

взгляните:http://lisperator.net/blog/livenode-live-code-your-nodejs-application/

Если вы хотите перезагрузить модуль без перезапуска процесса узла, вы можете сделать это с помощью watchFile

Я думаю узел-инспектор это ваш лучший ставку.

похоже на то, как вы можете изменить на стороне клиента JS-код в Chrome Dev tools, это использует интерфейс Chrome (Blink) Dev Tools для обеспечения редактирования кода в реальном времени.

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

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

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

документация узла говорит, что fs.смотрите является более эффективным, чем 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)];
});