[ Article ]
Ibexa bez chaosu w kodzie: jak Kaliop Content Decorator Bundle porządkuje pracę z contentem

Stanisław Klimaszewski

Kaliop
Opublikowano 28 maja 2019
Użytkownicy coraz bardziej dbają o wydajność. Budujemy rozbudowane aplikacje, a wraz z ich rozwojem rośnie również rozmiar paczki JavaScript.
Podczas tworzenia aplikacji jednostronicowych, tworzymy mnóstwo komponentów. Każdy z tych komponentów ma własne zależności, biblioteki pomocnicze i tak dalej. Kontynuujemy rozwijanie funkcji i w pewnym momencie uświadamiamy sobie, że nasza strona internetowa działa wolno. 🙀. Podczas badania problemu uświadamiamy sobie, że nasza paczka JavaScript jest zbyt duża. Można to stwierdzić na kilka sposobów:
Jeśli znalazłeś się w jednej z tych sytuacji, kolejnym pytaniem, jakie możesz sobie zadać, jest: „Dobrze, mam problem z wydajnością przez rozmiar paczki. Ale jak mam sobie z tym poradzić?”.
Użyjemy prostej aplikacji React z dwiema ścieżkami: Home and Heavy , with React router. Komponent Heavy będzie wykorzystywał biblioteki lodash i moment tylko po to, aby uczynić go tak dużym, jak to tylko możliwe (pod kątem rozmiaru paczki).
Zawsze należy zmierzyć wpływ problemu przed przystąpieniem do jakichkolwiek przedwczesnych optymalizacji. Możemy użyć narzędzia source-map-explorer aby zbadać nasze paczki JavaScript, a następnie podjąć odpowiednie kroki.
Uwaga: Używam source-map-explorer because ponieważ jest to narzędzie zalecane dla Reacta i nie wymaga "wysuwania" konfiguracji. Dla tych, którym trudno go czytać - jak mi - (like myself), możesz użyć webpack-bundle-analyzer, ale jego użycie może wymusić na Was modyfikację wewnętrznej konfiguracji projektu.
Musimy dodać nowy skrypt w pliku package.json.
Możemy wtedy uruchomić:

Patrząc na dane wyjściowe analizatora, widzimy, że lodash i moment zajmują sporo miejsca w naszej paczce. Kiedy ładujemy stronę główną, przesyłamy je niepotrzebnie – komponent strony głównej nie wymaga tych bibliotek.
W tym przypadku, jeśli wydzielimy komponent Heavy z głównej paczki, usuniemy z niej biblioteki lodash i moment co zmniejszy rozmiar paczki o ponad połowę.
To są właśnie te działania, które potrafią drastycznie odchudzić Twoje paczki JavaScript. Pamiętaj jednak, że optymalizacja powinna wymagać jak najmniejszego wysiłku i przynosić znaczące efekty. Nie trać czasu na optymalizację fragmentów ważących po 3 KiB – celuj w „grube ryby”.
Naszym celem jest oddzielenie komponentu Heavy (wraz z jego zależnościami) od reszty paczki. Wykorzystamy do tego funkcję code splitting. Najpierw zobaczmy, jak ta funkcja działa poza kontekstem Reacta.
Note: W przypadku korzystania z create-react-app, webpack jest już skonfigurowany tak, aby wspierać dzielenie kodu za pomocą dynamicznego importu.
Webpack obsługuje składnię dynamicznego importu, wykorzystując wewnętrznie mechanizm obietnic. Oto różnica między importem statycznym a dynamicznym:
Najpierw sprawdźmy, jak wygląda ruch sieciowy przed wydzieleniem komponentu:

Widzimy, że fragment 2.xxxx waży 263kb (as we saw in the analyzer) i jego ładowanie zajmuje 7.36s przy wolnym połączeniu 3G. Teraz wydzielmy „ciężki” komponent i zobaczmy, co się stanie.
Możemy do tego wykorzystać lazy oraz Suspense. Funkcja Lazy pozwala wyrenderować dynamicznie zaimportowany komponent tak, jakby był zwykłym komponentem, natomiast Suspense pozwala zdefiniować treść zastępczą, która będzie wyświetlana podczas ładowania tego komponentu.
Następnie użyjemy tego komponentu w naszym routerze.
Teraz przebudujmy i ponownie przeanalizujmy naszą paczkę.

Ten widok jest nieco bardziej szczegółowy w odniesieniu do głównej paczki, ponieważ przybliżenie zadziałało inaczej, ale nie jest to istotne
Najważniejszą rzeczą, na którą należy zwrócić uwagę, jest fakt, że mamy teraz dwa różne fragmenty (2.xxxx and 3.xxxx). Fragment 3.xxxx został utworzony, ponieważ użyliśmy dynamicznego importu, o czym wspominaliśmy w poprzedniej sekcji. Ten fragment 3.xxxx zawiera komponent Heavy i nie zostanie załadowany, jeśli nie będzie potrzebny. Dzięki temu podziałowi nasz fragment 2.xxxx waży teraz tylko 148kb, co jest wynikiem znacznie lepszym niż poprzednie 263kb.
Oto co się dzieje, gdy ładujemy stronę główną:

Strona ładuje się o ponad 2 sekundy szybciej, ponieważ paczka jest lżejsza. Teraz, jeśli przejdziemy do trasy heavy, fragment ten zostanie automatycznie pobrany:

[ Article ]

Stanisław Klimaszewski