Overslaan naar content

BLOG

10 tips voor PHP developers om te starten met Node.js

Node JS PHP

Mijn naam is Daan, ik ben een Technisch Architect bij Triple en in deze blog zal ik mijn ervaringen met Node.js delen en je vertellen waar je op moet letten als je al bekend bent met PHP. Node.js is een krachtige JavaScript runtime-omgeving die de noodzaak wegneemt om met verschillende programmeertalen te werken voor server-side en client-side scripts.

Volgens Wikipedia werd PHP geboren op 8 juni 1995, wat 27 jaar geleden is op het moment van schrijven van deze blog. Ik begon PHP-scripts te schrijven rond de leeftijd van 16, in het jaar 2000, toen PHP versie 4 al was gelanceerd.

Destijds waren er technisch gezien slechts twee opties: PHP en ASP.net. PHP was meer gericht op Linux en ASP.net was (en is nog steeds) alleen beschikbaar voor Windows. Perl was ook een optie, maar het voelde meer als een scripttaal dan als een taal voor het bouwen van een complete webtoepassing.

Fast-forward naar nu. PHP speelt nog steeds een belangrijke rol. Volgens kinsta.com vertrouwt ongeveer 80% van alle websites nog steeds in zekere mate op PHP. Het aantal beschikbare technieken is sinds die tijd aanzienlijk toegenomen:

languages development

Waarom Node.js?

Ongeveer zes jaar geleden ben ik begonnen met ontwikkelen in Node.js (naast PHP), voornamelijk in zijprojecten. Ik was al bekend geraakt met JavaScript tijdens het bouwen van webtoepassingen voor Triple. Eerder had ik ook onderzocht welke technieken doorgaans werden gebruikt in de front-end. Hierdoor had ik al enige ervaring opgedaan met Preact en server-side rendering, wat Node.js ook doet. De toolchain voor het bouwen van die front-end toepassingen is ook te vinden in Node. Een andere belangrijke overweging om door te gaan met Node.js is dat die toepassingen gemakkelijker waren uit te rollen op mijn Raspberry Pi thuis. Met php-fpm en nginx is het moeilijker om verschillende PHP-versies parallel te laten draaien op dezelfde server.

Wat je moet weten over Node.js als PHP-ontwikkelaar

1 — Let op de verwerking van processen en verzoeken

Node.js werkt op een andere manier dan PHP. Met PHP wordt een verzoek in de meeste gevallen ontvangen door nginx of Apache en doorgegeven aan php-fpm. Een Node-toepassing is een proces dat je zelf start. In de code configureer je een webserver (bijv. Express) die luistert op een TCP-poort. Daarnaast configureer je de routes rechtstreeks op die webserver.

Bij PHP is het php-fpm-proces verantwoordelijk voor het aanroepen van de PHP-interpreter. In Node.js wordt het verzoek rechtstreeks binnen de toepassing zelf afgehandeld. Daarom moet je in Node.js heel voorzichtig zijn om niets buiten het verzoek te manipuleren. In tegenstelling tot PHP, waar het hele script eindigt wanneer het verzoek is voltooid, blijft Node.js het proces actief houden.

node js

In het onderstaande voorbeeld blijft de waarde van de teller toenemen tussen de verzoeken door. Dit zou niet mogelijk zijn in PHP.

PHP

2 — Kies de juiste package manager

PHP maakt gebruik van Composer, in combinatie met packagist.org. In Node is npmjs.com het equivalent van packagist.org. Er zijn verschillende package managers beschikbaar, de twee meest populaire zijn:

  1. Npm, de standaard package manager van Node.

  2. Yarn, een package manager die zijn oorsprong vindt bij Facebook.

Het zou te ver gaan om nu in te gaan op de verschillen, voordelen en nadelen van beide. Als beginnende Node.js ontwikkelaar is de keuze voor npm het gemakkelijkst, omdat dit al standaard beschikbaar is.

De afhankelijkheden en pakketten die geïnstalleerd moeten worden, worden gedefinieerd in een package.json-bestand in de hoofdmap van het project. Na het installeren van pakketten wordt er een package-lock.json-bestand aangemaakt, dat het equivalent is van het composer.lock-bestand.

Na het uitvoeren van het npm install commando worden alle afhankelijkheden gedownload naar de node_modules-map. Van daaruit worden de afhankelijkheden indien nodig opgenomen in het project.

3 — Gebruik vanaf het begin TypeScript

TypeScript is een programmeertaal ontwikkeld en onderhouden door Microsoft. Het is een strikte syntactische subset van JavaScript en voegt optionele statische typen toe aan de taal. Het is ontworpen voor de ontwikkeling van grote applicaties en wordt getranspileerd naar JavaScript.[4] Omdat het een uitbreiding is van JavaScript, zijn bestaande JavaScript-programma's ook geldige TypeScript-programma's." Bron: Wikipedia

Als je ervoor kiest om met Node.js te ontwikkelen, is mijn advies om direct met TypeScript te beginnen. Het grote voordeel is dat je tijdens de ontwikkeling al types kunt toekennen aan variabelen, argumenten, enzovoort. Op deze manier word je al vroegtijdig geïnformeerd over eventuele problemen in je IDE, waarbij dit bij normaal JavaScript pas tijdens de uitvoering van de code gebeurt.

Een voorbeeld van dezelfde applicatie, in JavaScript en in TypeScript

PHP

Via een build-stap wordt de TypeScript-code omgezet in JavaScript-code. De typen en dergelijke zijn daarom alleen beschikbaar tijdens de ontwikkeling. Voor de output wordt de TypeScript-code getranspileerd naar JavaScript en vervolgens dienovereenkomstig geïnterpreteerd. Het is daarom essentieel om de structuur van externe gegevens die de applicatie ontvangt te valideren, in plaats van alleen aan te geven dat de gegevens een bepaalde structuur hebben. Als je dat niet doet, krijg je tijdens de ontwikkeling geen waarschuwing, maar treden er problemen op tijdens de uitvoering.

Hieronder zie je een voorbeeld van de transpilatie van TypeScript naar JavaScript. Aangezien JavaScript de typen niet kan bevatten, kun je in de build-stap van TypeScript aangeven dat je wilt dat de type-aanduidingen worden gegenereerd in een apart bestand. Dit wordt voornamelijk gebruikt bij externe modules, omdat je nog steeds kunt aangeven wat de typen zijn van de geïmporteerde JavaScript-code.

node js

4 — Let op de import en export van modules

node js

5 — Bekijk de informatie over versiebeheer en Long Term Support

Voor Node.js is er een duidelijke strategie voor de ondersteuning op lange termijn (LTS) van versies. Deze informatie is te vinden op de website.

LTS

6 — Leer werken met klassen, functies en anonieme functies

Hieronder vind je enkele voorbeelden van de notatie van functies in klassen in JavaScript.

node

"7 — Gebruik promises / async / await

"Het Promise-object vertegenwoordigt de uiteindelijke voltooiing (of mislukking) van een asynchrone bewerking en de resulterende waarde." - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Door gebruik te maken van promises kun je de programmatie laten doorgaan terwijl je wacht op een bepaalde actie (zoals het opvragen van een database) om te voltooien. Aangezien Node.js single-threaded is, zullen synchrone acties de uitvoer van de applicatie blokkeren voor elke HTTP-verzoek totdat de bewerking is voltooid. Promises bieden hiervoor een oplossing. Tot voor kort werkten we met callbacks, waarbij het resultaat van de bewerking werd geretourneerd via een functieoproep.

Hieronder zie je een voorbeeld van een functie die een promise retourneert en hoe de aanroepende functie dit afhandelt. De functie in 'then' wordt opgeroepen met het resultaat van de promise.

node

De mechanismen async/await maken het werken met promises gemakkelijker. Als een functie await gebruikt, moet deze worden gemarkeerd als asynchroon met het trefwoord 'async'. Binnen de functie kun je dan typen 'await fooBar()'. Dit wordt vertaald naar 'fooBar().then()' in de interpretatie, maar je hoeft het niet expliciet te typen. Het bovenstaande voorbeeld kan dus op een veel leesbaardere manier worden geschreven:

node

8 — Let op het ontbreken van autoloading / namespaces

De concepten van autoloading en namespaces bestaan niet in Node.js. Namespaces worden bereikt door de locatie al op te geven in de import/require-statement.

Bovendien wordt Dependency Injection, een bekend ontwerppatroon met veel voordelen, niet erg vaak gebruikt. Dit is het patroon dat ik het meest mis in het JavaScript-ecosysteem.

9 — Kies het HTTP-framework dat bij je past

Binnen een Node.js-proces ben je als ontwikkelaar verantwoordelijk voor de afhandeling van HTTP-verzoeken. Node.js biedt hiervoor een low-level module: http.

In feite wordt de HTTP-module nooit rechtstreeks gebruikt. Er wordt eerder een framework gebruikt dat boven op de HTTP-module werkt.

Express is een framework dat rechtstreeks boven op http werkt. Daarnaast zijn er verschillende frameworks die boven op Express zijn gebouwd, zoals Koa, Hapi en Fastify.

Net als bij PHP is de keuze voor een framework persoonlijk. Het hangt ook af van wat je vereisten zijn en waar je aan gewend bent. Mijn persoonlijke voorkeur gaat uit naar het gebruik van Express, met als belangrijkste reden dat ik er uitgebreide ervaring mee heb. Het grootste nadeel van Express is dat het niet automatisch omgaat met asynchrone request handlers. Express 5 zou dit moeten oplossen, maar het bevindt zich momenteel nog in bèta. In dit artikel kun je meer lezen over dit onderwerp.

10 — Maak gebruik van tools

Het JavaScript-ecosysteem staat bekend (of berucht) om zijn vele frameworks en tools die soortgelijke problemen oplossen. Om het overzicht te behouden, zal ik er een aantal uitlichten.

Prettier Bij Prettier noemen de makers het een opiniegedreven code-formatter. Het is vergelijkbaar met tools zoals phpcs of php-cs-fixer. Door Prettier in het project uit te voeren, worden een aantal codeerstandaarden (tabs versus spaties, regelafbrekingen, enz.) toegepast op elk bestand. Met een integratie in je gebruikte IDE kun je zelfs de opmaak laten uitvoeren tijdens het opslaan van het bestand.

Nodemon Ontwikkelen in Node.js werkt anders dan ontwikkelen in PHP. Bij PHP is het voldoende om de pagina te vernieuwen om wijzigingen in de code te zien, terwijl bij Node.js de applicatie opnieuw moet worden gestart. Nodemon is een eenvoudige tool die het bestandssysteem controleert op wijzigingen in .js- of .ts-bestanden. Als er wijzigingen worden gedetecteerd, wordt het proces opnieuw gestart zodat de wijzigingen onmiddellijk zichtbaar zijn.

Eslint "ESLint is een tool voor het identificeren en rapporteren van patronen die worden gevonden in ECMAScript/JavaScript-code." Dit is een veelgebruikte tool binnen JavaScript. Waar Prettier zich richt op de opmaak, is Eslint een linting tool die ook waarschuwt voor 'problemen' in de code. Het is vergelijkbaar met phpstan.

Het gebruik ervan is eenvoudig: je maakt een set regels (en gebruikt mogelijk een standaarddefinitie, zoals airbnb of standard, als basis) en je code wordt gevalideerd aan de hand van die set regels. Wat precies de regels zijn, kan van geval tot geval verschillen. Het kan bijvoorbeeld gaan om de volgorde van imports of het gebruik van een verkorte notatie voor een if-statement.

Jest Het (unit)testframework dat op dit moment het meest populair is, is Jest. Met unit testing, code snapshots en mocking is het een tool waarmee je eenvoudig allerlei automatische tests kunt opzetten.

Meer informatie? In deze blog heb ik tien tips gegeven voor PHP-ontwikkelaars die van plan zijn om applicaties te gaan schrijven in Node.js. Ben je het niet met me eens of heb je vragen? Je kunt contact met me opnemen via d.zonneveld@wearetriple.com. Ben je op zoek naar een nieuwe baan of wil je meer weten over Triple? Neem een kijkje op onze website

Meer verhalen van Tripelaars

Servermanagement met Saltstack

Rogier van der Heide

Tropical Tuesdays zorgen voor de creatieve en innovatieve vibe bij Triple

Triple cultuur

WWDC 2022: de superkrachten van developers ondersteunen

Jeroen Bakker