Dzięki temu ćwiczeniu w Codelabs dowiesz się, jak wdrożyć bibliotekę Quicklink w wersji demonstracyjnej React SPA, aby zademonstrować, jak pobieranie z wyprzedzeniem przyspiesza późniejszą nawigację.
Zmierz odległość
Przed dodaniem optymalizacji zawsze warto najpierw przeanalizować bieżący stan aplikacji.
- Aby udostępnić projekt do edycji, kliknij Remiksuj, aby edytować.
- Aby wyświetlić podgląd strony, kliknij Wyświetl aplikację. Następnie naciśnij Pełny ekran
Jest to prosta wersja demonstracyjna utworzona w aplikacji create-react-app.
Na nowej karcie, która właśnie została otwarta, wykonaj te czynności:
- Naciśnij „Control + Shift + J” (lub „Command + Option + J” na Macu), aby otworzyć Narzędzia deweloperskie.
- Kliknij kartę Sieć.
- Zaznacz pole wyboru Wyłącz pamięć podręczną.
- Aby symulować wolne połączenie, na liście Ograniczanie wybierz Szybkie 3G.
- Załaduj ponownie aplikację.
- Wpisz
chunk
w polu Filtr tekstowy, aby ukryć wszystkie zasoby, które nie mają w nazwie słowachunk
.
W witrynie stosowany jest podział kodu na podstawie tras, dzięki któremu na początku wymagany jest tylko niezbędny kod.
- Wyczyść żądania sieciowe w Narzędziach deweloperskich.
- W aplikacji kliknij link Blog, aby przejść na tę stronę.
W celu wyrenderowania strony zostaną wczytane fragmenty JS i CSS dla nowej trasy.
Następnie wdrożysz w witrynie Quicklink, co pozwoli wstępnie pobrać te fragmenty na stronę główną i przyspieszyć nawigację.
Dzięki temu można połączyć najlepsze cechy obu metod:
- Dzielenie kodu na podstawie trasy informuje przeglądarkę, że podczas wczytywania strony ma wczytywać tylko niezbędne fragmenty o wyższym priorytecie.
- Pobieranie z wyprzedzeniem informuje przeglądarkę, że w czasie jej bezczynności przeglądarka ładuje fragmenty linków w widocznym obszarze o najniższym priorytecie.
Skonfiguruj webpack-route-manifest
Pierwszym krokiem jest zainstalowanie i skonfigurowanie webpack-route-manifest – wtyczki pakietu internetowego, która umożliwia wygenerowanie pliku manifestu wiążącego trasy z odpowiednimi fragmentami.
Zazwyczaj trzeba samodzielnie zainstalować bibliotekę, ale my już to zrobiliśmy. Oto polecenia, które należy uruchomić:
npm install webpack-route-manifest --save-dev
config-overrides.js
to plik umieszczony w katalogu głównym projektu, w którym możesz zastąpić dotychczasowe zachowanie konfiguracji pakietu internetowego bez konieczności wyrzucania projektu.
- Aby wyświetlić źródło, kliknij Wyświetl źródło.
Otwórz plik config-overrides.js
, aby go edytować, i dodaj zależność webpack-route-manifest
na początku pliku:
const path = require('path');
const RouteManifest = require('webpack-route-manifest');
Następnie skonfiguruj wtyczkę webpack-route-manifest
, dodając
kod na końcu config-overrides.js
:
module.exports = function override(config) {
config.resolve = {
...config.resolve,
alias: {
'@assets': `${path.resolve(__dirname, 'src/assets')}`,
'@pages': `${path.resolve(__dirname, 'src/pages')}`,
'@components': `${path.resolve(__dirname, 'src/components')}`,
},
};
config.plugins.push(
new RouteManifest({
minify: true,
filename: 'rmanifest.json',
routes(str) {
let out = str.replace('@pages', '').toLowerCase();
if (out === '/article') return '/blog/:title';
if (out === '/home') return '/';
return out;
},
}),
);
return config;
};
Nowy kod wykonuje takie operacje:
config.resolve
deklaruje zmienne z wewnętrznymi trasami do stron, zasobów i komponentów.config.plugins.push()
tworzy obiektRouteManifest
i przekazuje mu konfigurację, tak aby plikrmanifest.json
mógł zostać wygenerowany na podstawie tras i fragmentów witryny.
Plik manifest.json
zostanie wygenerowany i udostępniony https://site_url/rmanifest.json
.
Skonfiguruj szybki link
W tym momencie musisz zainstalować w projekcie bibliotekę Quicklink. Dla uproszczenia już go dodaliśmy do projektu. Oto polecenia, które należy uruchomić:
npm install --save quicklink
Otwórz plik src/components/App/index.js
do edycji.
Najpierw zaimportuj komponent Quicklink wyższego rzędu (HOC):
import React, { lazy, Suspense } from 'react';
import { Route } from 'react-router-dom';
import Footer from '@components/Footer';
import Hero from '@components/Hero';
import style from './index.module.css';
import { withQuicklink } from 'quicklink/dist/react/hoc.js';
const Home = lazy(() => import(/* webpackChunkName: "home" */ '@pages/Home'));
const About = lazy(() => import(/* webpackChunkName: "about" */ '@pages/About'));
const Article = lazy(() => import(/* webpackChunkName: "article" */ '@pages/Article'));
const Blog = lazy(() => import(/* webpackChunkName: "blog" */ '@pages/Blog'));
Następnie utwórz obiekt options
po deklaracji zmiennej Blog
, który będzie używany jako argument przy wywoływaniu funkcji quicklink
:
const options = {
origins: []
};
Na koniec dodaj do każdej trasy komponent withQuicklink()
określający wyższą kolejność, przekazując do niej parametr options
i komponent docelowy tej trasy:
const App = () => (
<div className={style.app}>
<Hero />
<main className={style.wrapper}>
<Suspense fallback={<div>Loading...</div>}>
<Route path="/" exact component={withQuicklink(Home, options)} />
<Route path="/blog" exact component={withQuicklink(Blog, options)} />
<Route
path="/blog/:title"
component={withQuicklink(Article, options)}
/>
<Route path="/about" exact component={withQuicklink(About, options)} />
</Suspense>
</main>
<Footer />
</div>
);
Poprzedni kod nakazuje wstępne pobieranie fragmentów tras opakowanych za pomocą atrybutu withQuicklink()
, gdy link pojawi się w widoku.
Pomiar ponownie
Powtórz pierwsze 6 kroków z sekcji Pomiar. Nie wchodź jeszcze na stronę bloga.
Po wczytaniu strony głównej zostaną załadowane fragmenty tej trasy. Potem Quicklink pobierze z wyprzedzeniem fragmenty trasy dla linków w widocznym obszarze:
Te fragmenty są żądane z najniższym priorytetem i bez blokowania strony.
Następny:
- Ponownie wyczyść dziennik sieci.
- Usuń zaznaczenie pola wyboru Wyłącz pamięć podręczną.
- Aby otworzyć tę stronę, kliknij link Blog.
Kolumna Rozmiar wskazuje, że te fragmenty zostały pobrane z „pamięci podręcznej pobierania z wyprzedzeniem”, a nie z sieci. Wczytywanie tych fragmentów bez szybkiego linku trwało około 580 ms. Korzystanie z biblioteki zajmuje teraz 2 ms, co daje 99% spadku.