Przeczytałem kilka stron na temat wymiany modułu na gorąco w pakiecie internetowym.
Jest nawet przykładowa aplikacja, która z niej korzysta .
Przeczytałem to wszystko i wciąż nie mam pojęcia.
Co mogę z tym zrobić?
- Czy ma to być wykorzystywane tylko w rozwoju, a nie w produkcji?
- Czy to jak LiveReload, ale musisz sam nim zarządzać?
- Czy WebpackDevServer jest w jakiś sposób zintegrowany z LiveReload?
Załóżmy, że chcę zaktualizować mój CSS (jeden arkusz stylów) i moduły JS podczas zapisywania ich na dysku, bez ponownego ładowania strony i bez używania wtyczek takich jak LiveReload. Czy jest to coś, co może pomóc w wymianie modułu na gorąco? Jaki rodzaj pracy muszę wykonać i co HMR już zapewnia?
javascript
module
livereload
webpack
Dan Abramov
źródło
źródło
Odpowiedzi:
Najpierw chcę zauważyć, że wymiana modułu na gorąco (HMR) jest nadal funkcją eksperymentalną.
HMR to sposób wymiany modułów w uruchomionej aplikacji (oraz dodawanie / usuwanie modułów). Zasadniczo możesz aktualizować zmienione moduły bez pełnego ponownego ładowania strony.
Dokumentacja
Wymagania wstępne:
To nie tyle dla HMR, ale tutaj są linki:
Dodam te odpowiedzi do dokumentacji.
Jak to działa?
Z widoku aplikacji
Kod aplikacji prosi środowisko wykonawcze HMR o sprawdzenie dostępności aktualizacji. Środowisko wykonawcze HMR pobiera aktualizacje (asynchronicznie) i informuje kod aplikacji, że aktualizacja jest dostępna. Kod aplikacji prosi środowisko wykonawcze HMR o zastosowanie aktualizacji. Środowisko wykonawcze HMR stosuje aktualizacje (synchronizację). Kod aplikacji może, ale nie musi wymagać interakcji użytkownika w tym procesie (Ty decydujesz).
Z widoku kompilatora (webpack)
Oprócz zwykłych zasobów kompilator musi emitować „Aktualizację”, aby umożliwić aktualizację z poprzedniej wersji do tej wersji. „Aktualizacja” składa się z dwóch części:
Manifest zawiera nowy skrót kompilacji i listę wszystkich porcji aktualizacji (2).
Części aktualizacji zawierają kod wszystkich zaktualizowanych modułów w tej części (lub flagę, jeśli moduł został usunięty).
Kompilator dodatkowo upewnia się, że identyfikatory modułów i porcji są spójne między tymi kompilacjami. Wykorzystuje plik json „Records” do przechowywania ich między kompilacjami (lub przechowuje je w pamięci).
Z widoku modułu
HMR jest funkcją opcjonalną, więc wpływa tylko na moduły zawierające kod HMR. Dokumentacja opisuje interfejs API dostępny w modułach. Ogólnie rzecz biorąc, twórca modułu zapisuje procedury obsługi, które są wywoływane, gdy aktualizowana jest zależność tego modułu. Mogą także napisać moduł obsługi, który jest wywoływany podczas aktualizacji tego modułu.
W większości przypadków napisanie kodu HMR w każdym module nie jest obowiązkowe. Jeśli moduł nie ma modułów obsługi HMR, aktualizacja rośnie. Oznacza to, że pojedynczy moduł obsługi może obsłużyć aktualizacje pełnego drzewa modułów. Jeśli pojedynczy moduł w tym drzewie jest aktualizowany, całe drzewo modułów jest ponownie ładowane (tylko ponownie ładowane, nie przesyłane).
Z widoku środowiska wykonawczego HMR (techniczne)
Emitowany jest dodatkowy kod dla środowiska wykonawczego systemu modułów do śledzenia modułu
parents
ichildren
.Po stronie zarządzania środowisko wykonawcze obsługuje dwie metody:
check
iapply
.check
Robi żądanie HTTP do manifestu aktualizacji. Gdy to żądanie nie powiedzie się, aktualizacja nie jest dostępna. W przeciwnym razie lista zaktualizowanych porcji jest porównywana z listą aktualnie załadowanych porcji. Dla każdego załadowanego fragmentu pobierany jest odpowiedni fragment aktualizacji. Wszystkie aktualizacje modułów są przechowywane w środowisku wykonawczym jako aktualizacje. Środowisko wykonawcze przełącza się wready
stan, co oznacza, że aktualizacja została pobrana i jest gotowa do zastosowania.Dla każdego nowego żądania porcji w stanie gotowym pobierana jest również porcja aktualizacji.
Ta
apply
metoda oznacza wszystkie zaktualizowane moduły jako nieprawidłowe. Dla każdego niepoprawnego modułu musi istnieć moduł obsługi aktualizacji w module lub moduł obsługi aktualizacji w każdym module nadrzędnym. Podnieś nieprawidłowe bąbelki i oznacz również wszystkich rodziców jako nieprawidłowe. Proces ten trwa do momentu, gdy nie będzie już więcej „bąbelków”. Jeśli bąbelkuje do punktu wejścia, proces kończy się niepowodzeniem.Teraz wszystkie nieprawidłowe moduły są usuwane (moduł obsługi) i rozładowywane. Następnie bieżący skrót jest aktualizowany i wywoływane są wszystkie programy obsługi „Akceptuj”. Środowisko wykonawcze przełącza się z powrotem do
idle
stanu i wszystko przebiega normalnie.Co mogę z tym zrobić?
Możesz użyć go w fazie rozwoju jako zamiennika LiveReload. W rzeczywistości serwer webpack-dev-server obsługuje tryb gorący, który próbuje zaktualizować HMR przed próbą przeładowania całej strony. Musisz tylko dodać
webpack/hot/dev-server
punkt wejścia i wywołać serwer deweloperów za pomocą--hot
.Możesz go również użyć w produkcji jako mechanizmów aktualizacji. Tutaj musisz napisać własny kod zarządzania, który integruje HMR z Twoją aplikacją.
Niektóre programy ładujące już generują moduły, które można aktualizować na gorąco. np.
style-loader
może wymieniać arkusz stylów. Nie musisz robić nic specjalnego.tak
Oto mały przykład: https://webpack.js.org/guides/hot-module-replacement/
Moduł można zaktualizować tylko wtedy, gdy go „zaakceptujesz”. Potrzebujesz więc
module.hot.accept
modułu w rodzicach lub rodzicach rodziców ... np. Router to dobre miejsce lub podsłuch.Jeśli chcesz go używać tylko z serwerem webpack-dev-server, po prostu dodaj
webpack/hot/dev-server
jako punkt wejścia. W przeciwnym razie potrzebujesz kodu zarządzającego HMR, który wywołujecheck
iapply
.Opinia: Co sprawia, że jest tak fajny?
if(module.hot)
).Ostrzeżenia
records
).źródło
require
obsługi aktualizacji HMR w blok try-catch.Przyjęta odpowiedź wyjaśnia wszystko poprawnie. Poniższy opis pomaga szybko zrozumieć, czym jest HMR.
Wymiana modułu na gorąco jest jedną z najnowszych technik opracowywania javascript, która przyciąga uwagę programistów. Pomaga w rozwoju, zmniejszając liczbę odświeżeń stron, zastępując moduły zmianami w czasie wykonywania.
Podczas przeszukiwania HMR znalazłem artykuł wyjaśniający koncepcję w Internecie, którą możesz pobrać tutaj i dodając obraz GIF, który wyjaśnia tę koncepcję bez większego wyjaśnienia.
Tutaj działa - zwróć uwagę, że licznik czasu nie resetuje się do 0, tak jak po przeładowaniu strony, a css zmienia również automatyczne odświeżanie.
Webpack pomaga osiągnąć HMR. Dokumenty można znaleźć tutaj
Pomaga osiągnąć następujące
Zachowaj stan aplikacji utracony podczas pełnego ponownego ładowania.
Oszczędzaj cenny czas programowania, aktualizując tylko to, co się zmieniło.
Szybsze dostosowywanie stylów - prawie porównywalne ze zmieniającymi się stylami w debuggerze przeglądarki.
Oto przewodnik po pakiecie internetowym, aby osiągnąć HMR
źródło