Я пытаюсь настроить собственный сервер nodejs, но у меня проблема. Я не могу понять, как увидеть изменения в моем приложении, не перезагружая его. Есть ли способ редактировать приложение и просматривать изменения в режиме реального времени с помощью node.js?
Как я могу редактировать свои файлы на сервере без перезагрузки nodejs, когда я хочу увидеть изменения?
Ответ 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');
});
Ответ 7
Я думаю, node-inspector - ваш лучший выбор.
Подобно тому, как вы можете "Изменить код JS на стороне клиента" в инструментах Chrome Dev, это использует интерфейс инструментов разработчика Chrome (Blink), чтобы обеспечить редактирование живого кода.
https://github.com/node-inspector/node-inspector/wiki/LiveEdit
Ответ 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)];
});