JavaScript is een van de meest populaire programmeertalen ter wereld. Het zorgt voor de aandrijving van miljoenen websites vandaag de dag en talloze developers en designers gebruiken het om webfunctionaliteiten mogelijk te maken. Als je een beginnende programmeur bent, dan is JavaScript een van de beste programmeertalen om onder de knie te krijgen.
De eerste 20 jaar werd JavaScript voornamelijk gebruikt voor client-side scripting. Omdat JavaScript alleen kan worden gebruikt binnen het <script>
tag, moesten developers werken in meerdere talen en frameworks binnen de front-end en back-end componenten. Laten kwam Node.js, een runtime-omgeving die alles bevat wat nodig is om een programma uit te voeren dat in JavaScript is geschreven.
Node.js is een single-threaded, open source, platformonafhankelijke runtime-omgeving voor het bouwen van snelle en schaalbare serverside- en netwerktoepassingen. Het draait op de V8 JavaScript runtime engine en maakt gebruik van event-driven, niet-blokkerende I/O architectuur, wat het een efficiënte omgeving maakt voor real-time toepassingen.
Waar is Node.js in geschreven?
Node.js is geschreven in C, C++ en JavaScript.
Wikipedia definieert Node.js als “een pakketcompilatie van de V8 JavaScript engine van Google, de abstraction layer van het libuv platform en een core bibliotheek, die zelf voornamelijk in JavaScript is geschreven.”
De runtime maakt intern gebruik van Chrome V8, de JavaScript uitvoeringsengine en is ook geschreven in C++. Dit voegt extra use-cases toe aan het repertoire van Node.js, zoals toegang tot interne systeemfunctionaliteit (zoals netwerken).
Architectuur Node.js en hoe het werkt
Node.js gebruikt de “Single Threaded Event Loop” architectuur om meerdere clients tegelijk af te handelen. Om te snappen hoe dit verschilt van andere runtimes, moeten we begrijpen hoe gelijktijdige clients met meerdere threads worden verwerkt in talen zoals Java.
In een multi-threaded request-response model versturen meerdere clients een verzoek (request) en verwerkt de server elk verzoek voordat het antwoord (response) wordt teruggestuurd. Er worden echter meerdere threads gebruikt om gelijktijdige calls te verwerken. Deze threads worden gedefinieerd in een threadpool en elke keer dat een verzoek binnenkomt, wordt een individuele thread toegewezen om deze af te handelen.
Node.js werkt iets anders. Laten we eens kijken naar elke stap die het doorloopt:
- Node.js onderhoudt een beperkte threadpool om verzoeken af te handelen.
- Telkens wanneer een verzoek binnenkomt, plaatst Node.js het in een wachtrij.
- Nu komt de single-threaded “Event-loop” – de kerncomponent – in beeld. Deze event loop wacht voor onbepaalde tijd op verzoeken.
- Wanneer een verzoek binnenkomt, pikt de loop het op uit de wachtrij en controleert het of het een blokkerende input/output (I/O) operatie vereist. Als dit niet het geval is, wordt het verzoek verwerkt en een antwoord teruggestuurd.
- Als het verzoek een blokkerende operatie moet uitvoeren, wijst de event loop een thread uit de interne threadpool toe om het verzoek te verwerken. Er zijn beperkte interne threads beschikbaar. Deze groep met ondersteunende threads wordt de “worker group” genoemd.
- De event loop volgt de blokkerende verzoeken en plaatst ze in de wachtrij zodra de blokkeertaak is verwerkt. Dit is hoe het zijn niet-blokkerende aard behoudt.
Omdat Node.js minder threads gebruikt, verbruikt het minder bronnen/geheugen, wat resulteert in een snellere taakuitvoering. Dus voor onze doeleinden is deze single-thread architectuur gelijk aan architectuur met meerdere threads. Wanneer je gegevensintensieve taken moet verwerken, is het veel logischer om multi-threaded talen gebruiken als Java. Maar voor realtime applicaties is Node.js de voor de hand liggende keuze.
Features van Node.js
Node.js is de afgelopen jaren snel gegroeid. Dit is te danken aan de uitgebreide lijst met functies die het biedt:
- Makkelijk – Het is vrij eenvoudig om met Node.js te beginnen. Het is een goede keuze voor beginners op het gebied van webontwikkeling. Met veel tutorials en een grote community is het heel eenvoudig om aan de slag te gaan.
- Schaalbaar – Het biedt enorme schaalbaarheid voor applicaties. Omdat Node.js single-threaded is, kan het een groot aantal gelijktijdige verbindingen verwerken met hoge doorvoer .
- Snelheid – Niet-blokkerende thread-uitvoering maakt Node.js nog sneller en efficiënter.
- Pakketten – Er is een groot aantal open source Node.js packages beschikbaar die je werk kunnen vereenvoudigen. Er zijn momenteel meer dan een miljoen pakketten in het NPM ecosysteem.
- Sterke back-end – Node.js is geschreven in C en C++, wat het snel maakt en functies toevoegt als netwerkondersteuning.
- Multi-platform – Doordat het meerdere platforms ondersteunt kan je eenvoudig SaaS websites, desktop apps en zelfs mobiele apps maken, allemaal met Node.js.
- Makkelijk te onderhouden – Node.js is een makkelijke keuze voor developers, aangezien zowel de front-end als de back-end met een taal kunnen worden beheerd, JavaScript.
Marktomvang
Het aantal websites is de afgelopen twee decennia enorm gegroeid, en zoals verwacht groeit Node.js ook net zo snel mee. De populaire runtime overschreed het aantal downloads van maar liefst 1 miljard al in 2018, en volgens W3Techs wordt Node.js door 1,2% van alle websites wereldwijd gebruikt. Dat zijn in totaal meer dan 20 miljoen sites verspreid over het hele internet.
Het komt dan ook niet als verrassing dat miljoenen bedrijven ervoor kiezen. Hier zijn een paar populaire die Node.js momenteel gebruiken:
- Spotify
- eBay
- Godaddy
Toepassingen van Node.js
Node.js wordt gebruikt voor een breed scala aan toepassingen. Laten we een paar populaire gebruiksscenario’s bekijken waarin Node.js een goede keuze is:
- Real-time chats – Vanwege de asynchrone single-threaded aard is Node.js zeer geschikt voor het verwerken van realtime communicatie. Het kan gemakkelijk worden geschaald en wordt vaak gebruikt bij het bouwen van chatbots. Node.js maakt het ook eenvoudig om extra chatfuncties te bouwen, zoals chatten met meerdere personen en pushmeldingen.
- Internet of Things – IoT toepassingen bestaan meestal uit meerdere sensoren, omdat ze vaak kleine stukjes data verzenden die samen voor een groot aantal verzoeken kunnen zorgen. Node.js is een goede keuze, omdat het gelijktijdig veel verzoeken snel kan afhandelen.
- Datastreaming – Bedrijven als Netflix gebruiken Node.js voor streamingdoeleinden. Dit komt voornamelijk doordat Node.js lichtgewicht en snel is. Daarnaast biedt Node.js een native streaming API. Met deze streams kunnen gebruikers verzoeken naar elkaar doorsturen, waardoor gegevens rechtstreeks naar de eindbestemming kan worden gestreamd.
- Complexe Single-Page Applications (SPA’s) – In SPA’s wordt de hele applicatie op één pagina geladen. Dit betekent meestal dat er op de achtergrond een aantal verzoeken wordt gedaan voor specifieke componenten. De event loop van Node.js komt hier te hulp, omdat het verzoeken op een niet-blokkerende manier verwerkt.
- Op REST API gebaseerde applicaties – JavaScript wordt zowel in de front-end als de back-end van sites gebruikt. Een server kan dus gemakkelijk met behulp van Node.js communiceren met de front-end via REST API’s. Node.js biedt ook pakketten zoals Express.js en Koa die het nog gemakkelijker maken om webapplicaties te bouwen.
Is Node.js een programmeertaal?
In één woord: Nee.
Node.js is geen programmeertaal. Het is eerder een runtime-omgeving die wordt gebruikt om JavaScript buiten de browser uit te voeren.
Ook is Node.js geen framework (een platform voor het ontwikkelen van softwareapplicaties). De Node.js runtime wordt gebouwd bovenop een programmeertaal – in dit geval JavaScript – en helpt bij het uitvoeren van de eigenlijke frameworks.
Kortom, Node.js is geen programmeertaal of framework; het is een omgeving voor ze.
Is Node.js front-end of back-end?
Een veel voorkomende misvatting onder ontwikkelaars is dat Node.js een back-end framework is en alleen wordt gebruikt voor het bouwen van servers. Dit is niet waar: Node.js kan zowel op de front-end als op de back-end worden gebruikt.
Een van de redenen waarom Node.js frameworks een populaire keuze zijn voor ontwikkelaars die een flexibele en schaalbare back-end bouwen, is de event-driven, niet-blokkerende aard ervan. Front-end ontwikkelaars zullen echter weinig moeite hebben om deze voordelen van Node.js in te beelden voor hun eigen projecten.
Laten we eens kijken waarom Node.js werkt voor zowel back-end als front-end:
- Herbruikbaarheid – JavaScript is een veelgebruikte taal die wordt gebruikt om zowel back-end als front-end te schrijven met behulp van frameworks zoals Express.js en Meteor.js. Sommige populaire stacks zoals MERN gebruiken Express.js als een back-end (een Node.js framework). Ook kunnen meerdere componenten worden hergebruikt tussen front-end en back-end.
- Productiviteit en efficiëntie voor ontwikkelaars – Dankzij een vermindering van het wisselen van context tussen meerdere talen, kan veel tijd worden bespaard voor de developer. Het gebruik van JavaScript voor zowel de back-end als de front-end resulteert in een verbeterde efficiëntie, aangezien veel tools door beide gebruikt kunnen worden.
- Enorme community – Een bloeiende online community speelt een rol in de snelheid van een succesvolle ontwikkelingscyclus. Als je vastloopt op een probleem, is de kans groot dat iemand het al heeft opgelost en de oplossing heeft gedeeld op Stack Overflow. Node.js maakt veel gebruik van deze community, die actief en betrokken is als het gaat om de populaire runtime en zijn pakketten.
Aan de slag met Node.js
Het kan erg lastig zijn om te bepalen waar je wil beginnen met Node.js. Gelukkig is het erg simpel om te installeren, en vanaf daar kan je de runtime meteen meenemen voor een testrit.
Zo installeer je Node.js
Als je Node.js al hebt geïnstalleerd, kan je deze sectie overslaan.
Op macOS
Bash gebruiken op Mac
curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"
Homebrew gebruiken op Mac
brew install node
Op Windows
Download de Windows installer rechtstreeks vanaf de website nodejs.org.
Op Linux
Op Ubuntu 18.04+ kun je Node installeren met de volgende commando’s.
sudo apt update
sudo apt install nodejs
De versie controleren van de geïnstalleerde Node.js
In het vorige gedeelte hebben we met succes Node geïnstalleerd. Laten we het verifiëren door de geïnstalleerde versie te controleren. Voer de volgende opdracht uit in de terminal.
node -v
Je kunt het ook controleren met de langere flag
node --version
Je zou een output moeten zien die er ongeveer zo uitziet. Het versienummer kan uiteraard verschillen.
v14.16.0
Wat is NPM?
NPM is het package ecosysteem van Node.js. Het is het grootste ecosysteem van alle open source bibliotheken ter wereld, met meer dan 1 miljoen pakketten en het groeit nog steeds. NPM is gratis te gebruiken en duizenden open source ontwikkelaars dragen er dagelijks aan bij.
NPM wordt standaard geleverd met een opdrachtregelprogramma. Je kan eenvoudig naar de NPM website gaan om het pakket dat je nodig hebt te zoeken en het met één opdracht te installeren. Ook kan je de versies van je packages beheren, de dependency’s bekijken en zelfs custom scripts instellen binnen je projecten met dit opdrachtregelprogramma. NPM is zonder twijfel het meest geliefde onderdeel van de Node.js community; Node.js trekt een groot aantal ontwikkelaars aan, grotendeels dankzij de uitstekende pakketondersteuning.
NPM pakketten installeren via CLI
Wanneer je Node.js installeert, wordt NPM automatisch mee geïnstalleerd. We hebben in de vorige secties besproken hoe je Node.js installeert, dus laten we nu eens kijken naar de opdracht voor het installeren van een pakket met NPM:
npm install <package-name>
Jep, zo makkelijk is het! Je kan zelfs meerdere pakketten tegelijk installeren:
npm install <pkg-1> <pkg-2> <pkg-3>
Je kan zelfs de -g (global) flag specificeren als je een pakket in de globale context wil installeren. Hierdoor kan je het pakket overal op je machine gebruiken.
Wanneer je een nieuwe toepassing initialiseert, maakt NPM automatisch een package.json bestand aan dat bestaat uit alle NPM pakketten. Hier kan je versies, dependency’s en custom scripts specificeren.
Er is een lange lijst met opdrachten die bij het NPM hulpprogramma worden geleverd, waaronder publish
, audit
, run
en meer. Je kan zien hoe je deze kan gebruiken met de opdracht npm help
.
Populaire pakketten
Dit zijn momenteel een aantal van de meest populaire pakketten van Node.js:
- Express – Epxress.js, of gewoon Express, is een door Sinatra geïnspireerd framework voor webdevelopment voor Node.js en is in de praktijk de standaard voor de meeste Node.js applicaties die je vandaag de dag zal vinden.
- MongoDB – De officiële driver naar MongoDB. Het biedt de API voor MongoDB object databases in Node.js.
- Socket.io – Socket maakt realtime, bidirectionele en event-based communicatie mogelijk.
- Lodash – Lodash maakt JavaScript gemakkelijker door werken met arrays, getallen, objecten, strings, enz. eenvoudiger te maken.
- Moment – Een JavaScript datumbibliotheek voor het parseren, valideren, manipuleren en formatteren van datums.
- Commander.js – Dit is alles wat je nodig hebt om te werken en te bouwen met opdrachtregelinterfaces voor node.js.
- Forever – Een simpele CLI tool om ervoor te zorgen dat een bepaald script continu draait (dwz voor altijd). Zorgt dat je Node.js process in productie blijft ondanks onverwachte storingen.
- Async – Een utility-module die eenvoudige, krachtige functies biedt voor het werken met asynchroon JavaScript.
- Redis – Een client bibliotheek ter ondersteuning van integratie met Redis databases.
- Mocha – Een strak, flexibel JavaScript testframework voor Node.js en de browser.
- Passport – Eenvoudige, onopvallende authenticatie vor Node.js. Het enige doel van Passport is om verzoeken te verifiëren.
Hello World in Node.js
Laten we zoals altijd beginnen met het basisprogramma “Hello World”, waar we een server maken in Node.js die een “Hello World” output zal retourneren op een serververzoek. Voordat je hiermee begint, zorg ervoor dat je een goede teksteditor hebt.
Zodra je je teksteditor hebt geopend, is hier de code die je gaat gebruiken voor je “Hello World” programma:
// server.js
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World! Welcome to Node.js');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Sla dit bestand op als ‘server.js’. Ga nu naar de terminal en start de server met de volgende opdracht:
node server.js
De server zou nu moeten starten. Om de output te verifiëren, open je http://localhost:3000 in je browser. Je zou nu dit bericht moeten zien –
Hello World! Welcome to Node.js
Uitleg van de Hello World server
Node.js wordt geleverd met een ingebouwde module genaamd “HTTP” waarmee Node.js gegevens kan overdragen via het Hypertext Transfer Protocol (HTTP).
In bovenstaande code laden we eerst de http module in ons programma. Vervolgens gebruiken de de createServer methode om een verzoek te accepteren en een antwoord met een statuscode terug te sturen. Ten slotte gebruiken we “listen” voor een gedefinieerde poort.
Gefeliciteerd, je hebt zojuist je eerste server gemaakt in Node.js! In de volgende sectie leren we hoe je het Express framework gebruikt om een server te maken.
Servers maken met Express
Allereerst is het goed om duidelijk te hebben wat een server precies is. Een server is verantwoordelijk voor het verwerken van client verzoeken via zijn software (meestal Apache of Nginx), het uitvoeren van de vereiste reeks taken en (uiteindelijk) het terugsturen van responses naar de clients. Express is een framework waarmee we een server in Node kunnen maken.
Express.js is een “minimal” en flexibel Node.js webapplicatieframework dat een solide set functies biedt voor web- en mobiele applicaties. Hiermee kan je route tabellen toevoegen en middleware in je applicatie instellen. Je kan Express installeren met de onderstaande opdracht.
npm install express --save
In het vorige gedeelte hebben we de ingebouwde http utility gebruikt om een server te maken. Laten we nu een “Hello World” server maken met Express.js.
Open je teksteditor en voer deze code in:
// server-express.js
const express = require('express')
const app = express() // initialize app
const port = 3000
// GET callback function returns a response message
app.get('/', (req, res) => {
res.send('Hello World! Welcome to Node.js')
})
app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`)
})
Vervolgens draaien we onze server met de volgende opdracht.
node server-express.js
Check nu http://localhost:3000 in je browser om de “Hello World” output te zien.
Samenvatting
Samengevat is Node.js een populaire programmeeromgeving die kan worden gebruikt voor het bouwen van grootschalige applicaties die meerdere gelijktijdige verzoeken moeten kunnen ondersteunen. Single-threaded non-blocking I/O maakt het daarnaast een uitstekende keuze voor zowel realtime als datastreamingstoepassingen.
Een groot voordeel van Node.js is de enorme gemeenschap van actieve ontwikkelaars en het ’s werelds grootste open-source pakketrepository, NPM, die momenteel meer dan een miljoen pakketten bevat.
Het is gemakkelijk om aan de slag te gaan met Node.js. We hebben besproken hoe je een server in Node.js installeert en aanmaakt. Aan jou dus alleen de taak om te bedenken hoe Node.js kan implementeren en gebruiken in jouw stack. Je kan je kennis uitbreiden door de officiële Node.js documentatie te bezoeken op nodejs.dev.