2010-05-28 14 views
53

Próbuję skonfigurować mój serwer nodejs, ale mam problem. Nie wiem, jak wyświetlić zmiany w mojej aplikacji bez jej ponownego uruchamiania. Czy istnieje sposób edycji aplikacji i zobacz zmiany na żywo w pliku node.js?Jak mogę edytować na moich plikach serwera bez restartowania nodejs, gdy chcę zobaczyć zmiany?

+0

Lepszy scenariusz jest użycie dwóch serwerów jako serwer proxy, wtórny serwer proxy spadek w dół jest obsługiwane przez nginx kiedy pierwszy z nich przechodzi w tryb offline (504error) (z nginx można edytować konfigurację z ponownym ładowaniem/bez ponownego uruchamiania), w ten sposób wszystkie żądania są automatycznie przełączane na serwer dodatkowy po zatrzymaniu pierwszego serwera, drugi serwer jest używany jako kopia zapasowa w celu aktualizacji pliki na pierwszym serwerze. Po pierwszym powrocie online nginx przełączy się na pierwszy serwer. Dzięki temu rozwiązaniu nie tracisz żadnych żądań. – diti

Odpowiedz

47

Zapoznaj się z Node-Supervisor. Możesz nadać mu zbiór plików, aby móc śledzić zmiany, i ponownie uruchamia serwer, jeśli którykolwiek z nich się zmieni. Ponownie uruchamia się, jeśli ulegnie awarii z innego powodu.

Kod "Hot-swapping" nie jest włączony w NodeJS, ponieważ tak łatwo jest przypadkowo skończyć z wyciekami pamięci lub wieloma kopiami obiektów, które nie są gromadzone w śmieci. Węzeł polega na tym, że twoje programy przypadkowo szybko, nie przypadkowo nieszczelne.

EDYCJA, 7 lat po fakcie: Zastrzeżenie, napisałem superwizora węzłów, ale przekazałem projekt innemu opiekunowi przed napisaniem tej odpowiedzi.

+0

Cóż, to jest niesamowite. – PixMach

+2

Powinno być dobrze do wymiany podczas programowania, po ponownym uruchomieniu serwera wszystko będzie w porządku, to nie znaczy, że będzie łatwe do wdrożenia. –

+0

Podany link wydaje się sugerować, że jest to twój projekt. Czy możesz wyjaśnić swoje zaangażowanie i dodać odpowiednie zastrzeżenia (w razie potrzeby)? – HPierce

58

Guzki jest ładowarka moduł Node, który obsługuje automatycznego przeładunku modułów bez ponownego uruchamiania serwera (ponieważ to jest to, co zostało z prośbą o):

http://github.com/kriszyp/nodules

guzki czy śledzenie inteligentny zależność tak odpowiednie fabryki modułów są ponownie wykonywane w celu zachowania prawidłowych referencji po przeładowaniu modułów bez konieczności pełnego ponownego uruchomienia.

+0

whoa rzeczywistą odpowiedź na PO! przegłosowano –

+0

@Kris Zyp, było to wspaniałe rozwiązanie, ale czy nadal jest aktywnie utrzymywane? –

8

Użyj tego: https://github.com/remy/nodemon

Wystarczy uruchomić aplikację tak: nodemon yourApp.js

+5

Nodemon restartuje serwer za każdym razem i służy wyłącznie do programowania. Całkowicie przeciwnie do tego, o co pytał Robert! :) –

+1

@jasdeepkhalsa zaakceptowana odpowiedź sugeruje również, że restartuje serwer. – Loolooii

+0

tak i zaakceptowana odpowiedź jest złą odpowiedzią na OP :) –

3

Co to jest „na żywo Coding”?

W gruncie rzeczy jest to sposób na zmienienie programu podczas jego działania, bez konieczności ponownego uruchamiania go przez . Celem jest jednak, aby program działał prawidłowo, gdy go (ponownie) uruchomimy. Aby być użytecznym, warto mieć edytor , który można dostosować do wysyłania kodu na serwer.

Spójrz: http://lisperator.net/blog/livenode-live-code-your-nodejs-application/

3

powinien istnieć jakiś nacisk na to, co się dzieje, a nie tylko shotgunning modułów w PO. Nie wiemy też, że pliki, które edytuje, to wszystkie moduły JS lub wszystkie używają wywołania "require". Wykonaj następujące scenariusze z przymrużeniem oka, mają one jedynie opisać, co się dzieje, więc wiesz, jak z nim pracować.

  1. Twój kod został już załadowany, a serwer jest uruchomiony z nim

    • ROZWIĄZANIE Trzeba mieć sposób, aby poinformować serwer Jaki kod został zmieniony tak, że może go przeładować . Można ustawić punkt końcowy, aby odebrać sygnał, polecenie w wierszu poleceń lub żądanie za pośrednictwem tcp/http, które wskaże, który plik został zmieniony, a punkt końcowy przeładuje go.

      //using Express 
      var fs = require('fs'); 
      app.get('reload/:file', function (req, res) { 
          fs.readfile(req.params.file, function (err, buffer) { 
           //do stuff... 
          }); 
      }); 
      
  2. Twój kod może mieć „wymagają” połączenia w nim, które ładuje i buforuje moduły

    • ROZWIĄZANIA ponieważ te moduły są buforowane przez wymagają, po wcześniejszym rozwiązaniu , potrzebujesz punktu na swoim punkcie końcowym, aby usunąć ten odnośnik:

      var moduleName = req.params.file; 
      delete require.cache[moduleName]; 
      require('./' + moduleName); 
      

Istnieje wiele zastrzeżeń, aby dostać się za to wszystko, ale mam nadzieję, że masz lepszy pomysł, co się dzieje i dlaczego.

3

jeśli chcesz, aby przeładować moduł bez ponownego procesu węzła, można to zrobić za pomocą watchFile funkcji w fs moduł i cache wyczyszczenie cechę wymagają:

Powiedzmy, że załadowany moduł z prostym wymagać:

var my_module = require('./my_module'); 

Aby obejrzeć ten plik i załadować go ponownie po aktualizacji, należy dodać następujące elementy do wygodnego miejsca w kodzie.

fs.watchFile(require.resolve('./my_module'), function() { 
    console.log("Module changed, reloading..."); 
    delete require.cache[require.resolve('./my_module')] 
    my_module = require('./my_module'); 
}); 

Jeśli moduł jest wymagane w wielu plikach operacja ta nie wpłynie na inne zadania, więc utrzymanie modułu w zmiennej globalnej i używając go, gdzie jest to potrzebne z globalnym zamiast wymagających kilkakrotnie jest rozwiązaniem. Tak więc powyższy kod będzie taki:

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'); 
}); 
0

Prosty bezpośredni rozwiązanie w odniesieniu do wszystkich dostępnych tutaj odpowiedzi:

dokumentacja Węzeł mówi, że fs.watch jest bardziej efektywne niż fs.watchFile & może obserwować cały folder.

(Właśnie zaczął używać tego tak naprawdę nie wiesz, czy są jakieś wady)

fs.watch("lib", (event_type, file_name) => { 
    console.log("Deleting Require cache for " + file_name); 
    delete require.cache[ require.resolve("./lib/" + file_name)]; 
}); 
Powiązane problemy