Kennisbank · Webdevelopment
Wat is Node.js?

Node.js laat JavaScript draaien buiten de browser, op een server. Het is geen programmeertaal en geen framework, maar een omgeving waarin je JavaScript-code kunt uitvoeren op een machine die geen browser is.
Ryan Dahl liet het in november 2009 voor het eerst zien op een conferentie in Berlijn. Daarvoor was JavaScript alleen een browsertaal. Sindsdien kun je de voorkant en de achterkant van een applicatie in dezelfde taal schrijven, en dat is de belangrijkste reden dat het zo hard is gegaan.
Waar Node vandaan komt
Dahl had een probleem met de manier waarop servers destijds met wachten omgingen. Een webserver startte voor elke bezoeker een aparte draad die vervolgens niets deed terwijl hij op de database wachtte. Bij duizenden gelijktijdige verbindingen liep dat vast op geheugen.
Zijn oplossing was een server die nooit wacht. Node draait op de V8-motor van Chrome, dezelfde die JavaScript in je browser uitvoert, met daaromheen een laag die bestanden, netwerkverkeer en tijdklokken afhandelt.
Het beheer ging niet vanzelf. In 2014 splitste een deel van de ontwikkelaars zich af omdat het bedrijf dat Node in beheer had te traag nieuwe versies uitbracht. Die afsplitsing heette io.js en werd in 2015 weer samengevoegd, waarna het beheer bij een stichting kwam te liggen. Sinds 2019 valt het onder de OpenJS Foundation.
Dat klinkt als bestuurlijke ruis en het is precies wat je bij open source wilt zien. Toen één partij te veel macht kreeg, was er een uitweg. Bij software waar je bedrijf op draait is die uitweg meer waard dan welke functie ook.
Hoe de gebeurtenislus werkt
Node doet één ding tegelijk en wacht nooit. Dat klinkt tegenstrijdig en het is de kern van hoe het werkt.
Komt er een verzoek binnen dat gegevens uit de database nodig heeft, dan zet Node die opdracht uit en gaat verder met het volgende verzoek. Zodra het antwoord binnenkomt, wordt het bijbehorende stukje code alsnog uitgevoerd. Die eeuwige rondgang van opgeven en oppakken heet de gebeurtenislus.
Het werk dat echt tijd kost, zoals wachten op een schijf of op een andere server, gebeurt buiten die lus in een aparte laag. Jouw code komt pas weer aan de beurt als er iets af is.
Vergelijk het met een ober. Een ober die bij elke tafel blijft staan tot het eten uit de keuken komt, bedient een handvol tafels. Een ober die de bestelling doorgeeft en ondertussen verder loopt, bedient de hele zaal. Node is de tweede ober, en daarom kan één proces een groot aantal verbindingen aan zonder dat het geheugen volloopt.
Wat er misgaat als je de lus blokkeert
Precies daar zit ook de zwakke plek. Er is één lus, dus zodra jouw code lang bezig blijft, staat alles stil. Niet dat ene verzoek, maar alle verzoeken.
Je merkt dat aan een site die af en toe seconden bevriest zonder dat er een fout in de logboeken staat. De boosdoener is meestal een lus over duizenden records, een grote afbeelding die wordt verkleind of een JSON-bestand van tientallen megabytes dat in één keer wordt ingelezen.
Het tweede symptoom is een proces dat langzaam volloopt. Een Node-proces blijft weken achtereen staan, dus een lek in het geheugen stapelt zich op in plaats van bij elk verzoek te verdwijnen. Een applicatie die na drie dagen traag wordt en na een herstart weer vliegt, heeft dat probleem.
Het derde is de crash. Gaat er ergens iets mis dat niet wordt opgevangen, dan stopt het hele proces en zijn alle bezoekers tegelijk hun verbinding kwijt. Sinds Node 15 is dat het standaardgedrag bij een niet-opgevangen fout in asynchrone code, wat harder klinkt dan het is: doordraaien met een onbekende toestand is gevaarlijker.
Waar Node goed in is
- Veel verbindingen die openblijven. Chat, live meldingen, een dashboard dat zichzelf bijwerkt, een bord waarop meerdere mensen tegelijk werken.
- Koppelingen tussen systemen. Verzoeken doorzetten, gegevens vertalen, webhooks van een betaaldienst afhandelen. Node zit vooral te wachten en dat is waar het sterk in is.
- Een laag tussen je database en je schermen. Verreweg het meest voorkomende gebruik, en het onderwerp van API-ontwikkeling.
- Gereedschap. Ook als je Node niet als server gebruikt, kom je het tegen. Vrijwel elk modern gereedschap voor de voorkant draait erop.
Dat laatste punt verrast mensen het meest. Bouw je een WordPress-thema met een moderne opzet, dan staat er Node op je laptop, ook al draait je site zelf gewoon op PHP.
Waar het minder geschikt voor is
Zwaar rekenwerk hoort niet in een Node-proces. Beeldbewerking, video omzetten, grote bestanden verwerken of ingewikkelde analyses blokkeren de lus voor iedereen.
Je kunt dat opvangen. Node heeft losse werkdraden voor rekenwerk, je kunt meerdere processen naast elkaar zetten die het verkeer verdelen, en je kunt zwaar werk in een wachtrij zetten die een ander programma leegwerkt. Je bouwt er dan wel iets omheen voor werk waar andere talen standaard beter in zijn.
En een gewone website hoort er ook niet in. Dat is geen technisch oordeel maar een praktisch oordeel, en ik kom er verderop op terug.
Node naast PHP
Deze vergelijking komt bij elk gesprek terug, dus de eerlijke versie.
PHP is gemaakt voor webpagina's. Elk verzoek staat op zichzelf: de code start, bouwt een pagina, stuurt hem op en verdwijnt. Dat maakt het eenvoudig en vergevingsgezind, want een geheugenlek van één verzoek is drie honderdsten later weg.
Node is sterker zodra verbindingen openblijven of zodra je veel korte verzoeken naar andere diensten doet. Het is ook strenger, omdat je zelf verantwoordelijk bent voor een proces dat maanden moet blijven staan.
Het praktische verschil zit in de hosting. Nederlandse gedeelde hosting is ingericht op PHP en een database, en dat is de goedkoopste vorm die er is. Een Node-toepassing heeft een eigen server of container nodig, plus iemand die hem in de gaten houdt.
Mijn vuistregel: voor een website PHP, voor een applicatie met veel live interactie Node, en voor een koppeling tussen systemen wat je team het beste kent. Dat laatste weegt zwaarder dan alle technische argumenten samen.
npm en de afhankelijkheden
Bij Node hoort npm, het systeem waarmee je code van anderen binnenhaalt. Het is met afstand de grootste verzameling pakketten die er bestaat, en het is de kant van Node waar de meeste ellende vandaan komt.
Je noteert wat je nodig hebt in een bestand, en npm haalt dat op plus alles waar die pakketten zelf van afhangen. Eén klein pakket sleept er zo tientallen mee. Elk daarvan is code van een vreemde die met dezelfde rechten draait als de jouwe.
Wat er in het echt is misgegaan
In maart 2016 haalde een ontwikkelaar zijn pakketten uit npm na een ruzie over een naam. Een daarvan heette left-pad en bestond uit elf regels die tekst aanvullen tot een vaste lengte. Bouwstraten over de hele wereld vielen om, waaronder die van grote bedrijven, omdat dat ene minipakket ergens diep in hun lijst zat.
In november 2018 was het ernstiger. De maker van een populair pakket had het beheer overgedragen aan iemand die zich vrijwillig aanbood. Die voegde code toe die sleutels van een bepaalde bitcoinportemonnee wegsluisde. Het pakket zat als afhankelijkheid diep in andere projecten en het duurde maanden voordat iemand het opmerkte.
Sindsdien zijn er meer gevallen geweest waarin een account werd overgenomen of een naam werd nagebouwd met één letter verschil. Het patroon is telkens hetzelfde: niet het pakket dat je koos gaat mis, maar het pakket waar dat pakket van afhangt.
Wat je ertegen doet
Houd het aantal afhankelijkheden laag. Een functie van tien regels die je zelf schrijft is beter dan een pakket dat je moet blijven volgen.
Zet het vergrendelingsbestand in je versiebeheer en installeer op de server met de opdracht die exact die versies plaatst en niets bijwerkt. Anders krijgt je server andere code dan je laptop, en dat is precies het moment waarop het misgaat.
En draai regelmatig de ingebouwde controle op bekende lekken. Dat kost een minuut en het geeft je een lijst met wat er open staat. Datzelfde geldt overigens voor plugins in WordPress, waarover meer staat bij het beveiligen van een WordPress-website.
Express en de andere raamwerken
Node zelf kan een webserver zijn, en niemand doet dat zonder hulp. Je zou zelf adressen moeten uitlezen, formuliergegevens moeten ontleden en foutafhandeling moeten bouwen.
Express is daar al meer dan tien jaar het antwoord op en nog altijd het meest gebruikt. Het is bewust klein: routes, tussenlagen en verder niets. Het stond jaren vrijwel stil en kreeg in 2024 weer een grote versie.
Daarnaast zijn er alternatieven met een duidelijke eigen keuze. Fastify mikt op snelheid en op strenge controle van binnenkomende en uitgaande gegevens. NestJS legt een vaste projectindeling op en is daardoor populair bij grotere teams die uit Java of C# komen.
Voor een eerste project zou ik met Express beginnen. Niet omdat het het beste is, maar omdat vrijwel elk voorbeeld dat je online vindt ervan uitgaat.
Wat er in Node zelf bij is gekomen
Node was jarenlang kaal en leunde voor alles op pakketten. Dat is de laatste jaren omgedraaid, en het scheelt je afhankelijkheden.
Sinds versie 18 zit de moderne manier om andere diensten aan te roepen ingebouwd, dezelfde die je in de browser gebruikt. Daarvoor haalde vrijwel iedereen daar een pakket voor binnen.
Er zit nu ook een testkader in, een ingebouwde manier om je code opnieuw te starten zodra je een bestand opslaat, en het inlezen van een instellingenbestand met wachtwoorden en sleutels. Verder is er een rechtenmodel in aanbouw waarmee je een proces kunt verbieden bij bestanden of het netwerk te komen.
Kijk dus bij een tutorial die een pakket aanraadt eerst of Node het inmiddels zelf kan. Dat is één afhankelijkheid minder om bij te houden.
Twee soorten modules, en waarom voorbeelden niet werken
Node kent twee manieren om code uit een ander bestand te halen, en daar struikelt vrijwel elke beginner overheen.
De oude manier komt uit Node zelf en gebruikt het woord require. De nieuwe manier is die van de taal JavaScript zelf en gebruikt import. Ze zien er anders uit en ze werken anders: de nieuwe manier wordt vooraf uitgelezen, de oude tijdens het draaien.
Het gevolg merk je als een voorbeeld van internet een foutmelding geeft over een onverwacht symbool of over een module die niet gevonden kan worden. Meestal klopt dan alleen de soort niet. Je stelt per project in welke van de twee je gebruikt, en je kunt ze in beperkte mate mengen.
Deze splitsing sleept al jaren. Het gaat langzaam de goede kant op, en tot die tijd kost het iedereen af en toe een halfuur.
Versies en ondersteuning
Node brengt elk half jaar een nieuwe hoofdversie uit, in april en in oktober. Alleen de even nummers krijgen langdurige ondersteuning, en die loopt in totaal dertig maanden.
Dat betekent in de praktijk dat je ongeveer elke twee jaar moet bijwerken. Node 18 kreeg in april 2025 zijn laatste update, en Node 24 nam in oktober 2025 de rol van aanbevolen versie over.
Draai in productie altijd een even versie die nog ondersteund wordt. Een oneven versie is bedoeld om nieuwe dingen uit te proberen en verdwijnt binnen een half jaar. Ik heb meer dan eens een server gezien die op een versie stond waar al twee jaar geen beveiligingsfix meer voor uitkwam, simpelweg omdat niemand ernaar keek.
Waar je een Node-toepassing draait
Hier zit voor Nederlandse ondernemers de grootste verrassing. Gewone webhosting is ingericht op PHP en MySQL, en daar kun je een Node-toepassing niet zomaar neerzetten.
Je hebt een eigen server nodig, een containeromgeving of een platform dat het draaien voor je regelt. Daarbij moet je zelf regelen wat bij PHP-hosting al is ingericht.
Je hebt een procesbewaker nodig die je applicatie opnieuw start als hij omvalt en die hem na een herstart van de server weer aanzet. Daarvoor zet je meestal een webserver die het beveiligingscertificaat afhandelt en het verkeer doorgeeft. En je hebt een plek nodig waar je logregels terechtkomen, want zonder logboek zoek je in het donker.
Let bij de keuze op waar de server staat. Verwerk je persoonsgegevens van Nederlandse klanten, dan is een server binnen de Europese Unie de eenvoudigste route en heb je met je hostingpartij een verwerkersovereenkomst nodig. Dat geldt ook voor de plek waar je logboeken en foutmeldingen belanden, want daar staan vaak IP-adressen en e-mailadressen in.
Node bij een WordPress-site
Voor het draaien van een WordPress-site heb je Node niet nodig. WordPress is PHP en een database, en daar verandert niets aan.
Je komt Node wel tegen zodra je een thema of plugin bouwt. De blokkeneditor is in JavaScript geschreven, en het officiële gereedschap om blokken te maken draait op Node. Ook het samenvoegen en verkleinen van stijlbestanden gebeurt er meestal mee.
Dat gebeurt alleen op de machine van de bouwer. Wat er op de server terechtkomt zijn kant-en-klare bestanden. Vraag je hostingpartij dus niet om Node omdat je thema het gebruikt, want daar heeft de server niets mee te maken.
Waar het wel speelt: laat een bouwer nooit een project achter waarvan de bouwstap alleen op zijn eigen laptop draait. Zet de instructies en de versies erbij, anders kan de volgende partij geen komma wijzigen zonder eerst een dag te puzzelen.
Wat een klein bedrijf hieraan heeft
Voor een bedrijfssite, een blog of een gewone webshop heeft Node geen toegevoegde waarde. Een contentmanagementsysteem is daar praktischer, want je wilt zelf je teksten kunnen aanpassen zonder een ontwikkelaar te bellen.
Het wordt interessant zodra je iets nodig hebt dat geen website is. Een klantportaal, een planningsscherm, een koppeling tussen je boekhouding en je webshop, een dienst die bestellingen bij een leverancier wegzet.
Reken dan op een andere kostenstructuur dan bij een website. Naast de bouw komt er een server bij die maandelijks geld kost, updates twee keer per jaar en iemand die reageert als het ding omvalt. Dat is bij een back-end op maat de post die het vaakst wordt vergeten.
Vraag bij een offerte wie de code in beheer heeft en of een andere partij het kan overnemen. Een applicatie waarvan alleen de bouwer de sleutels heeft is een risico dat je pas voelt als je uit elkaar gaat.
Als je het wilt leren
Leer eerst JavaScript zelf, en dan vooral hoe asynchrone code werkt. Zonder dat begrip loop je in Node meteen vast, want alles draait om code die later terugkomt.
Bouw daarna met Express een kleine dienst die gegevens uit een database ophaalt en teruggeeft. Daarmee snap je waar Node goed voor is en waar het je in de weg zit.
Er zijn inmiddels twee andere omgevingen die hetzelfde doen. Ryan Dahl begon in 2018 opnieuw met Deno om zijn eigen ontwerpfouten te herstellen, en Bun bereikte in 2023 versie 1 met snelheid als voornaamste inzet. Allebei kunnen ze een groot deel van de Node-code gewoon draaien. Voor een project dat morgen af moet zou ik nog steeds Node kiezen, omdat elke hostingpartij en elke handleiding ermee overweg kan.
Veelgestelde vragen over Node.js
Is Node.js een programmeertaal?
Nee. Node.js is een omgeving waarin JavaScript-code draait buiten de browser. De taal die je schrijft is JavaScript. Node voegt daar de mogelijkheden aan toe die een browser niet geeft, zoals bestanden lezen en netwerkverbindingen openen.
Is Node.js gratis?
Ja. Node is open source onder de MIT-licentie en valt onder de OpenJS Foundation. Je betaalt alleen voor de server waarop het draait.
Waarom is Node.js snel?
Niet omdat het rekenwerk sneller is, want dat is het niet. Het is snel bij taken waarbij vooral gewacht wordt: op een database, op een externe dienst, op een schijf. Node zet zulk werk uit en gaat ondertussen door met andere verzoeken, waardoor één proces veel verbindingen tegelijk aankan.
Kan Node.js meerdere processorkernen gebruiken?
Ja, maar niet vanzelf. Je start dan meerdere processen die samen het verkeer verdelen, of je gebruikt werkdraden voor rekenwerk. Standaard gebruikt één Node-proces één kern.
Wat is npm precies?
Npm is het pakketbeheer van Node. Je zet in een bestand welke bibliotheken je nodig hebt, en npm haalt die op plus alles waar ze zelf van afhangen. De opdracht npm zelf zit standaard bij Node.
Wat is het verschil tussen npm install en npm ci?
Bij install mag npm binnen de opgegeven marges nieuwere versies pakken en het vergrendelingsbestand bijwerken. Bij ci wordt precies geïnstalleerd wat in dat vergrendelingsbestand staat, zonder afwijkingen. Gebruik op je server altijd de tweede, dan draait daar exact wat je hebt getest.
Kan ik Node.js op gewone webhosting draaien?
Meestal niet. Nederlandse gedeelde hosting is gebouwd voor PHP en MySQL. Je hebt een eigen server nodig, een containeromgeving of een platform dat het draaien regelt. Reken op hogere maandkosten dan bij een WordPress-site.
Vervangt Node.js PHP?
Nee. Ze zijn goed in verschillende dingen. PHP is gemaakt voor pagina's die per verzoek worden opgebouwd, Node voor verbindingen die openblijven en voor koppelingen tussen diensten. Veel bedrijven draaien allebei naast elkaar.
Heb ik Node.js nodig voor mijn WordPress-website?
Voor het draaien niet. WordPress heeft PHP en een database nodig. Node kom je alleen tegen aan de bouwkant, bijvoorbeeld bij het maken van blokken voor de editor of het samenvoegen van stijlbestanden. Dat gebeurt op de laptop van de bouwer en niet op je server.
Hoe veilig is Node.js?
Node zelf krijgt regelmatig beveiligingsupdates en heeft een geen-nieuws-is-goed-nieuws staat van dienst. Het risico zit in de pakketten die je erbij haalt. Houd het aantal laag, werk met vaste versies en draai de ingebouwde controle op bekende lekken.
Wat is het verschil tussen Node.js en Express?
Node is de omgeving, Express is een bibliotheek die je erbovenop zet om webverkeer af te handelen. Zonder Express kun je ook een server bouwen, maar dan schrijf je zelf de afhandeling van adressen, formuliergegevens en fouten.
Wat zijn Deno en Bun?
Twee jongere omgevingen die hetzelfde doel hebben. Deno komt van de maker van Node en pakt zaken als rechten en TypeScript vanaf de basis anders aan. Bun mikt vooral op snelheid en levert gereedschap mee dat je bij Node los installeert. Node blijft voorlopig de veiligste keuze vanwege het aanbod aan mensen en voorbeelden.
Welke Node-versie moet ik kiezen?
Een even versienummer dat nog ondersteuning krijgt. Even versies krijgen dertig maanden onderhoud, oneven versies verdwijnen binnen een half jaar. Werk je aan iets dat in productie draait, kijk dan bij elke jaarwisseling of jouw versie nog wordt bijgewerkt.
Waarom crasht mijn hele applicatie door één fout?
Omdat alle verzoeken door hetzelfde proces gaan. Bij PHP staat elk verzoek los, bij Node niet. Een fout die nergens wordt opgevangen legt daarom iedereen tegelijk plat. Vang fouten af op de plek waar ze kunnen ontstaan en zorg dat een procesbewaker de applicatie meteen opnieuw start.
Dit artikel hoort bij Webdevelopment. Daar vind je meer uitleg over hetzelfde onderwerp.
