23 ответов:
хорошая, современная альтернатива
supervisorиnodemon:монитор для любых изменений в вашем узле.приложение js и автоматический перезапуск сервера-идеально подходит для разработки
использовать
nodemon:$ npm install nodemon -g $ nodemon app.js
узел-руководитель-это круто
использование для перезапуска при сохранении:
npm install supervisor -g supervisor app.jsпо isaacs -http://github.com/isaacs/node-supervisor
nodemon пришел первым в поиске google, и это, кажется, сделать трюк:
npm install nodemon -g cd whatever_dir_holds_my_app nodemon app.js
Если кто-то все еще приходит к этому вопросу и хочет решить его, используя только стандартные модули, я сделал простой пример:
var process = require('process'); var cp = require('child_process'); var fs = require('fs'); var server = cp.fork('server.js'); console.log('Server started'); fs.watchFile('server.js', function (event, filename) { server.kill(); console.log('Server stopped'); server = cp.fork('server.js'); console.log('Server started'); }); process.on('SIGINT', function () { server.kill(); fs.unwatchFile('server.js'); process.exit(); });этот пример предназначен только для одного файла (сервера.js), но может быть адаптирован к нескольким файлам с использованием массива файлов, цикла for для получения всех имен файлов или просмотра каталога:
fs.watch('./', function (event, filename) { // sub directory changes are not seen console.log(`restart server`); server.kill(); server = cp.fork('server.js'); })этот код был сделан для узла.JS 0.8 API, он не адаптирован для некоторых конкретных потребностей, но будет работать в некоторых простых приложения.
обновление: Этот функционал реализован в моем модуле проще,GitHub repo
еще одним решением этой проблемы является использование навсегда
еще одна полезная возможность Forever заключается в том, что он может дополнительно перезапустить ваше приложение, когда какие-либо исходные файлы были изменены. Это освобождает вас от необходимости вручную перезапускать каждый раз, когда вы добавляете функцию или исправляете жук. Чтобы начать навсегда в этом режиме, используйте флаг-w:
forever -w start server.js
недавно thread об этом на узле.Яш список рассылки. Короткий ответ-нет, в настоящее время невозможно автоматически перезагрузить необходимые файлы, но несколько человек разработали патчи, которые добавляют эту функцию.
здесь это сообщение в блоге о горячей перезагрузке для узла. Он обеспечивает ветвь узла github что вы можете использовать для замены установки узла, чтобы включить горячую перезагрузку.
блог:
var requestHandler = require('./myRequestHandler'); process.watchFile('./myRequestHandler', function () { module.unCacheModule('./myRequestHandler'); requestHandler = require('./myRequestHandler'); } var reqHandlerClosure = function (req, res) { requestHandler.handle(req, res); } http.createServer(reqHandlerClosure).listen(8000);теперь, каждый раз, когда вы изменяете myRequestHandler.js, приведенный выше код заметит и заменит локальный requestHandler новым кодом. Любые существующие запросы будут продолжать использовать старый код, в то время как любые новые входящие запросы будут использовать новый код. Все без выключения сервера, подпрыгивая любые запросы, преждевременно убивая любые запросы, или даже полагаясь на интеллектуальный балансировщик нагрузки.
Я работаю над созданием довольно крошечного узла "вещь", которая способна загружать/выгружать модули по желанию (так, т. е. вы могли бы быть в состоянии перезапустить часть вашего приложения, не принося все приложение вниз). Я включаю (очень глупое) управление зависимостями, так что если вы хотите остановить модуль, все модули, которые зависят от этого, тоже будут остановлены.
пока все хорошо, но потом я наткнулся на вопрос о том, как перезагрузить модуль. По-видимому, можно просто удалить модуль из кэша" require " и выполнил задание. Поскольку я не стремлюсь напрямую изменять исходный код узла, я придумал очень hacky-hack то есть: поиск в стеке трассировки последнего вызова функции "require", захватить ссылку на его "кэш" поле И..ну и удалите ссылку на узел:
var args = arguments while(!args['1'] || !args['1'].cache) { args = args.callee.caller.arguments } var cache = args['1'].cache util.log('remove cache ' + moduleFullpathAndExt) delete( cache[ moduleFullpathAndExt ] )Даже проще, на самом деле:
var deleteCache = function(moduleFullpathAndExt) { delete( require.cache[ moduleFullpathAndExt ] ) }видимо, это работает просто отлично. Я совершенно не представляю, что это аргументы ["1"] означает, но он делает свою работу. Я считаю, что ребята из node когда-нибудь реализуют средство перезагрузки, поэтому я думаю, что на данный момент это решение тоже приемлемо. (кстати. моя "вещь" будет здесь:https://github.com/cheng81/wirez, идите туда через пару недель и вы должны увидеть, о чем я говорю)
node-dev отлично работает. npm
install node-devэто даже дает уведомление, когда сервер перезагружается и даст успех или ошибки в сообщении.
запуск приложения в командной строке с:
node-dev app.js
решение по: http://github.com/shimondoodkin/node-hot-reload
обратите внимание, что вы должны заботиться сами использованной литературы.
Это означает, что если вы сделали : var x=require ('foo'); y=x;z=x. bar; и горячая перезагрузка оно.
Это означает, что вы должны заменить ссылки, хранящиеся в x, y и z. в горячей функции обратного вызова reaload.
некоторые люди путают горячую перезагрузку с автоматическим перезапуском мой модуль nodejs-autorestart также имеет интеграция upstart для включения автоматического запуска при загрузке. если у вас есть небольшое приложение, автоматический перезапуск прекрасен, но когда у вас есть большое приложение, горячая перезагрузка более подходит. просто потому, что горячая перезагрузка быстрее.
также мне нравится мой модуль node-inflow.
Не нужно использовать nodemon или другие подобные инструменты. Просто используйте возможности вашей IDE.
вероятно, лучший из них IntelliJ WebStorm С функцией горячей перезагрузки (автоматическая перезагрузка сервера и браузера) для узел.js.
используйте этот:
function reload_config(file) { if (!(this instanceof reload_config)) return new reload_config(file); var self = this; self.path = path.resolve(file); fs.watchFile(file, function(curr, prev) { delete require.cache[self.path]; _.extend(self, require(file)); }); _.extend(self, require(file)); }все, что вам нужно сделать сейчас, это:
var config = reload_config("./config");и конфиг будет автоматически перезагружен :)
loaddir-это мое решение для быстрой загрузки каталога, рекурсивно.
может возвратить
{ 'path/to/file': 'fileContents...' }или{ path: { to: { file: 'fileContents'} } }это
callbackкоторый будет вызван при изменении файла.он обрабатывает ситуации, когда файлы достаточно велики, что
watchвызывается до того, как они закончат писать.Я использую его в проектах в течение года или около того, и только недавно добавили обещает он.
помогите мне боевой тест это!
вы можете использовать авто-перезагрузки модуля без выключения сервера.
установить
npm install auto-reloadпример
данные.json
{ "name" : "Alan" }
еще одно простое решение -использовать fs.readFile вместо использования require можно сохранить текстовый файл, содержащий объект json, и создать интервал на сервере для перезагрузки этого объекта.
плюсы:
- нет необходимости использовать внешние либы
- актуально для производства (перезагрузка конфигурационного файла при изменении)
- легко реализовать
плюсы:
- вы не можете перезагрузить модуль-просто json содержит данные ключ-значение
для людей, использующих Vagrant и PHPStorm,file watcher это более быстрый подход
отключите немедленную синхронизацию файлов, чтобы вы запускали команду только при сохранении, а затем создавали область для *.js файлы и рабочие каталоги и добавить эту команду
vagrant ssh-c "/var/www/gadelkareem.com/forever.sh перезапустить"
где forever.sh это как
#!/bin/bash cd /var/www/gadelkareem.com/ && forever -l /var/www/gadelkareem.com/.tmp/log/forever.log -a app.js
Я недавно пришел к этому вопросу, потому что обычные подозреваемые не работали со связанными пакетами. Если вы похожи на меня и пользуетесь
npm linkво время разработки для эффективной работы над проектом, состоящим из многих пакетов, важно, чтобы изменения, происходящие в зависимостях, также вызывали перезагрузку.попробовав node-mon и pm2, даже следуя их инструкциям по дополнительному просмотру папки node_modules, они все равно не взяли изменения. Хотя есть некоторые пользовательские решения в ответах здесь, что-то вроде этого, отдельный пакет чище. Я наткнулся node-dev сегодня и он отлично работает без каких-либо опций или конфигурации.
из Readme:
в отличие от таких инструментов, как supervisor или nodemon, он не сканирует файловую систему для просмотра файлов. Вместо этого он подключается к функции require () узла, чтобы смотреть только файлы, которые были на самом деле требуемый.
nodemonэто здорово. Я просто добавляю дополнительные параметры для отладки и просмотра параметров.пакета.json
"scripts": { "dev": "cross-env NODE_ENV=development nodemon --watch server/**/*.js --inspect ./server/server.js" }
nodemon --watch server/**/*.js --inspect ./server/server.jsпри этом:
--watch server/**/*.jsперезапустить сервер при изменении .js файлы вserverпапка.
--inspectвключить удаленную отладку.
./server/server.jsточка входа.затем добавьте следующую конфигурацию в
launch.json(против кода) и начать отладку в любое время.{ "type": "node", "request": "attach", "name": "Attach", "protocol": "inspector", "port": 9229 }обратите внимание, что лучше установить
nodemonкак dev зависимость проекта. Поэтому членам вашей команды не нужно устанавливать его или запоминать аргументы команды, они простоnpm run devи начать взлом.
В настоящее время используется сервер webpack dev с горячей опцией. вы можете добавить такой скрипт в свой пакет.json:
"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",и каждое изменение в ваших файлах вызовет перекомпиляцию автоматически
можно использовать nodemon С NPM. И если вы используете Экспресс-генератор, то вы можете использовать эту команду внутри папки проекта:
nodemon npm startили с помощью режима отладки
DEBUG=yourapp:* nodemon npm startнадеюсь, что это поможет.
Comments