Czym dokładnie jest Hot Module Replacement w Webpack?

Przeczytałem Kilka strony o wymianie Hot Module w Webpack.
Istnieje nawet przykładowa aplikacja , która używa jej .

Przeczytałem to wszystko i nadal nie rozumiem.

Co mogę z tym zrobić?
Czy ma być stosowany tylko w rozwoju, a nie w produkcji?
Czy to jak wątróbka, ale musisz sama sobie z tym poradzić?
Czy WebpackDevServer jest z nim w jakiś sposób zintegrowany?

Załóżmy, że chcę zaktualizować mój CSS (jeden arkusz stylów) i moduły JS po zapisaniu ich na dysk, bez przeładowywania strony i bez używania wtyczek takich jak LiveReload. Czy to coś, w czym może mi pomóc Gorąca wymiana modułów? Jakie prace muszę wykonać i co HMR już zapewnia?

Author: Dan Abramov, 2014-07-05

2 answers

najpierw chcę zauważyć, że Hot Module Replacement (HMR) jest nadal funkcją eksperymentalną.

HMR jest sposobem wymiany modułów w uruchomionej aplikacji (oraz dodawania/usuwania modułów). Zasadniczo można aktualizować zmienione moduły bez przeładowania pełnej strony.

Dokumentacja

Wymagania wstępne:

To nie tyle dla HMR, ale tutaj są linki:

Dodam te odpowiedzi do dokumentacja.

Jak to działa?

Z widoku aplikacji

Kod aplikacji prosi środowisko wykonawcze HMR o sprawdzenie aktualizacji. Środowisko wykonawcze HMR pobiera aktualizacje (asynchroniczne) i informuje kod aplikacji, że aktualizacja jest dostępna. Kod aplikacji prosi środowisko wykonawcze HMR o zastosowanie aktualizacji. Środowisko wykonawcze HMR stosuje aktualizacje (synchronizacja). Kod aplikacji może, ale nie musi, wymagać interakcji użytkownika w tym procesie (Ty decydujesz).

Z widoku kompilatora (webpack)

Oprócz w normalnych zasobach kompilator musi emitować "Update", aby umożliwić aktualizację z poprzedniej wersji do tej wersji. "Aktualizacja" składa się z dwóch części:

    [[28]}manifest aktualizacji (json)
  1. jeden lub wiele fragmentów aktualizacji (js)

Manifest zawiera nowy hash kompilacji i listę wszystkich fragmentów aktualizacji (2).

Fragmenty aktualizacji zawierają kod dla wszystkich zaktualizowanych modułów w tym fragmencie (lub flagę, jeśli moduł został usunięty).

Kompilator dodatkowo upewnia się, że identyfikatory module i chunk id są spójne między tymi kompilacjami. Używa" zapisuje " plik json do przechowywania ich pomiędzy kompilacjami (lub przechowuje je w pamięci).

Z widoku modułu

HMR jest funkcją opt-in, Więc dotyczy tylko modułów zawierających kod HMR. Dokumentacja opisuje API dostępne w modułach. Ogólnie rzecz biorąc, programista modułu pisze programy obsługi, które są wywoływane, gdy aktualizowana jest zależność tego modułu. Mogą również napisać handler, który jest wywoływany podczas aktualizacji tego modułu.

W większości przypadków zapisywanie kodu HMR w każdym module nie jest obowiązkowe. Jeśli moduł nie ma uchwytów HMR, aktualizacja zostanie uruchomiona. Oznacza to, że pojedyncza obsługa może obsługiwać aktualizacje dla całego drzewa modułów. Jeśli jeden moduł w tym drzewie jest aktualizowany, całe drzewo modułów jest przeładowywane (tylko przeładowywane, nie przenoszone).

W tym celu należy skontaktować się z Działem obsługi klienta.]}

Dodatkowy kod jest emitowany dla systemu modułów runtime to track module parents i children.

Po stronie zarządzania runtime obsługuje dwie metody: check oraz apply.

A check wykonuje żądanie HTTP do manifestu aktualizacji. Gdy to żądanie nie powiedzie się, aktualizacja nie jest dostępna. W innym przypadku lista zaktualizowanych kawałków jest porównywana z listą aktualnie załadowanych kawałków. Dla każdego załadowanego fragmentu pobierany jest odpowiedni fragment aktualizacji. Wszystkie aktualizacje modułów są przechowywane w trybie wykonawczym jako aktualizacje. Runtime przełącza się do ready stan, co oznacza, że aktualizacja została pobrana i jest gotowa do zastosowania.

Dla każdego nowego żądania fragmentu w stanie gotowości pobierany jest również fragment aktualizacji.

Metoda apply oznacza wszystkie zaktualizowane Moduły jako nieprawidłowe. Dla każdego nieprawidłowego modułu w module musi znajdować się Obsługa aktualizacji lub Obsługa aktualizacji w każdym rodzicu. W przeciwnym razie nieprawidłowe pęcherzyki się i oznacza wszystkich rodziców jako nieprawidłowe zbyt. Proces ten trwa, dopóki nie nastąpi więcej "bubble up". Jeśli bąbelki do punkt wejścia, proces się nie powiedzie.

Teraz wszystkie nieprawidłowe moduły są usuwane (dispose handler) i rozładowywane. Następnie aktualny hash jest aktualizowany i wywoływane są wszystkie procedury obsługi "accept". Runtime przełącza się z powrotem do stanu idle i wszystko przebiega normalnie.

wygenerowane fragmenty aktualizacji

Co mogę z tym zrobić?

Można go użyć w rozwoju jako zamiennik wątroby. W rzeczywistości webpack-dev-server obsługuje tryb gorący, który próbuje zaktualizować za pomocą HMR przed próbą przeładuj całą stronę. Wystarczy dodać webpack/hot/dev-server i wywołać dev-server za pomocą --hot.

Można go również używać w produkcji jako mechanizmów aktualizacji. Tutaj musisz napisać własny kod zarządzania, który integruje HMR z Twoją aplikacją.

Niektóre Ładowarki już generują moduły, które można aktualizować podczas pracy. na przykład {[10] } może wymienić arkusz stylów. Nie musisz robić niczego specjalnego.

Załóżmy, że chcę zaktualizować mój CSS (jeden arkusz stylów) i JS moduły po zapisaniu ich na dysk, bez przeładowywania strony i bez używania wtyczek takich jak LiveReload. Czy to coś, w czym może mi pomóc Gorąca wymiana modułów?

Tak

Jaki rodzaj pracy muszę wykonać i co HMR już zapewnia?

Oto mały przykład: http://webpack.github.io/docs/hot-module-replacement-with-webpack.html

Moduł może zostać zaktualizowany tylko wtedy, gdy go "zaakceptujesz". Więc musisz module.hot.accept moduł w rodzicach lub rodzicach rodziców... np. router jest dobrym miejscem, lub subview.

Jeśli chcesz używać go tylko z webpack-dev-server, po prostu dodaj webpack/hot/dev-server jako punkt wejścia. W przeciwnym razie potrzebujesz kodu zarządzania HMR, który wywoła check i apply.

Opinia: co sprawia, że jest tak fajny?

    [[28]}to wątroba, ale dla każdego rodzaju modułu. Możesz go użyć w produkcji.
  • aktualizacje respektują podział kodu i pobierają tylko aktualizacje dla używanych części aplikacji.
  • można go używać dla części aplikacji i nie wpływa to na inne moduły
  • jeśli HMR jest wyłączony, cały kod HMR jest usuwany przez kompilator(zawiń go w if(module.hot)).

Caveats

  • to eksperymentalne i niezbyt dobrze przetestowane.
  • spodziewaj się błędów.
  • teoretycznie użyteczny w produkcji, ale może być za wcześnie, aby użyć go do czegoś poważnego.
  • identyfikatory modułów muszą być śledzone pomiędzy kompilacji więc trzeba je przechowywać (records).
  • optymalizator nie może już optymalizować identyfikatorów modułów po pierwszej kompilacji. Mały wpływ na rozmiar wiązki.
  • HMR runtime code zwiększa rozmiar pakietu.
  • do użycia w produkcji wymagane są dodatkowe testy w celu przetestowania urządzeń obsługujących HMR. To może być trudne.
 286
Author: Tobias K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 17:24:54

Zaakceptowana odpowiedź i tak wszystko jest poprawne poniższy opis pomaga szybko zrozumieć, czym jest HMR.

Hot module replacement jest jedną z najnowszych technik w rozwoju javascript, która przyciąga uwagę programistów. Ułatwia rozwój poprzez zmniejszenie liczby odświeżania strony poprzez zastąpienie modułów zmianami w czasie wykonywania.

Szukając o HMR znalazłem Artykuł który wyjaśnia pojęcie w internecie można go uzyskać z tutaj i dodanie obrazu GIF, który wyjaśnia pojęcie bez większego wyjaśnienia.

Tutaj działa-zauważ, że timer nie resetuje się do 0, tak jak po przeładowaniu strony, a css również zmienia automatyczne odświeżanie. Wymiana gorącego modułu GIF

Webpack pomaga osiągnąć HMR. Docs znajdziesz tutaj

Pomaga osiągnąć następujące

  • Zachowuje stan aplikacji utracony podczas pełnego przeładowania.

  • Oszczędź cenny czas rozwoju dzięki aktualizuję tylko to, co się zmieniło.

  • Szybsze dostosowywanie stylów - prawie porównywalne do zmiany stylów w debugerze przeglądarki.

Tutaj jest webpack przewodnik do osiągnięcia HMR

 2
Author: Samuel J Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-18 06:35:08