Blog Techniek

Nuxt 3 EOL, alweer een nieuwe versie!?

Nuxt 3 is sinds 31 juli 2026 end-of-life. Waarom de meeste updates stilletjes gebeuren, wanneer het wél een klus wordt, en in één vraag weten waar jij staat.
Nuxt 3 EOL, alweer een nieuwe versie!?
Jeroen
Jeroen

Front-end / Dev-ops

Leestijd 10 min

“Hij doet het toch gewoon?”

Er komt een mail binnen. Of een regel in een offerte. “We willen je website bijwerken naar een nieuwe versie.”

En je denkt, volkomen terecht: hij doet het toch gewoon? Er is niets kapot. Er belt niemand. Waarom zou ik tijd steken in iets dat prima werkt?

Goede vraag. En even eerlijk: je stelt hem vaker terecht dan niet.

De meeste updates merk je nooit

Aan de meeste sites die wij onderhouden wordt regelmatig gesleuteld. Een onderdeel gaat van 4.2.1 naar 4.2.2. Er is iets sneller geworden. Er is een randgeval opgelost waar jij nooit tegenaan liep. Daar hoor je niets van, want er is niets te horen.

Zo hoort het ook. Je belt de glazenwasser ook niet terug om te vragen hoe het ging. Je ziet alleen dat het raam schoon is.

Ondanks dat we bekendstaan als de techniekclub: als je bureau elke patchversie als nieuwsbericht presenteert, mag je daar iets van vinden.

Behalve als je iets eigens hebt

En dan is er de andere categorie. Een portaal waar je klanten in inloggen. Een webshop met een bestelroute die precies zo werkt als jouw bedrijf werkt. Een koppeling met AFAS of Exact Online die al jaren keurig zijn werk doet.

Vergelijk het met wonen. In een appartement met een VvE gaat het dak vanzelf. Er wordt onderhoud gepleegd, je krijgt een briefje, klaar. Heb je een eigen pand laten bouwen, dan staat daar niemand ongevraagd op je dak. Dat pand is precies zoals jij het wilde, en daarom weet alleen jij, samen met wie het gebouwd heeft, wat er op dat dak ligt.

Zo werkt het met maatwerk ook. Hoe meer er speciaal voor jou gebouwd is, hoe minder er vanzelf meeschuift bij een grote update. Dan is het geen knopje maar een klusje: nalopen, testen, inplannen. Dat is niet erg, het is alleen niet iets dat er even tussendoor gaat.

Wat er op 31 juli gebeurde

En nu net zo’n moment. Niet eentje die stilletjes voorbijgaat.

Een einddatum maakt niets kapot, en dat is het vervelende

Denk aan een telefoon die je een jaar of vijf hebt. Hij doet het nog prima. Bellen, appen, foto’s, allemaal geen probleem. Alleen krijgt hij geen beveiligingsupdates meer, want de fabrikant is ermee gestopt.

Er verandert op die dag helemaal niets. Nou ja, dus wél. Je merkt het alleen pas als er iets wordt gevonden waar geen pleister meer voor komt.

Precies dat is op 31 juli 2026 gebeurd met Nuxt, het framework waar veel moderne websites en webapplicaties op draaien. Nuxt 3 is sinds die datum end-of-life. Geen bugfixes, geen beveiligingsupdates, en er komt niets meer achteraan. De opvolger, Nuxt 4, is er al sinds de zomer van 2025.

Je site blijft gewoon werken en er hetzelfde uitzien, precies zoals die telefoon gewoon blijft bellen. Het verschil zit in wat er gebeurt zodra er straks een nieuw lek wordt gevonden. Vier dagen vóór de einddatum kwamen er nog zeven kwetsbaarheden naar buiten, waaronder eentje waarmee een afgeschermde pagina open kon door één hoofdletter in het webadres te veranderen. Allemaal netjes gerepareerd, want versie 3 werd toen nog onderhouden. De volgende die gevonden wordt, en die komt, krijgt die reparatie niet meer.

Het risico, zonder drama

Niet dat je morgen wordt gehackt. Zo werkt het meestal niet.

Het risico is dat er een gat ontstaat dat je niet meer kunt dichten op het moment dat je het nodig hebt. Ik schreef eerder al hoe je backups écht goed regelt, en dit is dezelfde soort ellende: iedereen weet dat het moet, niemand wil ermee bezig zijn, en als je het nodig hebt is het te laat.

Daar komt tegenwoordig iets bij. Software die geen onderhoud meer krijgt is ook een punt bij audits, bij verzekeraars en bij grotere klanten die je doorlichten voordat ze tekenen. Dat gesprek voer je liever met een antwoord dan met een uitleg.

Hoe weet je waar jij staat?

Eerlijk gezegd: dat zou je helemaal niet hoeven uitzoeken.

Dit hoor je te horen, niet te vragen

Wie jouw site of applicatie beheert, weet op welke versie hij draait en wanneer die verloopt. Dat staat in de agenda, niet in iemands hoofd. Zo’n einddatum is bovendien maanden van tevoren bekend, dus het is geen verrassing die je op de dag zelf even doorbelt.

Drie dingen die er dus uit zichzelf aan hoorden te komen:

  • Op welke versie je draait. Ook als je er nooit naar hebt gevraagd.
  • Wanneer die versie verloopt. Ruim vóór de datum, niet erna.
  • Wat het plan is. Met een inschatting die ergens op gebaseerd is, en niet op een onderbuikgevoel.

Bij ons gaat dat zo, en daarom hebben onze klanten dit stuk eigenlijk niet nodig. Maar draait jouw site ergens anders en is hier nooit iets over gezegd, dan heb je je antwoord eigenlijk al. Dan is één mailtje genoeg: op welke versie draaien we, en tot wanneer wordt die ondersteund? Wie dat binnen een dag beantwoordt, heeft de boel op orde. Wie erover begint te draaien, ook.

Krijg je een reactie vol termen waar je niets mee kunt, dan helpt onze uitleg van twaalf begrippen die je bureau gebruikt en jij niet hoeft te kennen. Staging, deploy en headless staan daar in gewone taal.

Dit is niet de verhuizing van vorige keer

Wie de vorige grote overstap heeft meegemaakt, zit nu waarschijnlijk te rekenen. Terecht, want die was fors. Deze niet.

Van versie 2 naar 3 was geen update maar een verhuizing. Ander huis, andere indeling, en de helft van je meubels paste niet meer. Van 3 naar 4 blijf je in hetzelfde huis en draai je twee kamers om. Je spullen gaan mee, je hoeft niets weg te doen, en na een dag weet iedereen de weg weer. Je functionaliteit verandert niet, je site ziet er hetzelfde uit, en voor jou als eigenaar is het verschil na afloop nul.

Waar het wél tijd kost

Ik ga niet doen alsof het niks is.

Het werk zit bijna nooit in het framework zelf, maar in alles wat eraan vastzit. Een zoekfunctie, een betaalkoppeling, een taalmodule. Eén onderdeel dat nog geen versie voor Nuxt 4 heeft, houdt de hele operatie op. Niet het framework bepaalt de omvang, maar het zwakste aangekoppelde onderdeel. Daarom kan niemand je een betrouwbare planning geven voordat die lijst een keer is nagelopen.

Wij inventariseren dus eerst. Welke modules draai je, van welke bestaat er al een Nuxt 4-versie, en waar zit het onderdeel dat de rest tegenhoudt. Dat is een klein klusje en het bepaalt of dit een middag wordt of een week. Pas daarna zeggen we iets over planning, want anders zitten we te gokken.

Hetzelfde patroon zien we bij vrijwel elk traject: de kosten van een softwareproject zitten zelden in het bouwen, maar in het onderdeel waarvan niemand meer wist dat het er was. Draai je een webshop, reken er dan op dat de hele bestelroute opnieuw wordt getest. Die laatste klik beslist over je omzet en is precies het stuk waar je geen verrassingen wilt.

Kan ik niet gewoon op versie 5 wachten?

Logische gedachte, en toch geen goed idee.

Versie 5 staat geschat voor eind 2026, en geschat betekent hier ook echt geschat. Versie 4 wordt daarna nog minstens een half jaar onderhouden, dus je slaat met wachten niets over.

Wat je met wachten wél doet, is maandenlang op iets zitten dat geen reparaties meer krijgt. Om daarna twee stappen tegelijk te moeten zetten, waarschijnlijk op een moment dat het niet uitkomt.

Hoe wij dit bij Smit aanpakken

Die agenda van hierboven is geen manier van spreken. Voor de projecten die wij onderhouden betekent zo’n einddatum een geplande middag in het najaar, in plaats van een avond waarop iemand ineens iets moet.

We bouwen al jaren in Nuxt, meestal met Directus als contentlaag. Waarom we die combinatie vaak kiezen boven een klassiek CMS, schreven we in Directus als alternatief voor WordPress. Het voordeel op een moment als dit is dat we weten waar de scherpe randen zitten, en dat we niet voor het eerst een Nuxt 3-project naar 4 tillen.

Dat is ook wat wij bedoelen met toekomstbestendig bouwen. Niet dat er nooit iets verandert, want dat gaat je niet lukken. Wel dat je het ziet aankomen en zelf kiest wanneer je het oppakt.

Draait jouw site of applicatie bij ons, dan weten wij dit al, en hoor je het wel als er iets moet. Draait hij ergens anders en heb je er nooit iets over gehoord, dan weet je nu welk mailtje je vanmiddag stuurt.

Hieronder gaan we wat technischer verder, voor developers

Tot hier stond alles wat je als eigenaar moet weten. Vanaf hier wordt het het soort tekst waar je collega’s blij van worden en jij niet. Sla het gerust over, je mist niets.

Voor wie wél verder leest: dit is wat er precies speelt.

Wat er in de laatste ronde nog gerepareerd is

Op 27 juli 2026, vier dagen voor de end-of-life-datum, kwamen zeven kwetsbaarheden tegelijk naar buiten. Ze zijn opgelost in Nuxt 3.21.10 en 4.5.1. Drie ervan, vertaald naar wat ze in de praktijk betekenden:

  • Uitvoeren van eigen code op de server. Onder omstandigheden kon iemand van buiten code laten draaien op jouw omgeving.
  • Route rule authorization bypass. Een routeregel met een hoofdletter erin werd niet herkend door de beveiligingscheck en werd dus overgeslagen. Een afgeschermde pagina ging open door één letter in de URL te veranderen.
  • Cache poisoning. Een bezoeker kon in bepaalde gevallen de opgeslagen pagina van een ándere bezoeker te zien krijgen, inclusief wat daarop stond.

Dat tweede geval is extra leerzaam, want die fix was zelf een herstel van een eerdere fout van dezelfde soort. Geen kritiek op de makers, zo werkt software nu eenmaal. Het is wel de reden dat je in een versie wilt zitten waar nog naar gekeken wordt.

Je versie opvragen

In het project is npx nuxt info genoeg:

- Operating System: `Linux`
- Node Version:     `v22.11.0`
- Nuxt Version:     `3.14.1592`
- CLI Version:      `3.16.0`
- Nitro Version:    `2.10.4`

Staat er bij “Nuxt Version” een 3 vóór de eerste punt, dan weet je het.

De migratie zelf

De kern van 3 naar 4 is een nieuwe mapstructuur. Vrijwel alles wat nu los in de root staat, zoals pages/, components/, composables/, layouts/, middleware/, plugins/, utils/ en app.vue, verhuist naar een nieuwe map app/. De server-code (server/) en public/ blijven staan waar ze stonden.

Nuxt geeft je daar twee hulpmiddelen bij. Eerst een vlag in nuxt.config.ts om alvast op de nieuwe manier te draaien zonder iets te verplaatsen:

export default defineNuxtConfig({
  future: {
    compatibilityVersion: 4,
  },
})

En daarna het commando dat het verplaatsen doet:

npx codemod@latest nuxt/4/file-structure

Waar het in de praktijk alsnog op vastloopt

De mapstructuur verplaatst zichzelf keurig. Wat niet vanzelf meegaat:

  • Modules zonder Nuxt 4-release. Eén achterblijver blokkeert de hele upgrade, dus die lijst loop je als eerste na en niet als laatste.
  • Eigen modules en lokale layers. Alles wat zelf paden aanneemt, of met srcDir en aliassen werkt, moet je met de hand nalopen.
  • Alles wat buiten de codemod leeft. Een betaalkoppeling die diep in een eigen package zit, verhuist niet mee omdat de codemod hem niet ziet.

Loop je ergens tegenaan, of wil je weten of jouw modulelijst een middag of een week is? Dan is een berichtje sneller dan een avond uitzoeken.

AI hielp deels bij het schrijven. Gereedschap verandert, vakmanschap niet.