chuikoffru
@chuikoffru
Full Stack JS Developer

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

Здравствуйте! Есть такой фреймворк habrahabr.ru/post/194250, и в нем есть такая возможность. Считаю что это очень удобно, так как сейчас внеся изменения в nodejs приложение, мне приходится в консоли перезапускать проект pm2 restart server, чтобы проверить изменения. Как сделать, чтобы после сохранения файла, он уходил в память, или перекомпилировался моментально, а я просто производил операции в браузере?
  • Вопрос задан
  • 1300 просмотров
Решения вопроса 2
baskerville42
@baskerville42
Учусь работать (Junior)
json-app-declaration
watch--restart
Хорошенько пройдитесь по документации PM2, там куча очень полезных штук.

Константин Китманов Как вариант ещё есть pm2. Там есть возможность релоада (не перезагрузки) приложения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Как автор упомянутого сервера приложений, проясню ситуацию. Все остальные приведенные решения перестартовывают процессы. В лучшем случае они запускаются в режиме нескольких процессов (при помощи cluster или используя child_process) и перестартовывают дочерние процессы (worker), а родительский процесс (master) следит за изменениями и не перестартовывает. Это действительно дает нулевой даунтайм, что важно для продакшена, но не особо важно для разработки. А важно другое - удаляются из памяти все данные, все развернутое там состояние, закрываются соединения с БД, выгружаются библиотеки, да и все, что было проинициализировано при старте приложения, все полностью разрушится и перезагрузится. В Impress же подгружаются отдельные файлы, заменяя на лету в памяти предыдущий код. Это делается без eval, при помощи vm. При многочисленных изменениях он понимает, что меняется много файлов (например заливается новая версия приложения) ждет, когда эта активность прекратится, а потом обновит все одним махом. При частых изменениях одного и того же файла, может сложиться ситуация, когда в памяти будут параллельно находиться 2-3 копии одного кода. Дело в том, что в систему идет поток запросов, и старые запросы еще были запущены в момент, когда была предыдущая версия, и они не успели завершиться. Поэтому, нужно дождаться их завершения, а для новых уже можно использовать новую версию кода. Там есть еще много особенностей, о которых долго рассказывать. В общем, мне не известны другие реализации этого решения. Если они таки найдутся, то пришлите на сравнение. Приведенная же статья несколько устарела, для первичного ознакомления берите эту: habrahabr.ru/post/247543
Ответ написан
@vsvladimir
Как вариант можно из своего приложения подгружать модули на лету, если они изменились:
function reloadModule(module) {
    delete require.cache[require.resolve(module)];
    return require(module);
}
Ответ написан
@NETChaser
например так

var _eval = require('eval');

var f1 = function () { return 321 };
console.log(f1());

var f1 = _eval('module.exports = function () { return 123 }');;
console.log(f1());
Ответ написан
Kotofey
@Kotofey
Активно использую Child Process, на выходе имею как раз то, что вам требуется.
При каждом новом запуске дочернего процесса он подтягивает актуальное состояние всех скриптов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы