Suomi

Tutustu Next.js:n App Directoryn mullistavaan tiedostopohjaiseen reititysjärjestelmään, joka tarjoaa paremman organisoinnin, suorituskyvyn ja kehittäjäkokemuksen.

Next.js:n App Directory: Tiedostopohjaisen reitityksen vallankumous

Next.js on jatkuvasti rikkonut verkkokehityksen rajoja tarjoamalla kehittäjille tehokkaita työkaluja ja ominaisuuksia suorituskykyisten, skaalautuvien ja käyttäjäystävällisten sovellusten rakentamiseen. App Directoryn käyttöönotto edustaa merkittävää harppausta eteenpäin, erityisesti sen innovatiivisessa lähestymistavassa tiedostopohjaiseen reititykseen. Tämä artikkeli sukeltaa syvälle App Directoryn reititysmekanismiin, tutkien sen etuja, keskeisiä käsitteitä ja käytännön vaikutuksia modernien verkkosovellusten rakentamisessa Next.js:llä.

Reitityksen evoluution ymmärtäminen Next.js:ssä

Ennen App Directorya Next.js käytti reititykseen Pages Directorya. Vaikka tämä lähestymistapa oli tehokas, sillä oli tiettyjä rajoituksia. Pages Directory käytti yksinkertaista tiedostopohjaista reititysjärjestelmää, jossa jokainen tiedosto `pages`-kansiossa vastasi reittiä. Esimerkiksi `pages/about.js` vastaisi reittiä `/about`.

Vaikka Pages Directory oli suoraviivainen, siitä puuttui sisäänrakennettu tuki monimutkaisille asetteluille, datan hakustrategioille ja palvelinpuolen renderöintimallille, mikä usein vaati kehittäjiä toteuttamaan nämä ominaisuudet manuaalisesti. Lisäksi datan haun ja komponenttien renderöinnin tiukka kytkentä saattoi joskus johtaa suorituskyvyn pullonkauloihin.

App Directory vastaa näihin rajoituksiin esittelemällä joustavamman ja tehokkaamman reititysjärjestelmän, joka perustuu React Server Components -komponentteihin, Layout-asetteluihin ja muihin edistyneisiin ominaisuuksiin. Se siirtyy yksinkertaisesta tiedosto-reitti-vastaavuudesta ja tarjoaa deklaratiivisemman ja koostettavamman lähestymistavan sovelluksen reittien ja asettelujen määrittelyyn.

Esittelyssä App Directory: Uusi paradigma reititykselle

App Directory, joka sijaitsee Next.js-projektisi juuressa `app`-kansiossa, esittelee perustavanlaatuisesti erilaisen lähestymistavan reititykseen. Sen sijaan, että tiedostot yhdistettäisiin suoraan reitteihin, App Directory käyttää konventiopohjaista järjestelmää, jossa kansioiden ja erikoistiedostojen rakenne määrittää sovelluksen reitit.

Tämä lähestymistapa tarjoaa useita keskeisiä etuja:

App Directoryn reititysjärjestelmän keskeiset käsitteet

Jotta App Directoryn reititysjärjestelmää voidaan käyttää tehokkaasti, on olennaista ymmärtää sen toiminnallisuuden taustalla olevat keskeiset käsitteet:

1. Reittisegmentit ja kansiot

Jokainen kansio `app`-hakemistossa edustaa reittisegmenttiä. Kansion nimi vastaa polun segmenttiä URL-osoitteessa. Esimerkiksi `app/blog/posts`-kansiorakenne vastaisi reittiä `/blog/posts`.

Tarkastellaan tätä rakennetta:

app/
  blog/
    posts/
      page.js

Tämä rakenne määrittelee reitin osoitteessa `/blog/posts`. `page.js`-tiedosto `posts`-kansion sisällä on reittisegmenttikomponentti, joka renderöi kyseisen reitin sisällön.

2. `page.js`-tiedosto: Reitin sisällön renderöinti

page.js (tai page.tsx TypeScriptille) on erikoistiedosto, joka määrittelee tietylle reittisegmentille renderöitävän sisällön. Se on kyseisen reitin sisääntulopiste. Tämän tiedoston on vietävä React-komponentti oletusvientinään.

Esimerkki:

// app/blog/posts/page.js

export default function PostsPage() {
  return (
    <div>
      <h1>Blogikirjoitukset</h1>
      <p>Lista blogikirjoituksista näytetään täällä.</p>
    </div>
  );
}

3. Layoutit: Jaetun käyttöliittymän määrittely

Layoutit mahdollistavat käyttöliittymän määrittelyn, joka jaetaan useiden sivujen tai reittisegmenttien kesken. Layout voi sisältää elementtejä, kuten ylä- ja alatunnisteita, sivupalkkeja tai muita komponentteja, joiden tulisi olla yhdenmukaisia koko sovelluksen osassa. Layoutit määritellään `layout.js` (tai `layout.tsx`) -tiedostolla.

Layoutit ovat sisäkkäisiä. Tämä tarkoittaa, että juurilayout (`app/layout.js`) käärii koko sovelluksen, ja sisäkkäiset layoutit käärivät tiettyjä reittisegmenttejä. Kun navigoidaan layoutin jakavien reittien välillä, Next.js säilyttää layoutin tilan ja välttää sen uudelleenrenderöinnin, mikä parantaa suorituskykyä ja tarjoaa sulavamman käyttökokemuksen.

Esimerkki:

// app/layout.js

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <header>
          <nav>
            <a href="/">Etusivu</a> |
            <a href="/blog">Blogi</a>
          </nav>
        </header>
        <main>{children}</main>
        <footer>
          <p>Copyright 2023</p>
        </footer>
      </body>
    </html>
  );
}

Tässä esimerkissä `RootLayout` määrittelee perus-HTML-rakenteen, ylätunnisteen, alatunnisteen ja navigoinnin koko sovellukselle. Mikä tahansa sivu, joka renderöidään `app`-hakemiston sisällä, kääritään tähän layoutiin.

4. Templaatit: Tilan säilyttäminen reittien välillä

Kuten layoutit, myös templaatit käärivät lapsireittejä. Toisin kuin layoutit, templaatit kuitenkin luovat uuden komponentti-instanssin jokaiselle lapsireitille. Tämä tarkoittaa, että templaatin tilaa ei säilytetä, kun navigoidaan templaatin sisällä olevien reittien välillä. Templaatit ovat hyödyllisiä tilanteissa, joissa tila täytyy nollata tai alustaa uudelleen reittisiirtymien yhteydessä. Käytä template.js (tai template.tsx) tiedostoa templaattien luomiseen.

5. Reittiryhmät: Reittien organisointi ilman URL-segmenttejä

Reittiryhmät mahdollistavat reittien organisoinnin App Directoryssa vaikuttamatta URL-rakenteeseen. Reittiryhmät määritellään kääimällä kansionimet sulkeisiin, esim. `(ryhmän-nimi)`. Nämä sulkeet kertovat Next.js:lle, että kansiota tulee käsitellä loogisena ryhmittelymekanismina eikä reittisegmenttinä.

Tämä on erityisen hyödyllistä suurten, monia reittejä sisältävien sovellusten organisoinnissa. Voit esimerkiksi käyttää reittiryhmiä erottelemaan sovelluksesi eri osia, kuten `(marketing)` ja `(app)`. Nämä ryhmät vaikuttavat vain tiedostorakenteeseen, eivät URL-polkuihin.

Esimerkki:

app/
  (marketing)/
    home/
      page.js  // Käytettävissä osoitteessa /home
    about/
      page.js  // Käytettävissä osoitteessa /about
  (app)/
    dashboard/
      page.js  // Käytettävissä osoitteessa /dashboard

6. Dynaamiset reitit: Muuttuvien segmenttien käsittely

Dynaamiset reitit mahdollistavat reittien luomisen muuttuvilla segmenteillä. Tämä on hyödyllistä tilanteissa, joissa reittejä täytyy generoida datan perusteella, kuten blogikirjoituksille, tuotesivuille tai käyttäjäprofiileille. Dynaamiset reittisegmentit määritellään ympäröimällä segmentin nimi hakasulkeilla, esim. `[id]`. `id` edustaa parametria, johon pääsee käsiksi `page.js`-komponentin sisällä.

Esimerkki:

app/
  blog/
    [slug]/
      page.js

Tässä esimerkissä `[slug]` on dynaaminen reittisegmentti. URL kuten `/blog/my-first-post` vastaisi tätä reittiä, ja `slug`-parametri asetettaisiin arvoon `my-first-post`. Voit käyttää `slug`-parametria `page.js`-komponentin sisällä `params`-propin kautta.

// app/blog/[slug]/page.js

export default function BlogPost({ params }) {
  const { slug } = params;
  return (
    <div>
      <h1>Blogikirjoitus: {slug}</h1>
      <p>Blogikirjoituksen sisältö, jonka slug on: {slug}</p>
    </div>
  );
}

Sinun on generoitava mahdolliset arvot näille dynaamisille reiteille. Next.js tarjoaa `generateStaticParams`-funktion staattisen sivuston generointiin (SSG) ja palvelinpuolen renderöintiin (SSR). Tämä funktio mahdollistaa niiden dynaamisten reittien määrittelyn, jotka tulisi esirenderöidä käännöksen yhteydessä.

// app/blog/[slug]/page.js

export async function generateStaticParams() {
  const posts = [
    { slug: 'my-first-post' },
    { slug: 'my-second-post' },
  ];

  return posts.map((post) => ({ slug: post.slug }));
}

export default function BlogPost({ params }) {
  const { slug } = params;
  return (
    <div>
      <h1>Blogikirjoitus: {slug}</h1>
      <p>Blogikirjoituksen sisältö, jonka slug on: {slug}</p>
    </div>
  );
}

7. Catch-all-segmentit: Tuntemattomien reittien käsittely

Catch-all-segmentit ovat dynaamisen reitin tyyppi, joka mahdollistaa minkä tahansa määrän segmenttejä vastaavuuden URL-osoitteessa. Ne määritellään lisäämällä segmentin nimen eteen kolme pistettä, esim. `[...path]`. Catch-all-segmentit ovat hyödyllisiä joustavien reittien luomisessa, jotka voivat käsitellä monenlaisia URL-rakenteita.

Esimerkki:

app/
  docs/
    [...path]/
      page.js

Tässä esimerkissä `[...path]` on catch-all-segmentti. URL-osoitteet kuten `/docs/introduction`, `/docs/api/reference` ja `/docs/examples/basic` vastaisivat kaikki tätä reittiä. `path`-parametri olisi taulukko, joka sisältää vastaavat segmentit.

// app/docs/[...path]/page.js

export default function DocsPage({ params }) {
  const { path } = params;
  return (
    <div>
      <h1>Dokumentaatio</h1>
      <p>Polku: {path.join('/')}</p>
    </div>
  );
}

8. Rinnakkaiset reitit: Useiden sivujen renderöinti samanaikaisesti

Rinnakkaiset reitit mahdollistavat useiden sivujen renderöinnin samassa layoutissa samanaikaisesti. Tämä on erityisen hyödyllistä monimutkaisten käyttöliittymäkuvioiden luomisessa, kuten kojelaudoissa, joissa on useita paneeleita, tai modaali-ikkunoissa, jotka ilmestyvät nykyisen sivun päälle. Rinnakkaiset reitit määritellään käyttämällä @-symbolia, esim. `@children`, `@modal`. Ne voidaan määrittää suoraan URL-osoitteessa tai niihin voidaan navigoida `useRouter`-koukun avulla.

Esimerkki:

app/
  @children/
    page.js // Renderöi pääsisällön
  @modal/
    login/
      page.js // Renderöi kirjautumismodaalin

Näyttääksesi rinnakkaisia reittejä, käytä ``-komponenttia.

9. Reittien sieppaus: Hienostuneiden käyttöliittymäsiirtymien luominen

Reittien sieppaus mahdollistaa reitin lataamisen toisesta sovelluksesi osasta nykyisen reitin kontekstissa. Tätä voidaan käyttää hienostuneiden käyttöliittymäsiirtymien luomiseen, kuten modaali-ikkunan näyttämiseen linkkiä napsautettaessa ilman, että siirrytään pois nykyiseltä sivulta. Ne määritellään käyttämällä (...)-syntaksia.

Datan haku App Directoryssa

App Directory esittelee uusia ja parannettuja tapoja hakea dataa, hyödyntäen React Server Components -komponentteja ja `fetch`-API:a sisäänrakennetuilla välimuisti- ja uudelleenvalidointiominaisuuksilla. Tämä johtaa parempaan suorituskykyyn ja virtaviivaistettuun kehityskokemukseen. Sekä palvelin- että asiakaskomponentit voivat hakea dataa, mutta strategia eroaa.

1. Datan haku palvelinkomponenteissa

Palvelinkomponentit, jotka ovat oletusarvo App Directoryssa, voivat hakea dataa suoraan tietokannoista tai API-rajapinnoista. Tämä tehdään komponenttifunktion sisällä ennen renderöintiä. Koska palvelinkomponentit suoritetaan palvelimella, voit turvallisesti sisällyttää salaisia avaimia ja tunnisteita paljastamatta niitä asiakkaalle. `fetch`-API on automaattisesti memoizoitu, mikä tarkoittaa, että identtiset datapyynnöt deduplikoidaan, mikä parantaa suorituskykyä entisestään.

// app/page.js

async function getData() {
  const res = await fetch('https://jsonplaceholder.typicode.com/todos/1');
  // Palautusarvoa *ei* sarjallisteta
  // Voit palauttaa Date, Map, Set, jne.

  if (!res.ok) {
    // Tämä aktivoi lähimmän `error.js`-virherajan
    throw new Error('Datan haku epäonnistui');
  }

  return res.json();
}

export default async function Page() {
  const data = await getData();

  return <div>{data.title}</div>;
}

2. Datan haku asiakaskomponenteissa

Asiakaskomponentit, jotka on merkitty 'use client' -direktiivillä tiedoston yläosassa, suoritetaan käyttäjän selaimessa. Datan haku asiakaskomponenteissa sisältää tyypillisesti `useEffect`-koukun ja kirjaston, kuten `axios` tai `fetch`-API:n, käytön. Server Actions -toiminnot tarjoavat turvallisen tavan muuttaa palvelimen dataa asiakaskomponenteista. Tämä tarjoaa asiakaskomponenteille turvallisen tavan olla vuorovaikutuksessa palvelimen datan kanssa paljastamatta suoraan API-päätepisteitä.

// app/components/ClientComponent.js
'use client';

import { useState, useEffect } from 'react';

export default function ClientComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    async function fetchData() {
      const res = await fetch('https://jsonplaceholder.typicode.com/todos/1');
      const data = await res.json();
      setData(data);
    }

    fetchData();
  }, []);

  if (!data) {
    return <div>Ladataan...</div>;
  }

  return <div>{data.title}</div>;
}

SEO-näkökohdat App Directoryn kanssa

App Directoryn palvelin ensin -lähestymistapa tarjoaa merkittäviä etuja hakukoneoptimoinnille (SEO). Koska sisältö renderöidään palvelimella, hakukonerobotit voivat helposti käyttää ja indeksoida sivun sisällön. Tässä on joitakin keskeisiä SEO-näkökohtia:

App Directoryn reititysjärjestelmän käytön edut

App Directoryn reititysjärjestelmä tarjoaa lukuisia etuja, jotka parantavat kehitysprosessia, sovelluksen suorituskykyä ja edistävät parempaa käyttökokemusta. Tutkitaan näitä etuja tarkemmin:

Käytännön esimerkkejä App Directoryn reitityksestä toiminnassa

Havainnollistaaksemme App Directoryn reititysjärjestelmän tehoa ja joustavuutta, tarkastellaan muutamaa käytännön esimerkkiä:

1. Yksinkertaisen blogin rakentaminen dynaamisilla reiteillä

Kuvitellaan blogisovellus, jossa jokaisella blogikirjoituksella on oma ainutlaatuinen URL-osoite, joka perustuu sen slugiin. App Directoryn avulla tämä voidaan toteuttaa helposti käyttämällä dynaamisia reittejä:

app/
  blog/
    [slug]/
      page.js

`[slug]`-kansio edustaa dynaamista reittisegmenttiä, joka vastaa mitä tahansa URL-osoitetta `/blog/`-polun alla. `page.js`-tiedosto `[slug]`-kansion sisällä renderöi vastaavan blogikirjoituksen sisällön.

// app/blog/[slug]/page.js

export async function generateStaticParams() {
  // Hae kaikki blogikirjoitukset tietokannasta tai API:sta
  const posts = await fetchPosts();

  // Muunna kirjoitukset taulukoksi slug-parametreja
  return posts.map((post) => ({ slug: post.slug }));
}

export default async function BlogPost({ params }) {
  const { slug } = params;

  // Hae blogikirjoitus vastaavalla slugilla
  const post = await fetchPost(slug);

  if (!post) {
    return <div>Kirjoitusta ei löytynyt</div>;
  }

  return (
    <article>
      <h1>{post.title}</h1>
      <p>{post.content}</p>
    </article>
  );
}

Tämä esimerkki osoittaa, kuinka dynaamisia reittejä käytetään yksittäisten sivujen luomiseen jokaiselle blogikirjoitukselle yksinkertaisella ja tehokkaalla tavalla.

2. Modaalidialogin toteuttaminen reittien sieppauksella

Oletetaan, että haluat toteuttaa modaalidialogin, joka ilmestyy, kun käyttäjä napsauttaa linkkiä, ilman että siirrytään pois nykyiseltä sivulta. Tämä voidaan saavuttaa käyttämällä reittien sieppausta:

app/
  (.)photos/
    [id]/
      @modal/
        page.js
  page.js

Tässä `(.)photos/[id]/@modal/page.js` sieppaa pyynnöt, jotka menevät osoitteeseen `photos/[id]` nykyiseltä sivulta. Kun käyttäjä napsauttaa linkkiä tiettyyn kuvaan, modaalidialogi ilmestyy nykyisen sivun päälle sen sijaan, että siirryttäisiin uudelle sivulle.

3. Kojelaudan asettelun luominen rinnakkaisilla reiteillä

Kuvittele, että rakennat kojelautasovellusta, jossa on useita paneeleita, jotka on renderöitävä samanaikaisesti. Rinnakkaisia reittejä voidaan käyttää tämän asettelun saavuttamiseen:

app/
  @analytics/
    page.js       // Analytiikan kojelauta
  @settings/
    page.js       // Asetuspaneeli
  page.js           // Pääkojelauta-asettelu

Tässä rakenteessa `@analytics` ja `@settings` edustavat rinnakkaisia reittejä, jotka renderöidään pääkojelauta-asettelun sisällä. Jokaisella rinnakkaisella reitillä on oma page.js-tiedostonsa, joka määrittelee kyseisen paneelin sisällön. Asettelu voi päättää, mihin nämä sijoitetaan käyttämällä <Slot>-komponenttia.

Siirtyminen Pages Directorysta App Directoryyn

Olemassa olevan Next.js-sovelluksen siirtäminen Pages Directorysta App Directoryyn vaatii huolellista suunnittelua ja toteutusta. Vaikka App Directory tarjoaa merkittäviä etuja, se esittelee myös uusia käsitteitä ja malleja, jotka kehittäjien on ymmärrettävä. Tässä on vaiheittainen opas, joka auttaa sinua siirtymäprosessissa:

  1. Ymmärrä keskeiset erot: Ennen siirtymisen aloittamista varmista, että ymmärrät perusteellisesti Pages Directoryn ja App Directoryn väliset keskeiset erot, mukaan lukien reititysjärjestelmän, datan haun ja komponenttiarkkitehtuurin.
  2. Luo `app`-kansio: Luo uusi `app`-niminen kansio Next.js-projektisi juureen. Tämä kansio sisältää kaikki App Directoryyn kuuluvat komponentit ja reitit.
  3. Siirrä reitit vähitellen: Aloita siirtämällä reittejä asteittain, yksi kerrallaan. Tämä antaa sinun testata ja debugata kutakin reittiä erikseen, minimoiden virheiden syntymisen riskin.
  4. Muunna komponentit palvelinkomponenteiksi: Muunna olemassa olevat React-komponenttisi palvelinkomponenteiksi aina kun mahdollista. Tämä parantaa suorituskykyä ja vähentää selaimessa ladattavan ja suoritettavan JavaScriptin määrää.
  5. Päivitä datan hakulogiikka: Päivitä datan hakulogiikkasi hyödyntämään App Directoryn sisäänrakennettuja datan hakuominaisuuksia. Tämä saattaa edellyttää datan hakukoodin siirtämistä asiakaskomponenteista palvelinkomponentteihin.
  6. Toteuta layoutit ja templaatit: Toteuta layoutit ja templaatit määritelläksesi jaettuja käyttöliittymäelementtejä, jotka ovat yhdenmukaisia useilla sivuilla.
  7. Testaa perusteellisesti: Testaa jokainen siirretty reitti perusteellisesti varmistaaksesi, että se toimii oikein ja että regressioita ei ole.
  8. Poista `pages`-kansio: Kun kaikki reitit on siirretty, voit poistaa `/pages`-kansion.

Yhteenveto

Next.js:n App Directory edustaa merkittävää kehitysaskelta tiedostopohjaisessa reitityksessä, tarjoten kehittäjille järjestelmällisemmän, suorituskykyisemmän ja joustavamman tavan rakentaa moderneja verkkosovelluksia. Ymmärtämällä keskeiset käsitteet ja omaksumalla uudet ominaisuudet kehittäjät voivat hyödyntää App Directorya luodakseen poikkeuksellisia käyttökokemuksia ja saavuttaakseen paremman tuottavuuden. Next.js-kehityksen tulevaisuus on App Directoryssa, ja sen käyttöönotto on strateginen siirto huippuluokan verkkosovellusten rakentamisessa. Se on tehokas työkalu kehittäjille maailmanlaajuisesti.

Kun Next.js-ekosysteemi jatkaa kehittymistään, App Directory on valmis tulemaan standardiksi vankkojen, skaalautuvien ja suorituskykyisten verkkosovellusten rakentamisessa. Omaksu muutos, tutki mahdollisuuksia ja vapauta Next.js:n koko potentiaali!