Leniwe ładowanie w Angular (uruchom to w swojej witrynie)

Opublikowany: 2023-01-17

Angular to frontendowy framework JavaScript opracowany przez Google do tworzenia skalowalnych aplikacji internetowych klasy korporacyjnej. Niektóre z tych aplikacji mogą być dość duże, wpływając na czas ładowania aplikacji.

Aby skrócić czas ładowania i poprawić ogólne wrażenia użytkowników, możesz zastosować technikę nazywaną leniwym ładowaniem. Ta natywna funkcja Angular pozwala najpierw załadować tylko wymagane bity aplikacji internetowej, a następnie w razie potrzeby załadować inne moduły.

W tym artykule dowiesz się o leniwym ładowaniu i o tym, jak może przyspieszyć działanie Twojej aplikacji internetowej.

Co to jest leniwe ładowanie?

Leniwe ładowanie odnosi się do techniki ładowania elementów strony internetowej tylko wtedy, gdy są one wymagane. Jego odpowiednikiem jest chętne ładowanie , gdy wszystko ładuje się — lub próbuje załadować — natychmiast. Szybkie pobieranie wszystkich obrazów, filmów, CSS i kodu JavaScript może oznaczać długi czas ładowania — zła wiadomość dla użytkowników.

Leniwe ładowanie jest często używane w przypadku obrazów i filmów w witrynach zawierających dużo treści. Zamiast ładowania wszystkich multimediów na raz, co wymagałoby dużej przepustowości i blokowania wyświetleń strony, elementy te są ładowane, gdy ich lokalizacja na stronie ma się przewinąć do widoku.

Angular to struktura aplikacji jednostronicowych, która opiera się na JavaScript w większości swoich funkcji. Kolekcja kodu JavaScript Twojej aplikacji może łatwo stać się duża wraz z jej rozwojem, co wiąże się z odpowiednim wzrostem wykorzystania danych i czasu ładowania. Aby przyspieszyć działanie, możesz użyć leniwego ładowania, aby najpierw pobrać wymagane moduły i odroczyć ładowanie innych modułów, dopóki nie będą potrzebne.

Korzyści z leniwego ładowania w Angular

Leniwe ładowanie oferuje korzyści, które uczynią Twoją witrynę bardziej przyjazną dla użytkownika. Obejmują one:

  • Szybszy czas ładowania: JavaScript zawiera instrukcje dotyczące wyświetlania strony i ładowania jej danych. Z tego powodu jest to zasób blokujący renderowanie . Oznacza to, że przeglądarka musi czekać na załadowanie całego kodu JavaScript przed wyrenderowaniem strony. Podczas leniwego ładowania w Angular JavaScript jest dzielony na części, które są ładowane oddzielnie. Porcja początkowa zawiera tylko logikę potrzebną głównemu modułowi strony. Ładuje się ochoczo, potem pozostałe moduły ładują się leniwie. Zmniejszając rozmiar początkowego fragmentu, przyspieszysz ładowanie i renderowanie witryny.
  • Mniejsze zużycie danych: dzieląc dane na porcje i ładując je w razie potrzeby, możesz zużywać mniej przepustowości.
  • Zachowane zasoby przeglądarki: ponieważ przeglądarka ładuje tylko potrzebne fragmenty, nie marnuje pamięci i procesora, próbując zinterpretować i renderować kod, który nie jest wymagany.
Chcesz wyprzedzić konkurencję dzięki szybko ładującej się, przyjaznej dla użytkownika witrynie? Włącz leniwe ładowanie. Dowiedz się więcej o tej natywnej funkcji kątowej i o tym, jak może przyspieszyć ładowanie. Zacznij tutaj ️ Kliknij, aby tweetować

Implementacja leniwego ładowania w Angular

Aby postępować zgodnie z tym samouczkiem, będziesz potrzebować:

  • Zainstalowany NodeJS
  • Podstawowa znajomość Angulara

Zintensyfikuj swój projekt

Do stworzenia projektu użyjesz Angular CLI. Możesz zainstalować CLI za pomocą npm, uruchamiając polecenie:

npm install -g @angular/cli

Następnie utwórz projekt o nazwie Lazy Loading Demo w następujący sposób:

ng new lazy-loading-demo --routing

To polecenie tworzy nowy projekt Angular wraz z routingiem. Będziesz pracować wyłącznie w folderze src/app , który zawiera kod Twojej aplikacji. Ten folder zawiera główny plik routingu, app-routing.module.ts . Struktura folderu powinna wyglądać następująco:

Zrzut ekranu: Struktura folderów Angular wyświetlana w terminalu.
Struktura folderów projektu Angular.

Utwórz moduł funkcji z trasami

Następnie utworzysz moduł funkcji, który będzie ładował się leniwie. Aby utworzyć ten moduł, uruchom to polecenie:

ng generate module blog --route blog --module app.module

To polecenie tworzy moduł o nazwie BlogModule wraz z routingiem. Jeśli otworzysz src /app/app-routing.module.ts , zobaczysz, że teraz wygląda to tak:

 import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: 'blog', loadChildren: () => import('./blog/blog.module').then(m => m.BlogModule) }]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }

Część, która jest ważna dla leniwego ładowania, to trzecia linia:

 const routes: Routes = [ { path: 'blog', loadChildren: () => import('./blog/blog.module').then(m => m.BlogModule) }];

Ta linia definiuje trasy. Trasa dla blogu używa argumentu loadChildren zamiast component . Argument loadChildren nakazuje Angularowi leniwe ładowanie trasy — dynamiczne importowanie modułu tylko wtedy, gdy trasa jest odwiedzana, a następnie zwracanie go do routera. Moduł definiuje własne trasy podrzędne, takie jak blog/** w swoim routing.module.ts . Wygenerowany moduł bloga wygląda następująco:

 import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { BlogComponent } from './blog.component'; const routes: Routes = [{ path: '', component: BlogComponent }]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class BlogRoutingModule { }

Zauważysz, że ten plik routingu zawiera pojedynczą trasę, '' . To rozwiązuje problem /blog i wskazuje składnik BlogComponent. Możesz dodać więcej komponentów i zdefiniować te trasy w tym pliku.

Na przykład, jeśli chcesz dodać komponent, który pobierze szczegółowe informacje o konkretnym poście na blogu, możesz utworzyć komponent za pomocą tego polecenia:

ng generate component blog/detail

To generuje komponent dla szczegółów blogu i dodaje go do modułu blogu. Aby dodać dla niego trasę, możesz po prostu dodać ją do tablicy tras:

 const routes: Routes = [{ path: '', component: BlogComponent }, {path:"/:title",component: DetailComponent}];

Spowoduje to dodanie trasy, która rozpoznaje blog/:title (na przykład blog/angular-tutorial ). Ta tablica tras jest ładowana z opóźnieniem i nie jest uwzględniona w pakiecie początkowym.

Sprawdź leniwe ładowanie

Możesz łatwo sprawdzić, czy leniwe ładowanie działa, uruchamiając ng serve i obserwując dane wyjściowe. Na dole danych wyjściowych powinieneś otrzymać coś takiego:

Zrzut ekranu: Dane wyjściowe polecenia Angular ng serve w terminalu.
Weryfikacja ładowania z opóźnieniem przy użyciu usługi Angular ng serve .

Powyższe dane wyjściowe są podzielone na dwie części: Initial Chunk Files to pliki ładowane podczas pierwszego ładowania strony. Lazy Chunk Files są ładowane z opóźnieniem. Moduł blogu jest wymieniony w tym przykładzie.

Sprawdzanie, czy dzienniki sieciowe przeglądarki nie ładują się z opóźnieniem

Innym sposobem potwierdzenia leniwego ładowania jest skorzystanie z karty Sieć w panelu Narzędzia dla programistów w przeglądarce. (W systemie Windows jest to F12 w Chrome i Microsoft Edge oraz CtrlShiftI w Firefoksie. Na komputerze Mac jest to CommandOptionI w Chrome, Firefox i Safari).

Wybierz filtr JS , aby wyświetlić tylko pliki JavaScript załadowane przez sieć. Po początkowym załadowaniu aplikacji powinieneś otrzymać coś takiego:

Zrzut ekranu: Pliki Angular JavaScript zalogowane w Narzędziach dla programistów.
Początkowy dziennik pobrań JavaScript wyświetlany w Narzędziach dla programistów.

Gdy przejdziesz do /blog , zauważysz, że ładowany jest nowy fragment, src_app_blog_blog_module_ts.js . Oznacza to, że zażądano Twojego modułu tylko wtedy, gdy nawigowałeś do tej trasy i jest on ładowany leniwie. Dziennik sieciowy powinien wyglądać mniej więcej tak:

Zrzut ekranu: Zaktualizowany widok plików Angular JavaScript zalogowanych w Narzędziach deweloperskich.
Leniwie ładowany moduł pojawiający się w plikach do pobrania rejestrowanych przez Narzędzia deweloperskie.

Ładowanie wszystkich mediów jednocześnie = długi czas ładowania! To zła wiadomość dla użytkowników. Sprawdź, jak leniwe ładowanie może poprawić zarówno wydajność Twojej witryny, jak i zadowolenie użytkowników. Kliknij, aby tweetować

Lazy Loading vs Eager Loading

Dla porównania stwórzmy też chętnie ładowany moduł i zobaczmy, jak wpływa on na rozmiar pliku i czas ładowania. Aby to zademonstrować, utworzysz moduł do uwierzytelniania. Taki moduł może wymagać szybkiego załadowania, ponieważ uwierzytelnianie jest czymś, czego możesz wymagać od wszystkich użytkowników.

Wygeneruj AuthModule, uruchamiając to polecenie w CLI:

ng generate module auth --routing --module app.module

To generuje moduł i plik routingu. Dodaje również moduł do pliku app.module.ts . Jednak w przeciwieństwie do polecenia, którego użyliśmy do wygenerowania modułu ostatnim razem, ten nie dodaje leniwie ładowanej trasy. Używa parametru --routing zamiast --route <name> . To dodaje moduł uwierzytelniania do tablicy app.module.ts imports

 @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, AppRoutingModule, AuthModule //added auth module ], providers: [], bootstrap: [AppComponent] })

Dodanie modułu AuthModule do tablicy importów modułu AppModule oznacza, że ​​moduł uwierzytelniania zostanie dodany do początkowych plików porcji i zostanie dołączony do głównego pakietu JavaScript. Aby to sprawdzić, możesz ponownie uruchomić ng serve i obserwować dane wyjściowe:

Zrzut ekranu: Skrypty Angular po dodaniu modułu uwierzytelniania.
Dane wyjściowe polecenia Angular ng serve po dodaniu modułu uwierzytelniania.

Jak widać, moduł uwierzytelniania nie jest częścią leniwych plików porcji. Dodatkowo zwiększył się rozmiar pakietu początkowego. Rozmiar pliku main.js prawie się podwoił, zwiększając się z 8 KB do 15 KB. W tym przykładzie wzrost jest niewielki, ponieważ komponenty nie zawierają dużo kodu. Ale w miarę wypełniania komponentów logiką rozmiar pliku będzie się zwiększał, co stanowi mocny argument za leniwym ładowaniem.

Streszczenie

Nauczyłeś się korzystać z leniwego ładowania w Angular, aby pobierać moduły tylko wtedy, gdy są wymagane. Leniwe ładowanie to świetna technika skracania czasu ładowania, zmniejszania zużycia danych i lepszego wykorzystania zasobów frontendu i backendu.

Leniwe ładowanie wraz z technologią, taką jak sieci dystrybucji treści i minimalizacja JavaScript, poprawi zarówno wydajność Twojej witryny, jak i zadowolenie użytkowników.

Jeśli tworzysz witrynę WordPress i chcesz naprawdę przyspieszyć, przeczytaj o Kinsta Edge Caching, aby zobaczyć imponujące liczby.