Любые идеи о том, как я могу реализовать автоматическую перезагрузку файлов в Node.js? Я устал от перезапуска сервера каждый раз, когда я меняю файл. Судя по всему, require()
функция Node.js не перезагружает файлы, если они уже были необходимы, поэтому мне нужно сделать что-то вроде этого:
var sys = require('sys'),
http = require('http'),
posix = require('posix'),
json = require('./json');
var script_name = '/some/path/to/app.js';
this.app = require('./app').app;
process.watchFile(script_name, function(curr, prev){
posix.cat(script_name).addCallback(function(content){
process.compile( content, script_name );
});
});
http.createServer(this.app).listen( 8080 );
И в файле app.js у меня есть:
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
Но это также не работает - я получаю сообщение об ошибке, в process.compile()
котором говорится, что «require» не определено. process.compile
оценивает app.js , но не имеет ни малейшего представления о глобалах node.js.
javascript
node.js
disc0dancer
источник
источник
Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Ответы:
Хороший, вплоть до настоящего времени альтернативы
supervisor
являетсяnodemon
:Использовать
nodemon
:источник
$ nodemon -L yourfile.js
(полное объяснение на coderwall.com/p/aqxl_q )automatically restart the server - perfect for development
это слишком много гиперболы. Перезагрузка сервера может означать вход в бэкэнд-сервисы, что в моем случае занимает много времени. «Идеально для разработки» - это что-то вроде горячих перезагрузок классов, когда процесс работает в памяти, не теряя состояния а-ля, что делает студия android при изменении исходного кода.npm install [--save-dev | -D] nodemon
для ограничения установки до объема проекта.нод-супервайзер - это круто
использование для перезагрузки при сохранении:
от Исаака - http://github.com/isaacs/node-supervisor
источник
"C:\Program Files\nodejs\node.exe" C:\Users\Mark\AppData\Roaming\npm\node_modules\supervisor\lib\cli-wrapper.js app.js
npm install supervisor
,node node_modules/supervisor/lib/cli-wrapper.js app.js
( у меня есть , не корневой установки узла)PATH
я нашел простой способ:
источник
delete require.cache[require.resolve('./mymodule.js')];
решить дело с реальными путями===
Если кто-то все еще приходит к этому вопросу и хочет решить его, используя только стандартные модули, я сделал простой пример:
Этот пример предназначен только для одного файла (server.js), но может быть адаптирован к нескольким файлам с использованием массива файлов, цикла for для получения всех имен файлов или путем просмотра каталога:
Этот код был создан для API Node.js 0.8, он не адаптирован для некоторых конкретных нужд, но будет работать в некоторых простых приложениях.
ОБНОВЛЕНИЕ: Этот функционал реализован в моем модуле simpleR , GitHub repo
источник
watch
не нужен, перезагрузка может быть выполнена безfs
прослушивания другого сигнала.Nodemon появился первым в поиске Google, и, похоже, он добился цели :
источник
Существует Node-Supervisor, который вы можете установить
см. http://github.com/isaacs/node-supervisor
источник
Изменить: мой ответ устарел. Node.js - очень быстро меняющаяся технология.
Я также задавался вопросом о перезагрузке модулей. Я изменил node.js и опубликовал исходный код на Github в nalply / node . Единственная разница заключается в функции
require
. У него есть необязательный второй аргументreload
.Для перезагрузки
app.js
в текущем каталоге используйтеНапишите что-то вроде этого, и у вас есть автоматическая перезагрузка:
Единственная проблема, которую я вижу, - это переменная
module
, но я сейчас над ней работаю.источник
nodemon
отличный Я просто добавляю больше параметров для отладки и просмотра параметров.package.json
Команда:
nodemon --watch server --inspect ./server/server.js
В то время как:
--watch server
Перезапустите приложение при изменении.js
,.mjs
,.coffee
,.litcoffee
, и.json
файлы вserver
папке (включены вложенные папки).--inspect
Включить удаленную отладку../server/server.js
Точка входа.Затем добавьте следующую конфигурацию в
launch.json
(VS Code) и начните отладку в любое время.Обратите внимание, что лучше установить
nodemon
как dev-зависимость проекта. Таким образом, членам вашей команды не нужно устанавливать его или запоминать аргументы команды, они простоnpm run dev
начинают хакерство.Смотрите больше на
nodemon
документах: https://github.com/remy/nodemon#monitoring-multiple-directoriesисточник
В списке рассылки node.js недавно появилась тема на эту тему. Краткий ответ - нет, в настоящее время невозможно автоматически перезагрузить требуемые файлы, но несколько человек разработали патчи, которые добавляют эту функцию.
источник
еще одно решение этой проблемы использует навсегда
источник
node-dev прекрасно работает. НПМ
install node-dev
Он даже выдает уведомление на рабочем столе, когда сервер перезагружается, и выдает сообщение об ошибке или об ошибке.
запустите ваше приложение из командной строки с помощью:
node-dev app.js
источник
Вот сообщение в блоге о Hot Reloading для Node. Он предоставляет ветку github Node, которую вы можете использовать для замены вашей установки Node, чтобы включить горячую перезагрузку.
Из блога:
источник
Я работаю над созданием довольно маленькой "вещи" для узлов, которая может загружать / выгружать модули по своему усмотрению (то есть, вы можете перезапустить часть своего приложения без остановки всего приложения). Я включил (очень глупое) управление зависимостями, так что если вы хотите остановить модуль, все модули, которые зависят от этого, также будут остановлены.
Пока все хорошо, но потом я наткнулся на вопрос о том, как перезагрузить модуль. По-видимому, можно просто удалить модуль из кэша «require» и выполнить работу. Так как я не стремлюсь напрямую изменять исходный код узла, я придумал очень хакерский взлом, который заключается в следующем: поиск в стеке отслеживает последний вызов функции «require», захватывает ссылку на ее поле «cache» и ... ну, удалите ссылку на узел:
Еще проще, на самом деле:Видимо, это работает просто отлично. Я понятия не имею, что означают эти аргументы ["1"], но он делает свою работу. Я полагаю, что ребята из узла когда-нибудь реализуют средство перезагрузки, поэтому я думаю, что пока это решение тоже приемлемо. (кстати, моя «вещь» будет здесь: https://github.com/cheng81/wirez , зайдите туда через пару недель, и вы должны увидеть, о чем я говорю)
источник
function (module, require) { /* your code */ }
. Когда вы принимаете это во внимание,arguments[1]
указывает наrequire
. И цикл while предназначен для ситуаций, когда вы вызываете это из другой функции в модуле (он просто поднимается по иерархии функций и проверяет значения аргументов, передаваемые каждому).Вы можете использовать nodemon из NPM . И если вы используете генератор Express, то вы можете использовать эту команду в папке вашего проекта:
или используя режим отладки
Вы также можете запустить напрямую
Надеюсь, это поможет.
источник
решение по адресу: http://github.com/shimondoodkin/node-hot-reload
обратите внимание, что вы должны самостоятельно позаботиться об использованных ссылках.
это означает, что если вы сделали: var x = require ('foo'); у = х; г = x.bar; и горячо перезагрузил его.
это означает, что вы должны заменить ссылки, хранящиеся в x, y и z. в горячей функции обратного вызова reaload.
некоторые люди путают горячую перезагрузку с автоматическим перезапуском. Мой модуль nodejs-autorestart также имеет встроенную поддержку для автоматического запуска при загрузке. если у вас небольшое приложение, автоматический перезапуск - это хорошо, но когда у вас большое приложение, горячая перезагрузка более подходит. просто потому, что горячая перезагрузка быстрее.
Также мне нравится мой модуль узла-притока.
источник
Не обязательно использовать nodemon или другие подобные инструменты. Просто используйте возможности вашей IDE.
Вероятно, лучшим из них является IntelliJ WebStorm с функцией горячей перезагрузки (автоматическая перезагрузка сервера и браузера) для Node.js .
источник
Вот низкотехнологичный метод для использования в Windows. Поместите это в пакетный файл с именем
serve.bat
:Теперь вместо запуска
node app.js
из командной оболочки cmd запуститеserve app.js
.Это откроет новое окно оболочки с запущенным сервером. Пакетный файл будет заблокирован (из-за
/wait
) до тех пор, пока вы не закроете окно оболочки, после чего исходная командная оболочка cmd спросит: «Завершить пакетное задание (Y / N)?» Если вы ответите «N», то сервер будет перезапущен.Каждый раз, когда вы хотите перезапустить сервер, закройте окно сервера и ответьте «N» в командной консоли.
источник
структура моего приложения:
сначала установите reload с помощью этой команды:
затем измените package.json :
теперь вы должны использовать reload в файле вашего сервера :
и для последнего изменения, в конце вашего ответа отправьте этот скрипт :
Теперь запустите ваше приложение с этим кодом:
источник
Использовать этот:
Все, что вам нужно сделать сейчас, это:
И конфиг будет автоматически перезагружен :)
источник
loaddir - мое решение для быстрой загрузки каталога, рекурсивно.
может вернуться
{ 'path/to/file': 'fileContents...' }
или{ path: { to: { file: 'fileContents'} } }
Он
callback
будет вызываться при изменении файла.Он обрабатывает ситуации, когда файлы достаточно велики, и их
watch
вызывают до того, как они закончат запись.Я использовал его в проектах в течение года или около того, и только недавно добавил к нему обещания.
Помоги мне проверить это!
https://github.com/danschumann/loaddir
источник
Вы можете использовать автоматическую перезагрузку для перезагрузки модуля без выключения сервера.
устанавливать
пример
data.json
test.js
Результат:
источник
Другое простое решение - использовать fs.readFile вместо использования require, вы можете сохранить текстовый файл, содержащий объект json, и создать интервал на сервере для перезагрузки этого объекта.
плюсы:
минусы:
источник
Для людей, использующих Vagrant и PHPStorm, средство просмотра файлов - более быстрый подход
отключите немедленную синхронизацию файлов, чтобы запустить команду только при сохранении, затем создать область для файлов * .js и рабочих каталогов и добавить эту команду
vagrant ssh -c "/var/www/gadelkareem.com/forever.sh restart"
где forever.sh как
источник
Я недавно пришел к этому вопросу, потому что обычные подозреваемые не работали со связанными пакетами. Если вы похожи на меня и используете преимущества в
npm link
процессе разработки для эффективной работы над проектом, состоящим из множества пакетов, важно, чтобы изменения, возникающие в зависимостях, также вызывали перезагрузку.Попробовав node-mon и pm2, даже следуя их инструкциям по дополнительному просмотру папки node_modules, они все равно не получили изменений. Хотя в ответах есть несколько нестандартных решений, для чего-то подобного отдельный пакет будет чище. Я наткнулся на node-dev сегодня, и он отлично работает без каких-либо опций или настроек.
Из файла Readme:
источник
источник
Вы можете сделать это с помощью обновления браузера . Приложение вашего узла перезапускается автоматически, ваша страница результатов в браузере также обновляется автоматически. Недостатком является то, что вы должны поместить фрагмент js на созданную страницу. Вот репо для рабочего примера.
источник
Я пробовал pm2 : установка проста и удобна в использовании; результат удовлетворительный. Однако мы должны позаботиться о том, какой выпуск pm2 нам нужен. pm 2 runtime является бесплатной версией, тогда как pm2 plus и pm2 enterprise не бесплатны.
Что касается Strongloop , моя установка не удалась или не была завершена, поэтому я не мог его использовать.
источник
В настоящее время используется сервер разработки WebPack с горячей опцией. Вы можете добавить такой скрипт в свой package.json:
"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
и каждое изменение в ваших файлах будет автоматически вызывать перекомпиляцию
источник