Routing w Next.js - na czym polega i jak tworzyć routy?
15/12/2023
9 min
Bartosz Lewandowski
Routing w Next.js - na czym polega i jak tworzyć routy?
15/12/2023
9 min
Bartosz Lewandowski
Spis Treści
- Tworzenie Routów
- Struktura plików w folderze app
- Nawigacja
- Dynamiczne ścieżki (dynamic routes)
- Podsumowanie
Przeczytaj także: Czym jest Vercel i czy warto go wybrać? - Kilka słów od eksperta
Routing to jeden z najważniejszych aspektów każdej aplikacji internetowej. W tym artykule przyjrzymy się dokładnie, jak działa routing w Next.js (app router), nowej wersji popularnego frameworka. Czy zastanawiałeś się kiedyś, jak to jest, że klikając w link, przenosisz się do innej części strony internetowej bez konieczności przeładowania całej strony? To właśnie magia routingu! W Next.js, routing jest prostszy niż kiedykolwiek, ale co to dokładnie oznacza dla Ciebie, jako twórcy aplikacji?
Tworzenie Routów
Podstawowe routy: Każdy plik JavaScript, TypeScript, JSX, czy TSX w folderze app tworzy trasę. Na przykład, plik app/about/page.tsx odpowiada trasie /about.
Dynamiczne parametry: Aby utworzyć trasę z dynamicznymi parametrami, użyj nawiasów kwadratowych w nazwie pliku. Na przykład, app/posts/[id]/page.tsx będzie odpowiadać trasie takiej jak /posts/123.
Nested routes (Zagnieżdżone trasy): Możesz tworzyć zagnieżdżone trasy poprzez umieszczanie plików w podkatalogach. Na przykład, app/products/electronics/page.tsx odpowiada trasie /products/electronics.
Struktura plików w folderze app
W Next.js 13, "App Router" stanowi znaczącą zmianę w sposobie, w jaki deweloperzy organizują i zarządzają komponentami oraz trasami (routingiem) w swoich aplikacjach. Ta nowa koncepcja przynosi większą elastyczność i bardziej modułową architekturę, co pozwala na lepsze zarządzanie strukturą aplikacji i jej trasami.
Layout
Plik layout.tsx jest używany do definiowania wspólnego układu (layoutu) dla grupy tras. Może być użyty do określenia elementów, które będą wspólne dla wielu stron, takich jak nagłówek, stopka, pasek boczny, nawigacja itp.
Charakterystyka:
- Miejsce umieszczenia: Umieszczany jest w katalogu app lub w jego podkatalogach, aby definiować layouty dla poszczególnych sekcji aplikacji.
- Zagnieżdżanie: Możesz tworzyć zagnieżdżone layouty. Na przykład, jeśli masz layout.tsx w app/products, będzie on stosowany do wszystkich stron w app/products i jej podkatalogach.
Przykład:
Template
Plik template.tsx w Next.js 13 pełni rolę podobną do layoutu (layout.tsx), ale jest używany w nieco inny sposób. Jego główną funkcją jest otaczanie każdego dziecka (child layout lub page) unikalną instancją, co oznacza, że jest on tworzony na nowo przy każdej nawigacji.
Charakterystyka:
- Nowa instancja na nawigację: Za każdym razem, gdy użytkownik nawiguje między trasami, które używają tego samego stanu, template.tsx jest montowany na nowo. Oznacza to, że elementy DOM są tworzone od nowa, stan nie jest zachowywany, a efekty są resynchronizowane.
- Wykorzystanie useEffect i useState: Jest to idealne miejsce na funkcje, które polegają na useEffect (np. logowanie wyświetleń stron) i useState (np. formularze opinii specyficzne dla każdej strony).
Przykład:
Page
Plik page.tsx stanowi podstawę dla każdej indywidualnej strony w aplikacji Next.js.
Charakterystyka:
- Struktura URL: Nazwa i lokalizacja pliku page.tsx bezpośrednio definiuje ścieżkę URL dla danej strony.
- Logika strony: Może zawierać stan lokalny, obsługę zdarzeń, dynamiczne importy oraz inne logiki specyficzne dla danej strony.
Przykład:
Loading
Plik loading.tsx definiuje komponent wyświetlany podczas ładowania danych lub zawartości strony.
Charakterystyka:
- Ładowanie danych: Oferuje graficzną reprezentację ładowania danych, poprawiając wrażenia użytkownika.
- Uniwersalność: Może być stosowany w różnych kontekstach, np. przy ładowaniu strony, danych, obrazów.
Przykład:
Not Found
Plik not-found.tsx jest używany do definiowania komponentu, który jest wyświetlany, gdy użytkownik próbuje uzyskać dostęp do strony, która nie istnieje (błąd 404).
Charakterystyka:
- Komunikacja z użytkownikiem: Informuje użytkownika, że strona, której szuka, nie została znaleziona.
- Przyjazny interfejs: Zawiera zazwyczaj linki powrotne do strony głównej lub innych głównych sekcji witryny.
Przykład
Error
Plik error.tsx służy do tworzenia komponentu wyświetlanego w przypadku wystąpienia błędu w aplikacji.
Charakterystyka:
- Obsługa Błędów: Może obsługiwać różne rodzaje błędów, w tym błędy serwera czy błędy aplikacji.
- Informowanie użytkownika: Zawiera informacje o błędzie oraz możliwe sugestie dla użytkownika.
Przykład
Nawigacja
W Next.js istnieją dwa sposoby nawigacji pomiędzy trasami (routes):
- Użycie komponentu <Link>
- Użycie hooka useRouter
Poniżej omówię, jak korzystać z <Link> i useRouter(), oraz przybliżę działanie nawigacji.
Komponent Link
to wbudowany komponent, który rozszerza tag HTML <a>, oferując prefetching i nawigację po stronie klienta między trasami. Jest to główny sposób nawigacji między trasami w Next.js.Możesz użyć go, importując go z next/link i przekazując prop href do komponentu:
PrzykładyLinkowanie do dynamicznych segmentów: Możesz używać literałów szablonów i interpolacji do generowania listy linków. Na przykład, aby wygenerować listę postów na blogu:
Sprawdzanie aktywnych linków: Można użyć usePathname(), aby określić, czy link jest aktywny. Na przykład, aby dodać klasę do aktywnego linku, można sprawdzić, czy bieżąca ścieżka (pathname) pasuje do href linku:
Przewijanie do id: Możesz chcieć przewinąć do konkretnego id przy nawigacji. W tym celu możesz dołączyć do URL # hash
Wyłączenie przewijania: Jeśli chcesz wyłączyć to zachowanie, możesz przekazać scroll={false} do komponentu <Link>
Hook useRouter() W Next.js istnieje możliwość bezpośredniego wykorzystania Routera, co może być przydatne w specyficznych sytuacjach, mimo że w większości przypadków korzystanie z komponentu <Link> jest preferowane. Użycie routera warto rozważyć w następujących okolicznościach:
- Automatyczne przekierowanie: Po wykonaniu asynchronicznej operacji, takiej jak zapytanie do API, może być konieczne automatyczne przekierowanie użytkownika na inną podstronę.
- Zmiana adresu dla niezalogowanych użytkowników: W sytuacji, gdy niezalogowany użytkownik próbuje uzyskać dostęp do zasobów ograniczonych, router może być użyty do zmiany adresu strony na bardziej odpowiedni.
- Nawigacja po zalogowaniu: Po pomyślnym procesie logowania, router może być wykorzystany do przekierowania użytkownika z powrotem na stronę, z której rozpoczął proces logowania.Obiekt router zawiera kilka przydatnych funkcji: push, replace, refresh, prefetch, back, forward
Przykład:
Hook useParams()
Ten hook dostarcza nam obiekt zawierający parametry dynamiczne, które są w istocie równoważne z tym, co znajdziemy w params przesyłanych do komponentu page.tsx.
Przykład:
Hook useSearchParams()
Ta funkcjonalność przekazuje coś w rodzaju searchParams z page.tsx, ale z zasadniczą różnicą. Zamiast zwykłego obiektu otrzymujemy instancję URLSearchParams, a ściślej ReadonlyURLSearchParams.
Przykład:
Jeśli adres URL to /search?query=telefon, komponent SearchPage wyświetli "Wyszukiwane słowo: telefon".
Hook usePathname()
Zwraca bieżącą ścieżkę.Przykład:
Jeśli adres URL to /about, komponent Navigation wyświetli "Aktualna ścieżka: /about".
Hook useSelectedLayoutSegment()
Pozwala na odczytanie ścieżki pliku strony na poziomie głębszym niż komponent, w którym został wywołany. Choć brzmi to skomplikowanie, poniższy przykład powinien to wyjaśnić. Użycie tego hooka jest sensowne tylko w plikach layout.tsx.
Przykład:
W tym przykładzie, jeśli użytkownik jest na stronie /dashboard/settings, DashboardLayout wyświetli "Aktualny segment: settings".
Hook useSelectedLayoutSegments()
Działa podobnie do useSelectedLayoutSegment, lecz zwraca tablicę ścieżek, stąd liczba mnoga w nazwie. Przyjrzyjmy się przykładowi dla lepszego zrozumienia: Przykład:
Jeśli adres URL to /dashboard/settings/profile, Breadcrumbs wyświetli "Ścieżka: dashboard / settings / profile".
Dynamiczne ścieżki (dynamic routes)
Next.js, popularny framework do tworzenia aplikacji, oferuje potężną funkcję dynamicznego routingu, która otwiera nowe możliwości dla developerów. Dynamiczne ścieżki w Next.js pozwalają na tworzenie bardziej interaktywnych i skalowalnych aplikacji internetowych.
Co to są dynamiczne ścieżki?
Dynamiczne ścieżki w Next.js pozwalają na tworzenie URL-i, które dopasowują się do danych wejściowych użytkownika lub specyficznych wymagań aplikacji. Dzięki temu możemy tworzyć bardziej elastyczne i przyjazne aplikacje.
Konwencja
Dynamiczny segment tworzy się przez umieszczenie nazwy folderu w nawiasach kwadratowych: [folderName]. Na przykład [id] lub [slug].
Te dynamiczne segmenty są przekazywane jako prop params do funkcji layout, page, route oraz generateMetadata.
Przykład: Przykładowo, blog może zawierać ścieżkę app/blog/[slug]/page.js, gdzie [slug] jest dynamicznym segmentem dla postów blogowych.
Strony statyczne
Funkcja generateStaticParams służy statycznego generowania tras w czasie budowania aplikacji.
// app/blog/[slug]/page.tsx
Zastosowania Dynamicznych Ścieżek
- Strony profili użytkowników: Jak wspomniano wyżej, dynamiczne ścieżki są idealne do tworzenia stron profilowych, gdzie każdy użytkownik ma unikalny URL oparty o jego ID.
- Blogi i artykuły: Podobnie, w serwisach informacyjnych lub blogach, dynamiczne ścieżki mogą być użyte do generowania indywidualnych stron dla każdego artykułu lub postu.
- Sklepy internetowe: W e-commerce dynamiczne ścieżki pozwalają na tworzenie oddzielnych stron dla każdego produktu, gdzie ścieżka zawiera unikalny identyfikator lub nazwę produktu.
Podsumowanie
W tym poście skupiam się na routingu w Next.js, ważnym aspekcie tworzenia aplikacji internetowych. Omówiłem podstawy tworzenia różnych rodzajów tras (routów) w Next.js, w tym standardowych, dynamicznych i zagnieżdżonych, a także struktury plików w folderze app. Zawarłem szczegółowe informacje o komponentach jak layout.tsx, template.tsx, page.tsx, oraz o obsłudze różnych sytuacji, jak strony ładowania, błędów, czy nieznalezionych stron. Ponadto, przewodnik przedstawia różne metody nawigacji, w tym użycie komponentu <Link>, różnych hooków oraz dynamicznych ścieżek. Praktyczne przykłady kodu są włączone do każdego tematu, aby lepiej zrozumieć ich zastosowanie.
Uffff... No to mamy to za sobą. Dalej głodny wiedzy? No to pora wgryźć się w bardzo ważny temat jakim jest rendering. Ale spokojnie, bo w artykule Renderowanie w Next.js - server i client components w pigułc wszystko dokładnie omówiliśmy! Sprawdź sekcję FAQ i do zobaczenia! :)
Często zadawane pytania
- Czym jest routing w Next.js? Routing w Next.js to sposób zarządzania nawigacją w aplikacji, pozwalający na ładowanie różnych komponentów bez konieczności przeładowania całej strony.
- Jak tworzy się podstawowe routy w Next.js? Podstawowe routy tworzy się, umieszczając pliki JavaScript, TypeScript, JSX, lub TSX w folderze app. Nazwa i lokalizacja pliku bezpośrednio definiuje trasę URL.
- Co to są dynamiczne ścieżki w Next.js? Dynamiczne ścieżki to te, które mogą się zmieniać w zależności od danych wejściowych użytkownika lub specyficznych wymagań aplikacji, umożliwiając tworzenie bardziej elastycznych tras.
- Jak działa nawigacja w Next.js? Nawigacja w Next.js może odbywać się za pomocą komponentu <Link> dla nawigacji po stronie klienta lub poprzez hooki, takie jak useRouter, do bardziej zaawansowanych zastosowań nawigacyjnych.
- Jakie są różnice między layout.tsx, template.tsx, a page.tsx? layout.tsx definiuje wspólny układ dla grupy tras, template.tsx tworzy unikalną instancję dla każdego dziecka przy nawigacji, a page.tsx stanowi podstawę dla każdej indywidualnej strony w aplikacji.
- Jak obsługuje się błędy i nieznalezione strony w Next.js? Używa się specjalnych plików, takich jak error.tsx i not-found.tsx, aby zdefiniować komponenty wyświetlane w przypadku błędów lub gdy strona nie zostanie znaleziona.
Bartosz Lewandowski
CEO