Как автоматически перезагрузить файлы в узле.Джей?



любые идеи о том, как я мог бы реализовать автоматическую перезагрузку файлов в узле.Джей? Я устал от перезагрузки сервера каждый раз, когда я меняю файл.
Видимо Узел.js'

546   23  

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

Я нашел простой способ:

delete require.cache['/home/shimin/test2.js']

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

есть узел-Супервизор, который можно установить с помощью

npm install supervisor

см.http://github.com/isaacs/node-supervisor

Edit: мой ответ устарел. Узел.js-это очень быстро меняющаяся технология.

еще одним решением этой проблемы является использование навсегда

еще одна полезная возможность 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 вызывается до того, как они закончат писать.

Я использую его в проектах в течение года или около того, и только недавно добавили обещает он.

помогите мне боевой тест это!

https://github.com/danschumann/loaddir

вы можете использовать авто-перезагрузки модуля без выключения сервера.

установить

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

    Ничего не найдено.