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?
Odpowiedz
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.
Cóż, to jest niesamowite. – PixMach
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. –
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
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.
whoa rzeczywistą odpowiedź na PO! przegłosowano –
@Kris Zyp, było to wspaniałe rozwiązanie, ale czy nadal jest aktywnie utrzymywane? –
Użyj tego: https://github.com/remy/nodemon
Wystarczy uruchomić aplikację tak: nodemon yourApp.js
Nodemon restartuje serwer za każdym razem i służy wyłącznie do programowania. Całkowicie przeciwnie do tego, o co pytał Robert! :) –
@jasdeepkhalsa zaakceptowana odpowiedź sugeruje również, że restartuje serwer. – Loolooii
tak i zaakceptowana odpowiedź jest złą odpowiedzią na OP :) –
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/
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ć.
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... }); });
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.
Myślę, że node-inspector jest najlepszym wyborem.
Podobnie jak w przypadku narzędzi deweloperskich Chrome w wersji Live Edit Client side JS code, wykorzystuje to interfejs narzędziowy Chrome (Blink) do generowania kodu na żywo.
https://github.com/node-inspector/node-inspector/wiki/LiveEdit
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');
});
Możesz także użyć narzędzia PM2. Co jest zaawansowanym narzędziem do procesu produkcyjnego dla węzła js. http://pm2.keymetrics.io/
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)];
});
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