Insights
Next.js 13
- 0 minuten leestijd

Insights
- 0 minuten leestijd
Het is zover, Next.js 13 is sinds 25 oktober 2022 uitgebracht. Exact zes jaar later dan de eerste Next.js release. Waarom zou je Next.js willen gebruiken en wat zijn de nieuwe functionaliteiten in Next.js 13? In deze blogpost bespreken we wat de verschillen zijn tussen Server-Side en Client-Side Rendering. Vervolgens onderzoeken we hoe je een applicatie structureert, wat server componenten zijn, streamen van UI en enkele verbeteringen. Als laatste bekijken we wat Next.js 13 voor de toekomst te bieden heeft.
Even terug naar de basis. Elke frontend ontwikkelaar heeft al eens iets gehoord over React. Een Javascript library om gemakkelijk en efficiënt user interfaces te bouwen. Het is uiteindelijk nog steeds de meest gebruikte frontend tool volgens de 2021 “State of JS” ranglijst.
React heeft echter wel enkele tekortkomingen. Het maakt onder andere gebruik van Client-Side Rendering (CSR). Dit betekent dat de inhoud van je pagina in de browser wordt opgebouwd. Ook moet je bijvoorbeeld een bijkomende library toevoegen voor routing functionaliteit. Next.js is bovenop React gebouwd om onder andere deze gebreken op te lossen. Je hoeft je geen zorgen te maken over routing en het maakt gebruik van Server-Side Rendering (SSR). De inhoud van je pagina wordt op de server opgebouwd en je browser krijgt meteen de volledige HTML pagina.

Een persoon (client) wil een pizza maken (pagina). Bij Client-Side Rendering worden ‘ingrediënten’ geleverd aan huis (browser) om verschillende pizza’s te kunnen maken. De persoon gaat vervolgens de gewenste pizza zelf maken. Heeft de persoon grote honger? Geen probleem, alle soorten ingrediënten zijn geleverd, een nieuwe pizza maken is snel!
Bij Server-Side Rendering besteld de persoon een specifieke pizza bij een restaurant (server). Het restaurant maakt deze klaar levert die aan huis (browser). De persoon hoeft zelf verder niets te doen!
Misschien kan je al enkele voor-en nadelen bedenken bij bovenstaand scenario.
Voordelen Client-Side Rendering
Nadelen Client-Side Rendering
Voordelen Server-Side Rendering
Nadelen Server-Side Rendering
/app directoryDe manier waarop je uw Next.js applicatie structureert is volledig aangepast. In voorgaande versies zet je al uw pagina’s onder de /pages folder. De homepagina zit dus onder /pages/index.jsx en de user pagina onder /pages/user.jsx.
Nu is het een op mappen gebaseerde hiërarchie. Je gebruikt mappen om routes te definiëren, en speciale bestanden met gereserveerde namen - layout.jsx, page.jsx, en loading.jsx - om UI te definiëren, waarbij page.jsx het minimaal vereiste is.
De homepagina valt dus onder /app/page.jsx en de user pagina onder /app/user/page.jsx. Alles wat je onder /app zet gebruikt standaard de nieuwe functionaliteiten van Next.js 13. Server componenten, complexe layout structuren, streamen van UI elementen en nog veel meer.
Het is ook mogelijk om alle relevante bestanden voor het opbouwen van de user pagina onder één map te steken. Denk aan stylesheets, storybook bestanden, unit tests, enzovoorts.
Let op, alle componenten zijn standaard server-side componenten. Wil je toch nog gebruik maken van Client-side componenten, dan moet je bovenaan je file ’use client’; importeren.
‘use client’;
Import { useState } from ‘react’
Export default function Component() {
return (<div>…</div>)
}Er zijn enkele zaken waarmee je rekening moet houden als je server-side componenten gebruikt. Je zal geen hooks kunnen gebruiken zoals useEffect en useState. Ook eventlisteners zoals onClick of Browser API’s kan je niet gebruiken.
Maar als voordeel betekent dit dat je data fetching en backend gerelateerde data in je server-componenten kan plaatsvinden. Minder JS voor de client!
Voorbeeld: Een <Container> van ToDo’s als server component waar je alle nodige data ophaalt. Een <Card> client component die alle individuele ToDo’s kan renderen.
Wanneer moet je een server of client component gebruiken?
Server component:
Client component:
useState, custom hooks, even listeners, Browser API voor toegang tot je clipboard, enzovoorts.Wat bedoelt men met streamen? Je kan incrementeel UI elementen versturen vanuit de server naar de client om progressief de componenten op je pagina te laden. Je pagina wordt op deze manier niet meer belemmerd door data dat lang duurt om op te halen. Dit zorgt voor een betere gebruikerservaring.
Dit kan je nu met Next.js 13 doen op twee manieren. Enerzijds door een loading.jsx bestand aan te maken onder je /app directory. Hier kan je een soort van laadanimatie renderen zoals een spinner of skeleton.
Voorbeeld:
Export default function Loading() {
Return <Spinner />
}Zodra de data van die loading.jsx voltooid is wordt het automatisch gewisseld met de inhoud van page.jsx
Anderzijds kan je uw JSX component dat data nodig heeft wrappen met Suspense. Terwijl de data aan het laden is wordt de fallback prop van de Suspense getoond.
Voorbeeld:
Import { Suspense } from ‘react’;
Import { UserData, UserPosts } from ‘./Components’;
Export default function User() {
Return (
<section>
<Suspense fallback = { <p>Loading user…</p> }>
<UserData />
</Suspense>
<Suspense fallback = { <p>Loading posts…</p> }>
<UserPosts />
</Suspense>
</section>
)
}Streamen met layout.jsx of Suspense is een grote stap in de juiste richting op gebied van UI/UX. Je haalt er grote voordelen uit zoals:
size-adjust CSS eigenschap.Met dit nieuwe lettertypesysteem kunt u gemakkelijk alle Google Fonts gebruiken met het oog op prestaties en privacy. CSS- en lettertypebestanden worden gedownload tijdens het bouwen en zelf gehost met de rest van uw statische activa. De browser stuurt geen verzoeken naar Google.
De nieuwe Next.js <Image> component, met betere on-the-fly beeldoptimalisatie, betere accesibility omdat alt tags nu standaard vereist zijn, minder client-side JavaScript, eenvoudigere en meer intuïtieve styling/configuratie, en native lazy-loading voor je afbeeldingen zonder hydration nodig te hebben.
Turbopack, een nieuwe, Rust-based opvolger van Webpack.
In Next.js 12 begon de overgang naar native Rust-aangedreven tooling. De migratie van Babel resulteerde in 17x snellere transpilatie. Daarna werd Terser vervangen, wat resulteerde in 6x snellere minificatie.
Volgens het team van Next.js is Turbopack:
Cold start benchmark met 1000 React componenten:

File change (HMR) benchmark met 1000 React componenten:

💡 Wist je dat de oprichter van Webpack (Tobias Koppers) nu aan Turbopack werkt?

Het is belangrijk op te merken dat de meeste van deze voordelen te danken zijn aan Turbo's caching op afstand - wat betekent dat u enorme prestatieverbeteringen zult zien in gebruikssituaties waar het optimaliseren van caching zou helpen, d.w.z. grote projecten met honderden modules, maar minder in uw basis ToDo-apps.
❗ Let op, tijdens het schrijven van deze blogpost is Turbopack nog in Alpha. Gebruik het dus nog niet voor productie omgevingen (tenzij je graag leeft op het randje).
De minimale versie van React is verhoogd van 17.0.2 naar 18.2.0
De minimale Node.js versie is verhoogd van 12.22.0 naar 14.6.0
De import `next/image` is hernoemd naar `next/legacy/image`. De import `next/future/image` is hernoemd naar `next/image`.
Er zijn heel wat baanbrekende veranderingen. De manier hoe je pagina’s samenstelt is anders. Een groot projecten migreren zal niet zo evident zijn.
Heel wat zaken zijn nog in Beta en gebruiken bleeding-edge functionaliteiten van React 18 die zelf nog niet stabiel zijn. Deze release is eerder een voorproefje van wat de toekomst te bieden heeft. Speel eens met de nieuwe functionaliteiten op je lokale omgeving en kijk wat er mogelijk is. Nu al in productie gebruiken is zeer riskant en zou ik afraden. Ik verwacht dat in Next.js 14 alles uitgestreken zal worden. De toekomst ziet er spannend uit!
Ben jij gepassioneerd door frontend ontwikkeling en zou je graag uitgroeien tot een expert in je vak? Wil jij jezelf verder ontwikkelen in een gedreven team met focus op kwaliteit en innovatie? Wij geven jou die vrijheid. Enkele dagen in de maand krijg je van ons de tijd om je kennis te verbeteren en te delen met je collega’s.
Wij zorgen voor gepast advies op het vlak van frontend development.