Nie używasz renderowania po stronie serwera, ale mimo to chcesz zwiększyć wydajność swojej strony React? Wypróbuj renderowanie wstępne
react-snap
jest usługą zewnętrzną
która wstępnie renderuje strony witryny na statyczne pliki HTML. Może to spowodować
poprawić
Pierwsze renderowanie
razy w aplikacji.
Oto porównanie tej samej aplikacji z renderowaniem wstępnym i bez renderowania wczytane przy symulowanym połączeniu 3G i na urządzeniu mobilnym:
Dlaczego to jest przydatne?
Głównym problemem związanym z wydajnością w przypadku dużych, jednostronicowych aplikacji jest to, użytkownik musi poczekać na zakończenie działania pakietów JavaScript tworzących witrynę przed pobraniem ich. Im większe pakiety, użytkownik będzie musiał czekać.
Aby rozwiązać ten problem, wielu programistów stosuje renderowanie aplikacji na serwerze, a nie tylko w przeglądarce. Z każdą przejście między stroną/trasą, pełny kod HTML jest generowany na serwerze i wysyłany do przeglądarki, co skraca czas pierwszego renderowania, ale wiąże się z wolniejszym Czas do pierwszego bajtu.
Renderowanie wstępne to odrębna technika, która jest mniej skomplikowana niż serwer. renderowanie, ale też pozwala poprawić czas pierwszego wyrenderowania aplikacji. Używasz przeglądarki bez interfejsu graficznego lub przeglądarki bez interfejsu użytkownika. podczas tworzenia statycznych plików HTML każdej trasy. Te pliki mogą być wysyłane wraz z pakietami JavaScript, które są potrzebne aplikacji.
reakcja
react-snap
używa aplikacji Puppeteer do:
tworzenia wstępnie renderowanych plików HTML różnych tras w aplikacji. Do
należy zainstalować go jako zależność deweloperską:
npm install --save-dev react-snap
Następnie dodaj skrypt postbuild
w narzędziu package.json
:
"scripts": {
//...
"postbuild": "react-snap"
}
Powoduje to automatyczne uruchamianie polecenia react-snap
przy każdej nowej kompilacji
utworzone aplikacje (npm build
).
Ostatnia rzecz, jaką musisz zrobić, to zmienić sposób uruchamiania aplikacji.
Zmień plik src/index.js
na taki:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
const rootElement = document.getElementById("root");
if (rootElement.hasChildNodes()) {
ReactDOM.hydrate(<App />, rootElement);
} else {
ReactDOM.render(<App />, rootElement);
}
Zamiast używać samego elementu ReactDOM.render
do renderowania głównego elementu React
bezpośrednio do DOM, sprawdza, czy są już dostępne jakieś węzły podrzędne.
co pozwala określić, czy treści HTML zostały wstępnie wyrenderowane (czy wyrenderowane na
serwer). W takim przypadku do dołączenia wydarzenia zostanie użyta właściwość ReactDOM.hydrate
detektorów istniejącego kodu HTML, zamiast tworzyć go od nowa.
Kompilacja aplikacji wygeneruje teraz statyczne pliki HTML jako ładunki dla dla każdej skanowanej trasy. Możesz zobaczyć, jak wygląda ładunek HTML Na przykład kliknij adres URL żądania HTML, a następnie kliknij przycisk Podglądy. w Narzędziach deweloperskich w Chrome.
Flash z niesformatowanymi treściami
Chociaż statyczny kod HTML jest teraz renderowany niemal natychmiast, w dalszym ciągu pozostaje domyślnie bez stylu, co może powodować problem z wyświetlaniem „błyskawicznego” stylu treści (FOUC). Może to być szczególnie zauważalne, jeśli używasz arkusza CSS-in-JS w celu wygenerowania selektorów, bo pakiet JavaScript będzie musiał musi być wykonywana przed zastosowaniem stylów.
Aby temu zapobiec, zastosuj krytyczny kod CSS lub jego minimalną ilość
wymagane do renderowania strony początkowej, może być wbudowana bezpośrednio w <head>
dokumentu HTML. react-snap
używa innej biblioteki zewnętrznej objętej
okap, minimalcss
, aby wyodrębnić
o znaczeniu krytycznym dla różnych tras. Aby włączyć tę funkcję, podaj
następujące elementy w pliku package.json
:
"reactSnap": {
"inlineCss": true
}
Podgląd odpowiedzi w Narzędziach deweloperskich w Chrome pokazuje teraz stylizowaną stronę z wbudowanymi najważniejszymi elementami CSS.
Podsumowanie
Jeśli w swojej aplikacji nie stosujesz tras renderowania po stronie serwera, użyj funkcji
react-snap
, aby wstępnie wyrenderować statyczny kod HTML użytkownikom.
- Zainstaluj ją jako zależność deweloperską i zacznij od ustawienia domyślnego ustawieniach.
- Użyj eksperymentalnej opcji
inlineCss
, aby wbudować krytyczny kod CSS, jeśli działa dla Twojej witryny. - Jeśli korzystasz z podziału kodu na poziomie komponentu w obrębie tras, zastosuj
uważaj, aby nie renderować wstępnie stanu wczytywania użytkownikom.
react-snap
README omawiamy tę kwestię bardziej szczegółowo.