Jakieś pomysły na to, jak mogę wdrożyć automatyczne przeładowywanie plików w Node.js? Mam dość ponownego uruchamiania serwera za każdym razem, gdy zmieniam plik. Najwyraźniej require()
funkcja Node.js nie ładuje plików, jeśli były już wymagane, więc muszę zrobić coś takiego:
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 );
A w pliku app.js mam:
var file = require('./file');
this.app = function(req, res) {
file.serveFile( req, res, 'file.js');
}
Ale to też nie działa - pojawia się błąd w process.compile()
stwierdzeniu, że „wymaganie” nie jest zdefiniowane. process.compile
ewaluuje app.js , ale nie ma pojęcia o globalsach node.js.
javascript
node.js
disc0dancer
źródło
źródło
Object.keys(require.cache).forEach(function(key) { delete require.cache[key]; });
Odpowiedzi:
Dobrym, aktualne alternatywa
supervisor
jestnodemon
:Aby użyć
nodemon
:źródło
$ nodemon -L yourfile.js
(pełne wyjaśnienie na coderwall.com/p/aqxl_q )automatically restart the server - perfect for development
to zdecydowanie za dużo hiperboli. Ponowne ładowanie serwera może oznaczać zalogowanie się do usług zaplecza, co w moim przypadku zajmuje dużo czasu. „Idealne dla programistów” byłoby czymś w rodzaju klas przeładowywania na gorąco, gdy proces działa w pamięci bez utraty stanu, co robi studio Android po zmianie kodu źródłowego.npm install [--save-dev | -D] nodemon
aby ograniczyć instalację do zakresu projektu.superwizor węzła jest niesamowity
użycie do ponownego uruchomienia po zapisaniu:
przez isaacs - http://github.com/isaacs/node-supervisor
źródło
"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
(mam instalacji użytkownika innego niż root węzła)PATH
znalazłem prosty sposób:
źródło
delete require.cache[require.resolve('./mymodule.js')];
rozwiązać umowę z prawdziwymi ścieżkami===
Jeśli ktoś nadal podejdzie do tego pytania i chce je rozwiązać przy użyciu tylko standardowych modułów, podałem prosty przykład:
Ten przykład dotyczy tylko jednego pliku (server.js), ale można go dostosować do wielu plików przy użyciu tablicy plików, pętli for, aby uzyskać wszystkie nazwy plików, lub oglądając katalog:
Ten kod został stworzony dla Node.js 0.8 API, nie jest on dostosowany do określonych potrzeb, ale będzie działał w niektórych prostych aplikacjach.
AKTUALIZACJA: Ta funkcja jest zaimplementowana w moim module simpleR , repozytorium GitHub
źródło
watch
nie jest potrzebny, można przeładować bez niegofs
, słuchając innego sygnału.nodemon pojawił się pierwszy podczas wyszukiwania w Google i wydaje się, że załatwia sprawę:
źródło
Istnieje Node-Supervisor, który możesz zainstalować
patrz http://github.com/isaacs/node-supervisor
źródło
Edycja: Moja odpowiedź jest nieaktualna. Node.js to bardzo szybko zmieniająca się technologia.
Zastanawiałem się także nad przeładowaniem modułów. Zmodyfikowałem node.js i opublikowałem źródło na Github pod nalply / node . Jedyną różnicą jest funkcja
require
. Ma opcjonalny drugi argumentreload
.Aby przeładować
app.js
w bieżącym katalogu, użyjNapisz coś takiego, a masz automatyczne przeładowanie:
Jedyny problem, jaki widzę, to zmienna
module
, ale teraz nad tym pracuję.źródło
nodemon
jest świetny. Po prostu dodaję więcej parametrów do debugowania i oglądania.pakiet.json
Komenda:
nodemon --watch server --inspect ./server/server.js
Natomiast:
--watch server
Ponownie uruchom aplikację przy zmianie.js
,.mjs
,.coffee
,.litcoffee
, oraz.json
pliki wserver
folderze (w zestawie podfoldery).--inspect
Włącz zdalny debugowanie../server/server.js
Punkt wejściaNastępnie dodaj następującą konfigurację do
launch.json
(VS Code) i rozpocznij debugowanie w dowolnym momencie.Zauważ, że lepiej jest zainstalować
nodemon
jako zależność projektową od deweloperów. Członkowie zespołu nie muszą go instalować ani zapamiętywać argumentów poleceń, po prostunpm run dev
zaczynają hakować.Zobacz więcej na temat
nodemon
dokumentów: https://github.com/remy/nodemon#monitoring-multiple-directoriesźródło
Na liście mailingowej node.js pojawił się najnowszy wątek na ten temat. Krótka odpowiedź brzmi: nie, obecnie nie jest możliwe automatyczne ponowne ładowanie wymaganych plików, ale kilka osób opracowało łatki, które dodają tę funkcję.
źródło
jeszcze innym rozwiązaniem tego problemu jest używanie na zawsze
źródło
node-dev działa świetnie. npm
install node-dev
Daje nawet powiadomienie na pulpicie, gdy serwer jest ponownie ładowany i daje powodzenie lub błędy w komunikacie.
uruchom aplikację w wierszu poleceń za pomocą:
node-dev app.js
źródło
Oto post na blogu o Hot Reloading for Node. Udostępnia gałąź węzła github , której można użyć do zastąpienia instalacji węzła, aby włączyć ponowne ładowanie na gorąco.
Z bloga:
źródło
Pracuję nad stworzeniem raczej małego „węzła”, który jest w stanie dowolnie ładować / zwalniać moduły (tzn. Możesz być w stanie zrestartować część aplikacji bez wyłączania całej aplikacji). Włączam (bardzo głupie) zarządzanie zależnościami, więc jeśli chcesz zatrzymać moduł, wszystkie moduły, które od niego zależą, również zostaną zatrzymane.
Jak dotąd tak dobrze, ale potem natknąłem się na problem z ponownym załadowaniem modułu. Najwyraźniej można po prostu usunąć moduł z „wymaganej” pamięci podręcznej i wykonać zadanie. Ponieważ nie jestem zainteresowany bezpośrednią zmianą kodu źródłowego węzła, wymyśliłem bardzo hacky-hack, czyli: wyszukaj w stosie śledzenie ostatniego wywołania funkcji „wymagaj”, pobierz odniesienie do jego pola „pamięci podręcznej” i… cóż, usuń odwołanie do węzła:
Jeszcze łatwiej, właściwie:Najwyraźniej to działa dobrze. Nie mam pojęcia, co oznaczają te argumenty [„1”], ale spełnia swoje zadanie. Wierzę, że faceci z węzła kiedyś wdrożą funkcję przeładowania, więc sądzę, że na razie to rozwiązanie jest również do przyjęcia. (btw. moja „rzecz” będzie tutaj: https://github.com/cheng81/wirez , idź tam za kilka tygodni i powinieneś zobaczyć, o czym mówię)
źródło
function (module, require) { /* your code */ }
. Gdy weźmiesz to pod uwagę,arguments[1]
wskazuje narequire
. Pętla while jest dostępna w sytuacjach, w których wywołujesz ją z innej funkcji w module (po prostu idzie ona w górę hierarchii funkcji i sprawdza wartości argumentów przekazywane do każdej).Możesz użyć nodemon z NPM . A jeśli używasz generatora Express, możesz użyć tego polecenia w folderze projektu:
lub w trybie debugowania
możesz także uruchomić bezpośrednio
Mam nadzieję, że to pomoże.
źródło
rozwiązanie na: http://github.com/shimondoodkin/node-hot-reload
zauważ, że musisz sam zadbać o wykorzystane referencje.
oznacza to, że zrobiłeś: var x = wymagany („foo”); y = x; z = x.bar; i gorąco przeładowałem to.
oznacza to, że musisz zastąpić odniesienia przechowywane w x, yiz. w gorącej funkcji oddzwaniania.
niektórzy ludzie mylą gorący przeładowanie z automatycznym restartem mój moduł nodejs-autorestart ma również integrację upstart, aby umożliwić automatyczne uruchamianie podczas rozruchu. jeśli masz małą aplikację, automatyczne ponowne uruchomienie jest w porządku, ale gdy masz dużą aplikację, ponowne ładowanie na gorąco jest bardziej odpowiednie. po prostu dlatego, że przeładowanie na gorąco jest szybsze.
Podoba mi się również mój moduł dopływu węzłów.
źródło
Nie trzeba używać nodemona lub innych podobnych narzędzi. Po prostu użyj możliwości swojego IDE.
Prawdopodobnie najlepszy jest IntelliJ WebStorm gorącą funkcji reload (automatyczne przeładowanie serwera i przeglądarki) dla node.js .
źródło
Oto metoda niskiej technologii do użycia w systemie Windows. Umieść to w pliku wsadowym o nazwie
serve.bat
:Teraz zamiast uruchamiać się
node app.js
z powłoki cmd, uruchomserve app.js
.Spowoduje to otwarcie nowego okna powłoki z serwerem. Plik wsadowy zostanie zablokowany (z powodu
/wait
), dopóki nie zamkniesz okna powłoki, w którym to momencie oryginalna powłoka cmd zapyta „Zakończyć zadanie wsadowe (T / N)?” Jeśli odpowiesz „N”, serwer zostanie ponownie uruchomiony.Za każdym razem, gdy chcesz zrestartować serwer, zamknij okno serwera i odpowiedz „N” w powłoce cmd.
źródło
struktura mojej aplikacji:
pierwsza instalacja przeładuj za pomocą tego polecenia:
następnie zmień pakiet.json :
teraz musisz użyć przeładowania w pliku serwera :
i dla ostatniej zmiany, koniec odpowiedzi wyślij ten skrypt :
teraz uruchom aplikację z tym kodem:
źródło
Użyj tego:
Teraz musisz tylko:
I konfiguracja zostanie automatycznie ponownie załadowana :)
źródło
loaddir to moje rozwiązanie do szybkiego ładowania katalogu, rekurencyjnie.
może wrócić
{ 'path/to/file': 'fileContents...' }
lub{ path: { to: { file: 'fileContents'} } }
Ma,
callback
który zostanie wywołany, gdy plik zostanie zmieniony.Obsługuje sytuacje, w których pliki są wystarczająco duże, aby
watch
wywołać je przed zakończeniem pisania.Używam go w projektach od około roku, a ostatnio dodałem do niego obietnice.
Pomóż mi przetestować bitwę!
https://github.com/danschumann/loaddir
źródło
Możesz użyć automatycznego przeładowania, aby przeładować moduł bez zamykania serwera.
zainstalować
przykład
data.json
test.js
Wynik:
źródło
innym prostym rozwiązaniem jest użycie fs.readFile zamiast użycia wymaga zapisania pliku tekstowego zawierającego obiekt json i utworzenia odstępu czasu na serwerze w celu przeładowania tego obiektu.
plusy:
Cons:
źródło
Dla osób używających Vagrant i PHPStorm, obserwator plików jest szybszy
wyłącz natychmiastową synchronizację plików, aby uruchomić komendę tylko podczas zapisywania, a następnie utwórz zakres dla plików * .js i katalogów roboczych i dodaj to polecenie
vagrant ssh -c "/var/www/gadelkareem.com/forever.sh restart"
gdzie jest forever.sh
źródło
Niedawno doszedłem do tego pytania, ponieważ zwykli podejrzani nie pracowali z połączonymi pakietami. Jeśli jesteś podobny do mnie i korzystasz z niego
npm link
podczas programowania, aby efektywnie pracować nad projektem złożonym z wielu pakietów, ważne jest, aby zmiany zachodzące w zależnościach również powodowały przeładowanie.Po wypróbowaniu node-mon i pm2, nawet postępując zgodnie z instrukcjami dotyczącymi dodatkowego oglądania folderu node_modules, nadal nie wykryli zmian. Chociaż w odpowiedziach jest kilka niestandardowych rozwiązań, dla czegoś takiego oddzielny pakiet jest czystszy. Natknąłem się na node-dev dziś i działa idealnie bez żadnych opcji i konfiguracji.
Z pliku Readme:
źródło
źródło
Możesz to zrobić odświeżając przeglądarkę . Aplikacja węzła uruchomi się ponownie automatycznie, strona wyników w przeglądarce również zostanie automatycznie odświeżona. Minusem jest to, że musisz umieścić fragment kodu js na wygenerowanej stronie. Oto repozytorium dla działającego przykładu.
źródło
Próbowałem pm2 : instalacja jest łatwa i łatwa w użyciu; wynik jest satysfakcjonujący. Musimy jednak zadbać o to, które wydanie pm2 chcemy. pm 2 runtime to darmowa wersja, natomiast pm2 plus i pm2 Enterprise nie są darmowe.
Jeśli chodzi o Strongloop , moja instalacja nie powiodła się lub nie została ukończona, więc nie mogłem z niej korzystać.
źródło
Obecnie używany jest serwer deweloperski WebPack z opcją hot. możesz dodać taki skrypt w pliku package.json:
"hot": "cross-env NODE_ENV=development webpack-dev-server --hot --inline --watch-poll",
a każda zmiana w plikach spowoduje automatyczną rekompilację
źródło