Læsetid: 13 minutter
Som det mest populære programmeringssprog er JavaScript også en af de mest universelle teknologier til softwareudvikling. Traditionelt bruges det som et værktøj til frontend-udvikling på nettet, men det er også blevet et vigtigt værktøj til mobiludvikling på tværs af platforme som en grundlæggende teknologi til en lang række platforme, f.eks. Apache Cordova/PhoneGap, React Native, NativeScript, Appcelerator Titanium.
Men anvendelsesområderne for JavaScript slutter ikke her. I den seneste tid har der været en masse snak om brugen af JavaScript til server-side programmering. Et af de værktøjer, der indikerede dette skift i webudvikling, var Node.js.
- Hvad er Node.js?
- Fordelene ved Node.js
- ⊕ Robust teknologistak
- ⊕ Hurtig behandling og begivenhedsbaseret model
- ⊕ Skalerbar teknologi til microservices
- ⊕ Rigt økosystem
- ⊕ Stærk virksomhedsstøtte
- ⊕Sømløs JSON-understøttelse
- Ulemperne ved Node.js
- Θ Performanceflaskehalse med tunge beregningsopgaver
- Θ Callback-helvedeproblem
- Θ Umodenhed af værktøjer
- Θ Voksende efterspørgsel efter erfarne fagfolk
- Sådan lærer du Node.js
- Node.js vs Ruby on Rails vs Django vs Symfony
- Få Node.js til at skinne
Hvad er Node.js?
Node.js er faktisk ikke en ramme eller et bibliotek, men et kørselstidsmiljø, der er baseret på Chromes V8 JavaScript-motor.
Teknologien blev første gang introduceret tilbage i 2009 af Ryan Dahl på den årlige europæiske JSConf og blev straks anerkendt som “det mest spændende enkeltstående stykke software i det nuværende JavaScript-univers”.
Som et open source-projekt blev Node.js sponsoreret af Joyent, en leverandør af cloud computing- og hostingløsninger. Virksomheden investerede i en række andre teknologier, såsom Ruby on Rails framework, og leverede hostingtjenester til Twitter og LinkedIn. Sidstnævnte blev også en af de første virksomheder til at bruge Node.js til sin backend for mobilapplikationer. Teknologien blev senere indført af en række teknologiske ledere, såsom Uber, eBay, Walmart og Netflix, for blot at nævne nogle få.
Det var dog først for nylig, at den brede indførelse af server-side JavaScript med Node.js begyndte. Interessen for denne teknologi toppede i 2017, ifølge Google Trends, og er fortsat stor.
Node.js downloads. Installer Long-Term Support og de nyeste versioner af Node.js til Windows og MacOS her. Også en påmindelse – npm distribueres med Node.js out-of-the-box.
Dokumentation. Find dokumentationen og vejledninger til at komme i gang på linket.
Node.js IDE’er . Næsten alle populære kodeeditorer har understøttelse af og plugins til JavaScript og Node.js, så det er kun vigtigt, hvordan du tilpasser dit IDE til dine kodningsbehov. Men mange udviklere roser i høj grad særlige værktøjer fra VS Code, Brackets, Atom og WebStorm.
Frameworks . Brug af middleware frem for ren Node.js er en almindelig praksis, der gør udviklernes liv lettere. Vi har en separat artikel, der sammenligner populære Node.js-frameworks, hvor vi ser på Express.js, Meteor, Sales.js, Koa.js, Keystone.js og Loopback.js.
For flere værktøjer fra JavaScript-økosystemet, der bruges sammen med Node.js, se den dedikerede artikel.
Node.js styrker og svagheder gør det til genstand for en ophedet diskussion. For at få styr på tingene har vi analyseret begge dele – Node.js fordele og ulemper – i et forsøg på at finde ud af, hvilke projekter der kan drage fordel af dette teknologiske valg. Så hvorfor bruge Node.js?
En hurtig forklaring på, hvad Node.js er (abonner venligst, hvis du vil have mere videoindhold)
Fordelene ved Node.js
⊕ Robust teknologistak
JavaScript har vist sig at være en ubestridt leder blandt de mest populære programmeringssprog. Til gengæld er Node.js blevet et selvstændigt navn i branchen. Med i alt 368.985.988 downloads og over 750 nye bidragydere som anført i Node-by-numbers-rapporten 2018 synes projektet at være stærkere end nogensinde.
Med Node.js til backend, får du automatisk alle fordelene ved full stack JavaScript-udvikling, f.eks:
- bedre effektivitet og samlet udviklerproduktivitet
- kodedeling og genbrug
- hastighed og ydeevne
- let videndeling inden for et team
- en enorm mængde gratis værktøjer
Som følge heraf er dit team meget mere fleksibelt, udviklingen er mindre tidskrævende, og som resultat får du hurtig og pålidelig software. Udviklere, der er uddannet i frontend JavaScript, kan begynde at programmere serversiden med et minimum af indsats. Med det samme sprog på begge sider kan du genbruge kode på frontend og backend ved at indpakke den i moduler og skabe nye abstraktionsniveauer.
Trods en udbredt opfattelse er du som full stack-udvikler på ingen måde begrænset til den traditionelle MEAN-stak (MongoDB, Express.js, AngularJS og Node.js) stak. Det eneste must-have i dette tilfælde er Node.js (der er ikke noget alternativ i JavaScript til backend-programmering). Resten af teknologierne i denne stak er valgfrie og kan erstattes med nogle andre værktøjer, der leverer lignende funktionalitet (læs om alternativerne i vores separate artikel).
⊕ Hurtig behandling og begivenhedsbaseret model
Node.js er hurtig; det er ikke en myte. Tag et kig på ydelsestests fra toptal.com, der sammenligner, hvordan GO, PHP, Java og Node.js håndterer samtidige anmodninger. Der et par grunde til, at Node.js viser sådanne resultater:
V8-motor. Den motor, der anvendes i Node.js implementering, blev oprindeligt udviklet til Chrome-browseren. Chrome’s V8 er skrevet i C++ og bruges til at kompilere funktioner, der er skrevet i JavaScript, til maskinkode, og den klarer opgaven med en imponerende hastighed. Tjek blot benchmarks for ydeevne i V8’s blog. Takket være Googles store investeringer i motoren demonstrerer V8 ydelsesforbedringer hvert år, og Node.js trækker hele posen med fordele ud af den.
Non-blocking Input/Output og asynkron anmodningshåndtering gjorde Node.js i stand til at behandle anmodninger uden forsinkelser. I forbindelse med backend forudsætter synkron behandling, at kode udføres i en sekvens. Hver anmodning blokerer således en tråd, hvilket får andre anmodninger til at vente på, at den bliver afsluttet. Asynkron behandling gør det muligt at behandle anmodninger uden at blokere (non-blocking I/O) tråden. Så efter at en anmodning er behandlet, kan den skubbe en callback ud og fortsætte med at betjene anmodninger. Det hjælper Node.js med at få mest muligt ud af single threading, hvilket resulterer i kort svartid og samtidig behandling.
Et andet aspekt er den begivenhedsbaserede model. Når man bruger et fælles sprog til både klient/server-siden, sker synkroniseringen hurtigt, hvilket især er nyttigt for begivenhedsbaserede realtidsprogrammer. På grund af den asynkrone, ikke-blokkerende, enkelttrådede natur er Node.js et populært valg til onlinespil, chats, videokonferencer eller enhver løsning, der kræver konstant opdaterede data.
Eksemplerne taler for sig selv: Mange førende virksomheder skiftede teknologi til udviklet Node.js applikationer og bemærkede betydelige forbedringer – PayPal bemærkede f.eks. et fald på 35 procent i responstid siden overgangen fra Java.
⊕ Skalerbar teknologi til microservices
Da det er et letvægts-teknologiværktøj, er det et godt valg at bruge Node.js til microservices-arkitektur. Denne arkitektoniske stil beskrives bedst af Martin Fowler og James Lewis som “en tilgang til udvikling af en enkelt applikation som en suite af små tjenester, der hver kører i sin egen proces og kommunikerer med letvægtsmekanismer, ofte et HTTP ressource-API.”
Desuden at opdele applikationslogikken i mindre moduler, mikrotjenester, i stedet for at skabe en enkelt, stor monolitisk kerne, giver du mulighed for bedre fleksibilitet og lægger grunden til yderligere vækst. Som følge heraf er det meget lettere at tilføje flere mikrotjenester oven på de eksisterende end at integrere yderligere funktioner med den grundlæggende app-funktionalitet.
Monolitisk arkitektur vs. mikroservicearkitektur i en nøddeskal
Node.js er ifølge Node.js User Survey Report 2017 den foretrukne teknologi, når der skal opbygges og implementeres økosystemløsninger med mikrotjenester. Omkring halvdelen af respondenterne bruger microservice-relaterede teknologier (nemlig Docker, den førende softwarecontaineriseringsplatform) til at bygge Node.js-webapps:
Procentdel af udviklere, der bruger Docker-containerisering med Node.js
Nyere resultater viser, at microservice-relaterede teknologier som Docker og Kubernetes oplevede vækst i brugen i 2018, da denne arkitektoniske stil kun bliver mere og mere populær. Da hver mikroservice kommunikerer direkte med databasen via streams, giver en sådan arkitektur mulighed for bedre ydeevne og hastighed i applikationen. Et match made in heaven understøttes af to frameworks, der i vid udstrækning anvendes til microservicearkitektur. Express-rammen nævner IBM og Uber blandt sine brugere, mens restify bruges af npm og Netflix.
Som et eksempel på levende implementering kan Walmart’s skift til mikrotjenestearkitektur med Node.js resulterede i følgende umiddelbare fordele:
- Overnight 20 procent konverteringsvækst generelt og 98 procent mobil konverteringsvækst
- Hundrede procent oppetid på Black Friday (håndtering af over 500 millioner sidevisninger)
- Sparer op til 40 procent på hardware og 20-50 procent på den samlede drift
Et andet lysende eksempel på, hvordan Node.js kan overgå konkurrenterne med hensyn til ydeevne, er tilfældet med GoDaddy. Ved at køre SuperBowl-annoncekampagnen kunne virksomheden håndtere 10.000 forespørgsler i sekundet uden nedetid og kun bruge 10 procent af hardwaren takket være Node.js.
⊕ Rigt økosystem
Et ord – npm, en standard Node.js-pakkehåndtering, det fungerer også som en markedsplads for open source JavaScript-værktøjer, som spiller en vigtig rolle i denne teknologis fremgang. Med omkring 836.000 biblioteker, der er tilgængelige i npm-registret fra nu af, og over 10.000 nye biblioteker, der offentliggøres hver uge, er Node.js-økosystemet ganske rigt. De samme statistikker påpeger, at 97 procent af moderne webapplikationer består af npm-moduler. Og det er et bevis på dets ubestridelige popularitet blandt udviklere.
Med et så stort udvalg af gratis værktøjer, der er tilgængelige med få klik, er der et enormt potentiale for brugen af Node.js. Samtidig nyder open source-software stigende popularitet, da det giver mulighed for at opbygge nye løsninger, der reducerer de samlede udviklingsomkostninger og tiden til markedsføring.
⊕ Stærk virksomhedsstøtte
Som nævnt ovenfor blev udviklingen af Node.js støttet af Joyent. I 2015 blev Node.js Foundation oprettet for at “muliggøre en udbredt vedtagelse og hjælpe med at fremskynde udviklingen af Node.js.” IBM, Microsoft, PayPal, Fidelity og SAP blev de stiftende medlemmer af organisationen.
Listen over organisationer, der bruger Node.js i produktion, vokser konstant. Den omfatter i øjeblikket næsten tre hundrede kendte virksomheder, såsom PayPal, Medium, Trello, Uber og Zendesk.
Svært få open source-projekter har nogensinde haft så stærk støtte fra verdens førende virksomheder. Og det varsler, at Node.js har et enestående potentiale.
⊕Sømløs JSON-understøttelse
Men selv om andre backend-teknologier som PHP og Ruby on Rails kan bruge JSON-formatet til kommunikation, gør Node.js det uden at konvertere mellem binære modeller og bruger JavaScript. Dette er især praktisk, når du skal bygge RESTful API’er til NoSQL-databaseunderstøttelse, som MongoDB – bogstavet M i MEAN-stakken. Denne problemfri kommunikation med en af de vigtigste standarder for dataoverførsel er en anden fordel ved JavaScript-økosystemet.
Ulemperne ved Node.js
Θ Performanceflaskehalse med tunge beregningsopgaver
Den største ulempe ved Node.js er selv nu den manglende evne til at behandle CPU-bundne opgaver. Men for at forstå, hvad rødderne til dette problem er, har vi brug for en lille smule kontekst. Lad os begynde med det grundlæggende, med selve JavaScript.
Som vi ved, er Node.js et runtime-miljø, der udfører JavaScript på serversiden. Da JavaScript er et frontend-programmeringssprog, bruger det en enkelt tråd til at behandle opgaver hurtigt. Threading er ikke påkrævet for at det kan fungere, fordi opgaver i JavaScript er lette og kræver kun lidt CPU.
Vi vender tilbage til Node.js, og nu ved vi, hvorfor det anses for at være enkelttrådet: Den behandler JavaScript, som er enkelttrådet. En ikke-blokerende input/output-model betyder, at Node.js besvarer klientens kald for at starte en anmodning og behandler opgaven i den tid, den skyder callback, efterhånden som opgaven er klar. Ved at behandle opgaver asynkront udfører Node JS-kode på sin enkelt tråd på hændelsesbasis. Det er det, der kaldes en event-loop.
Problemet opstår, når Node.js modtager en CPU-bunden opgave: Når der kommer en tung anmodning til event-loop’en, vil Node.js indstille al den CPU, der er til rådighed, til at behandle den først, og derefter besvare andre anmodninger i køen. Det resulterer i langsom behandling og generel forsinkelse i event loopet, hvilket er grunden til, at Node.js ikke anbefales til tunge beregninger.
I 2018 blev multithreading imidlertid indført i Node.js som en eksperimentel funktion med opdateringen 10.5.0. En ny funktion kaldet worker threads-modulet kan bruges til at udnytte yderligere tråde fra en trådpulje til at udføre CPU-bundne opgaver. Men det kan kun gøres på maskiner med flere kerner, da Node.js stadig giver dig mulighed for at bruge én kerne til én tråd. Det betyder, at tunge parallelle processer kan afvikles på en anden tråd. Denne funktion er stadig eksperimentel i Node.js version 12, men er blevet væsentligt forbedret.
Θ Callback-helvedeproblem
På grund af sin asynkrone natur er Node.js stærkt afhængig af callbacks, de funktioner, der køres, efter at hver opgave i køen er færdig. Hvis man har et antal opgaver i kø i baggrunden, hver med sit callback, kan det resultere i det såkaldte callbackhelvede, hvilket direkte påvirker kvaliteten af koden. Enkelt sagt er det en “situation, hvor callbacks er indlejret i andre callbacks flere niveauer dybt, hvilket potentielt gør det svært at forstå og vedligeholde koden.”
Eksempel på kode med indlejrede callbacks
Billedkilde: callbackhell.com
Dette anses ofte for at være et tegn på dårlige kodningsstandarder og manglende erfaring med JavaScript og Node.js i særdeleshed. Koden, der er repræsenteret ovenfor, kan refaktoriseres og forenkles, i nogle få trin, som vist på callbackhell.com.
Θ Umodenhed af værktøjer
Selv om de centrale Node.js-moduler er ret stabile og kan betragtes som modne, er der mange værktøjer i npm-registret, som enten er af dårlig kvalitet eller ikke er ordentligt dokumenteret/testet. Desuden er selve registeret ikke struktureret godt nok til at tilbyde værktøjerne på baggrund af deres rating eller kvalitet. Derfor kan det være svært at finde den bedste løsning til dine formål uden at vide, hvad du skal kigge efter.
Det faktum, at Node.js økosystem er for det meste open source, har også sin indvirkning. Mens Joyent og andre store bidragydere overvåger kvaliteten af kernen i Node.js-teknologien, kan resten af værktøjerne mangle den kvalitet og de høje kodningsstandarder, der er fastsat af globale organisationer.
Θ Voksende efterspørgsel efter erfarne fagfolk
Trods den almindelige opfattelse er det ikke alle JavaScript-udviklere, der også er Node.js-udviklere. At beherske server-side JavaScript-programmering kræver en betydelig indsats og en vis baggrund inden for backend-udvikling. På grund af en så stejl indlæringskurve er antallet af Node.js ingeniører betydeligt lavere end det samlede antal JS-fagfolk.
Da hypen omkring Node.js fortsætter med at vokse, stiger efterspørgslen efter erfarne fagfolk på dette område.
Der er en stor videnkløft mellem ingeniørstuderende, der starter på deres job, og arbejdsgivernes behov
Kilde: Det kan derfor være svært at finde en dygtig Node.js-fagmand til dit projekt, da der findes millioner af JavaScript-udviklere. I dette tilfælde ønsker du helt sikkert ikke at begrænse din søgning til kun ét land. Sourcing af teknisk talent i udlandet er for længst blevet normen i it-branchen.
Sådan lærer du Node.js
Her er din startpakke til at forstå og arbejde med Node.js.
Torier. Du skal ikke begrænse dig til de officielle dokumenter: Se tonsvis af gratis lektioner på W3Schools, besøg internationale workshops fra Nodeschool, og brug selvfølgelig biblioteket med gratis tutorials fra freeCodeCamp.
Kurser. Hvis du er en dedikeret studerende, kan du starte et onlinekursus om Node.js: Her er et på PluralSight, og selvfølgelig et på Udemy.
Interaktiv læring. Se gratis og betalte ressourcer, der giver dig mulighed for at lære Node.js ved hjælp af interaktive lektioner og øvelser. En af de mest populære er The Art of Node.
Fællesskab. Se den officielle liste over fællesskabsdrevne Node.js-projekter. Et hurtigt tip: Undersøg Facebook-grupper og fællesskaber i dit område/første sprog. Og se selvfølgelig Node.js-fællesskaberne på Reddit, et tag på StackOverflow og emnet på Quora.
Node.js vs Ruby on Rails vs Django vs Symfony
Der er ikke mange teknologier, der kan konkurrere med Node.js’ popularitet eller efterspørgsel på markedet. Men hvis vi kigger på alternativerne til server-side programmering, ser vi mindst tre andre lysende stjerner på himlen. Det er Ruby on Rails, Django og Symfony. Lad os se, om de kan holde til Node.js’ fordele og deler dets ulemper.
Sammenligning af Node.js, Rails, Django og Symfony-statistikker
Kilde: StackShare
Ruby on Rails er kendt for sit enkle, men holdningsprægede sprog og for tilgængeligheden af gems – Rails’ eget økosystem af tilpassede pakker. Ruby selv er et intuitivt og begyndervenligt sprog med et støttende og engageret fællesskab, der bidrager med kode til RubyGems. Rails blev skabt til hurtig udvikling og prototypeudvikling, selv om det med succes anvendes af mærker som GitHub, Twitter og Airbnb, hvilket beviser dets brede vifte af anvendelsesmuligheder. Dens datamigreringsfunktionalitet er særligt imponerende – i modsætning til Node.js, som bruger yderligere pakker, har Rails allerede en funktion, der gør det muligt for dig at manipulere din database nemt og konsekvent.
Hvornår skal du bruge Rails frem for Node.js? Rails kan ikke konkurrere med Node’s ydeevne og skalerbarhed, men Rails kan dog være et bedre valg til hurtig udvikling. Node.js er ganske vist nødt til at bruge tredjepartsmoduler for at opnå denne udviklingshastighed, men Ruby har det hele ukonventionelt. Hvad angår sproget, har ingen af værktøjerne en klar fordel – mens Node.js har en høj efterspørgsel, men et lavt tilbud, er Rubys talentmasse i første omgang mindre.
Django er et webrammeværk på Python, det hurtigst voksende programmeringssprog ifølge data på StackOverflow. Det markedsføres som et værktøj til perfektionister med deadlines og er skabt til at lave applikationer så hurtigt som muligt og på den mest strukturerede, sikre og letforståelige måde. Django anses sammen med Python også for at have en mildere indlæringskurve. Mens det kræver omfattende kendskab til JavaScript at arbejde med Node.js, er Django en “batterier inkluderet”-teknologi. Den har et indbygget administrationspanel, så du nemt kan opdatere og vedligeholde dine databaser og skabeloner for at fremskynde dit arbejde.
Hvornår skal du bruge Django frem for Node.js? Sammenlignet med Node.js er Django et nybegyndervenligt værktøj. Ud over selve sproget er der ikke nogen egentlig grund til at vælge det ene frem for det andet. Det er mere et spørgsmål om din komfort og erfaring med enten JavaScript eller Python end de specifikke use cases.
Symfony er et PHP framework, hvilket automatisk giver det 20+ års dokumentation og et massivt, aktivt community. Mere end 80 procent af internettet er drevet af PHP med projekter som Facebook, Baidu eller ethvert andet websted, der kører på WordPress. Selvom Symfony kun er et af PHP-rammerne på markedet, er det imponerende stabilt, skalerbart og fungerer godt til store projekter. Det bruger også en templating engine Twig, der fungerer på samme måde som mange PHP-baserede Content Management Systems.
Hvornår skal du bruge Symfony frem for Node.js? Symfony understøtter naturligvis CMS-funktioner som f.eks. skabeloner og admin dashboards, hvilket gør det muligt at køre blogs, nyhedssider og e-handelsbutikker. Nogle af eksemplerne omfatter Yahoo Answers, Dailymotion og National Geographic.
Få Node.js til at skinne
Det er klart, at med alle de anførte Node.js fordele og ulemper, er teknologien ingen mirakelkur. Men det er Java, .Net framework eller PHP heller ikke. Alligevel er der specifikke tilfælde, hvor hver af de nævnte teknologier klarer sig bedst. For Node.js er der tale om realtidsapplikationer med intens I/O, der kræver hastighed og skalerbarhed.
Det kan være sociale netværk, spilapplikationer, livechats eller fora samt børssoftware eller annonceservere, hvor hastighed er det vigtigste. Node.js er hurtig og skalerbar og er den foretrukne teknologi til dataintensive IoT-enheder og -applikationer i realtid.
Node.js gjorde JavaScript til den foretrukne full-stack-teknologi til udvikling af webapplikationer. På grund af den ikke-blokkerende arkitektur fungerer Node.js godt til kodning og udsendelse af video og lyd, upload af flere filer og datastreaming. Sidstnævnte kan være overordentlig nyttigt til software til rejsebranchen, hvor man skal hente data fra forskellige API’er hos forskellige leverandører.
For nylig er Node.js blevet brugt aktivt i software på virksomhedsniveau. Selv om der stadig er mange diskussioner om dette, har mange store virksomheder og globale organisationer, såsom Capital One og NASA, allerede taget Node.js i brug. Og Node.js-økosystemet for virksomheder fortsætter med at modnes med værktøjer som IBM API Connect, Triton fra Joyent, N|Solid fra NodeSource, Red Hat OpenShift, Trace fra RisingStack og andre.
Dette indlæg er en del af vores serie “The Good and the Bad”. For mere information om fordele og ulemper ved de mest populære teknologier, se de andre artikler fra serien:
Det gode og det dårlige ved Xamarin Mobile Development
Det gode og det dårlige ved JavaScript Full Stack Development
Det gode og det dårlige ved ReactJS og React Native
Det gode og det dårlige ved Swift Programmeringssprog
Det gode og det dårlige ved .NET Framework Programmering
Det gode og det dårlige ved Angular Development
Det gode og det dårlige ved Selenium Test Automation Tool
Det gode og det dårlige ved Android App Development