Lästid: 13 minuter
Som det mest populära programmeringsspråket är JavaScript också en av de mest universella teknikerna för mjukvaruutveckling. Traditionellt används det som ett verktyg för frontendutveckling på webben, men det har också blivit ett viktigt verktyg för mobilutveckling över plattformsgränserna som en grundläggande teknik för ett stort antal plattformar, t.ex. Apache Cordova/PhoneGap, React Native, NativeScript, Appcelerator Titanium.
Men tillämpningsområdena för JavaScript slutar inte här. På senare tid har det varit mycket snack om användningen av JavaScript för serverbaserad programmering. Ett av verktygen som indikerade detta skifte inom webbutveckling var Node.js.
- Vad är Node.js?
- Fördelarna med Node.js
- ⊕ Robust teknikstack
- ⊕ Snabb behandling och händelsebaserad modell
- ⊕ Skalbar teknik för mikrotjänster
- ⊕ Ett rikt ekosystem
- ⊕ Starkt företagsstöd
- ⊕ Sömlöst JSON-stöd
- Nackdelarna med Node.js
- Θ Prestandaflaskhalsar med tunga beräkningsuppgifter
- Θ Callback hell issue
- Θ Omognad av verktyg
- Θ Växande efterfrågan på erfarna yrkesverksamma
- Hur man lär sig Node.js
- Node.js vs Ruby on Rails vs Django vs Symfony
- Få Node.js att lysa
Vad är Node.js?
Node.js är faktiskt inte ett ramverk eller ett bibliotek, utan en körtidsmiljö, baserad på Chromes V8 JavaScript-motor.
Tekniken introducerades för första gången 2009 av Ryan Dahl på den årliga europeiska JSConf och blev genast erkänd som ”den mest spännande enskilda programvaran i det nuvarande JavaScript-universumet”.
Som ett projekt med öppen källkod sponsrades Node.js av Joyent, en leverantör av lösningar för molntjänster och webbhotell. Företaget investerade i ett antal andra tekniker, t.ex. ramverket Ruby on Rails, och tillhandahöll hostingtjänster till Twitter och LinkedIn. Det senare blev också ett av de första företagen som använde Node.js för sin backend för mobilapplikationer. Tekniken antogs senare av ett antal teknikledare, såsom Uber, eBay, Walmart och Netflix, för att nämna några.
Det var dock inte förrän nyligen som det breda antagandet av JavaScript på serversidan med Node.js började. Intresset för den här tekniken toppade 2017, enligt Google Trends, och är fortfarande stort.
Node.js nedladdningar. Installera Long-Term Support och de senaste versionerna av Node.js för Windows och MacOS här. En påminnelse – npm distribueras med Node.js out-of-the-box.
Dokumentation. Hitta dokumentationen och guider för att komma igång på länken.
Node.js IDEs . Nästan alla populära kodredigerare har stöd och plugins för JavaScript och Node.js, så det spelar bara roll hur du anpassar ditt IDE till dina kodningsbehov. Men många utvecklare lovordar starkt specialverktyg från VS Code, Brackets, Atom och WebStorm.
Frameworks . Att använda middleware över renodlad Node.js är en vanlig metod som gör utvecklarnas liv enklare. Vi har en separat artikel som jämför populära Node.js-frameworks, där vi tittar på Express.js, Meteor, Sales.js, Koa.js, Keystone.js och Loopback.js.
För fler verktyg för JavaScript-ekosystemet som används tillsammans med Node.js, se den dedikerade artikeln.
Node.js styrkor och svagheter gör att det är föremål för en hetsig diskussion. För att ställa saken till rätta har vi analyserat båda – Node.js fördelar och nackdelar – i ett försök att ta reda på vilka projekt som kan dra nytta av detta teknikval. Så varför använda Node.js?
En snabb förklaring av vad Node.js är (prenumerera om du vill ha mer videoinnehåll)
Fördelarna med Node.js
⊕ Robust teknikstack
JavaScript har visat sig vara en obestridd ledare bland de mest populära programmeringsspråken. Node.js har i sin tur blivit ett fristående namn i branschen. Med totalt 368 985 988 nedladdningar och över 750 nya bidragsgivare enligt Node-by-numbers report 2018 verkar projektet vara starkare än någonsin.
Användning av Node.js för backend får du automatiskt alla fördelar med fullstack JavaScript-utveckling, t.ex:
- bättre effektivitet och övergripande utvecklarproduktivitet
- koddelning och återanvändning
- hastighet och prestanda
- lätt kunskapsdelning inom ett team
- ett enormt antal kostnadsfria verktyg
Följaktligen är ditt team mycket mer flexibelt, utvecklingen är mindre tidskrävande och som ett resultat får du snabb och pålitlig programvara. Utvecklare som är utbildade i frontend JavaScript kan börja programmera serversidan med minsta möjliga ansträngning. Med samma språk på båda sidor kan du återanvända kod på frontend och backend genom att paketera den i moduler och skapa nya abstraktionsnivåer.
Trots den allmänna uppfattningen är du som fullstackutvecklare inte på något sätt begränsad till den traditionella MEAN-stacken (MongoDB, Express.js, AngularJS och Node.js). Det enda måste i detta fall är Node.js (det finns inget alternativ i JavaScript för backend-programmering). Resten av tekniken inom denna stack är valfri och kan ersättas med några andra verktyg som ger liknande funktionalitet (läs om alternativen i vår separata artikel).
⊕ Snabb behandling och händelsebaserad modell
Node.js är snabb; det är inte en myt. Ta en titt på prestandatesterna från toptal.com som jämför hur GO, PHP, Java och Node.js hanterar samtidiga förfrågningar. Det finns ett par anledningar till att Node.js visar sådana resultat:
V8-motor. Den motor som används i Node.js implementering utvecklades ursprungligen för webbläsaren Chrome. Chrome’s V8 är skriven i C++ och används för att kompilera funktioner som är skrivna i JavaScript till maskinkod, och den gör jobbet med en imponerande hastighet. Det är bara att kolla prestandanivåerna i V8:s blogg. Tack vare att Google investerar kraftigt i sin motor visar V8 prestandaförbättringar varje år, och Node.js drar nytta av alla dess fördelar.
Non-blocking Input/Output och asynkron hantering av förfrågningar gjorde att Node.js kunde behandla förfrågningar utan fördröjningar. I samband med backend förutsätter synkron behandling att koden exekveras i en sekvens. Varje begäran blockerar alltså en tråd, vilket gör att andra begäranden måste vänta på att den ska avslutas. Asynkron behandling gör det möjligt att behandla förfrågningar utan att blockera (non-blocking I/O) tråden. Så när en begäran har behandlats kan den skicka ut en callback och fortsätta att betjäna begäranden. Det hjälper Node.js att utnyttja single threading på bästa sätt, vilket resulterar i korta svarstider och samtidig behandling.
En annan aspekt är den händelsebaserade modellen. När man använder ett gemensamt språk för både klient- och serversidan sker synkroniseringen snabbt, vilket är särskilt användbart för händelsebaserade tillämpningar i realtid. På grund av dess asynkrona, icke-blockerande, enkeltrådade natur är Node.js ett populärt val för onlinespel, chattar, videokonferenser eller andra lösningar som kräver ständigt uppdaterade data.
Exemplen talar för sig själva: många ledande företag bytte teknik för att utveckla Node.js applikationer och märkte betydande förbättringar – PayPal, till exempel, märkte en 35-procentig minskning av svarstiden sedan de övergick från Java.
⊕ Skalbar teknik för mikrotjänster
Då det är ett lättviktigt teknikverktyg är det ett utmärkt val att använda Node.js för mikrotjänstarkitektur. Denna arkitektoniska stil beskrivs bäst av Martin Fowler och James Lewis som ”ett tillvägagångssätt för att utveckla en enda applikation som en svit av små tjänster, som var och en körs i en egen process och kommunicerar med lättviktsmekanismer, ofta ett HTTP-resurs-API.”
Där du delar upp applikationslogiken i mindre moduler, mikrotjänster, i stället för att skapa en enda stor monolitisk kärna, möjliggör du en bättre flexibilitet och lägger grunden för ytterligare tillväxt. Som ett resultat är det mycket lättare att lägga till fler mikrotjänster ovanpå de befintliga än att integrera ytterligare funktioner med den grundläggande app-funktionaliteten.
Monolitisk arkitektur vs. mikrotjänstearkitektur i ett nötskal
Node.js är den teknik som föredras när det gäller att bygga och distribuera ekosystembaserade lösningar för mikrotjänster, enligt Node.js User Survey Report 2017. Ungefär hälften av de tillfrågade använder mikrotjänstrelaterad teknik (nämligen Docker, den ledande plattformen för containerisering av programvara) för att bygga Node.js-webbappar:
Procentuell andel utvecklare som använder Docker-containerisering med Node.js
Nyare resultat visar att mikrotjänstrelaterade tekniker som Docker och Kubernetes upplevde en ökning av användningen under 2018, eftersom den här arkitekturstilen bara blir mer populär. Med varje mikrotjänst som kommunicerar med databasen direkt genom strömmar möjliggör en sådan arkitektur bättre prestanda och snabbare tillämpning. En match made in heaven stöds av två ramverk som används i stor utsträckning för mikrotjänstarkitektur. Ramverket Express listar IBM och Uber bland sina användare, medan restify används av npm och Netflix.
Som ett exempel på live-implementering kan Walmarts övergång till mikrotjänstarkitektur med Node.js resulterade i följande omedelbara fördelar:
- Overnight 20 procents konverteringstillväxt i allmänhet och 98 procents konverteringstillväxt för mobiler
- Hundra procents drifttid på Black Friday (hanterade över 500 miljoner sidvisningar)
- Sparande av upp till 40 procent på hårdvara och 20-50 procent på den totala driften
Ett annat lysande exempel på hur Node.js kan överträffa konkurrenterna när det gäller prestanda är fallet med GoDaddy. När företaget körde reklamkampanjen för SuperBowl kunde de hantera 10 000 förfrågningar per sekund utan driftstopp och använde bara 10 procent av hårdvaran tack vare Node.js.
⊕ Ett rikt ekosystem
Ett ord – npm, en standardpakethanterare för Node.js, fungerar också som en marknadsplats för JavaScript-verktyg med öppen källkod, vilket spelar en viktig roll för den här teknikens frammarsch. Med cirka 836 000 bibliotek tillgängliga i npm-registret i dagsläget, och över 10 000 nya som publiceras varje vecka, är Node.js-ekosystemet ganska rikt. Samma statistik pekar på att 97 procent av moderna webbapplikationer består av npm-moduler. Och det är ett bevis på dess obestridliga popularitet bland utvecklare.
Med ett så stort utbud av kostnadsfria verktyg som är tillgängliga med några få klick finns det en enorm potential för användningen av Node.js. Samtidigt åtnjuter programvara med öppen källkod en växande popularitet eftersom den gör det möjligt att bygga nya lösningar som minskar de totala utvecklingskostnaderna och tiden till marknaden.
Som nämnts ovan stöddes utvecklingen av Node.js av Joyent. År 2015 skapades Node.js Foundation för att ”möjliggöra en utbredd användning och hjälpa till att påskynda utvecklingen av Node.js”. IBM, Microsoft, PayPal, Fidelity och SAP blev grundande medlemmar i organisationen.
Listan över organisationer som använder Node.js i produktion växer ständigt. Den omfattar för närvarande nästan trehundra välkända företag, till exempel PayPal, Medium, Trello, Uber och Zendesk.
Varje få open source-projekt har någonsin haft ett så starkt stöd från världens ledande företag. Och det förutspår att Node.js har en enastående potential.
⊕ Sömlöst JSON-stöd
Och även om andra backend-teknologier som PHP och Ruby on Rails kan använda JSON-formatet för kommunikation, gör Node.js det utan att konvertera mellan binära modeller och använder JavaScript. Detta är särskilt praktiskt när du behöver bygga RESTful API:er för stöd för NoSQL-databaser, som MongoDB – bokstaven M i MEAN-stacken. Denna sömlösa kommunikation med en av de viktigaste standarderna för dataöverföring är en annan fördel med JavaScript-ekosystemet.
Nackdelarna med Node.js
Θ Prestandaflaskhalsar med tunga beräkningsuppgifter
Den största nackdelen med Node.js även nu är dess oförmåga att bearbeta CPU-bundna uppgifter. Men för att förstå vad som är roten till detta problem behöver vi lite sammanhang. Låt oss börja med grunderna, med själva JavaScript.
Som vi vet är Node.js en körtidsmiljö som utför JavaScript på serversidan. Eftersom JavaScript är ett programmeringsspråk för frontend använder det en enda tråd för att behandla uppgifter snabbt. Trådning krävs inte för att det ska fungera, eftersom uppgifterna i JavaScript är lätta och tar lite CPU i anspråk.
Vid återgång till Node.js vet vi nu varför det anses vara enkeltrådigt: Den bearbetar JavaScript, som är enkeltrådigt. En icke-blockerande input/output-modell innebär att Node.js svarar på klientens anrop för att starta en begäran och bearbetar uppgiften under den tid som den skjuter callback, eftersom uppgiften är klar. Node bearbetar uppgifter asynkront och utför JS-kod på sin enda tråd på händelsebasis. Det är vad som kallas en event-loop.
Problemet uppstår när Node.js tar emot en CPU-bunden uppgift: När en tung förfrågan kommer till händelseslingan, skulle Node.js ställa in all tillgänglig CPU för att bearbeta den först, och sedan svara på andra förfrågningar som står i kö. Det resulterar i långsam bearbetning och övergripande fördröjning i händelseslingan, varför Node.js inte rekommenderas för tunga beräkningar.
Hursomhelst infördes 2018 multitrådning i Node.js som en experimentell funktion med uppdateringen 10.5.0. En ny funktion som kallas worker threads-modul kan användas för att utnyttja ytterligare trådar från en trådpool, för att utföra CPU-bundna uppgifter. Men det kan bara göras på maskiner med flera kärnor, eftersom Node.js fortfarande tillåter dig att använda en kärna för en tråd. Det innebär att tunga parallella processer kan utföras på en annan tråd. Den här funktionen är fortfarande experimentell i Node.js version 12 men har förbättrats avsevärt.
Θ Callback hell issue
På grund av sin asynkrona natur är Node.js starkt beroende av callbacks, de funktioner som körs efter att varje uppgift i kön är klar. Att hålla ett antal köade uppgifter i bakgrunden, var och en med sin callback, kan resultera i det så kallade callbackhelvetet, vilket direkt påverkar kvaliteten på koden. Enkelt uttryckt är det en ”situation där callbacks är inbäddade i andra callbacks flera nivåer djupt, vilket potentiellt gör det svårt att förstå och underhålla koden.”
Exempel på kod med inbäddade callbacks
Bildavsnittskälla: callbackhell.com
Det här anses dock ofta som ett tecken på dålig kodningsstandard och bristande erfarenhet av JavaScript och Node.js i synnerhet. Koden, som representeras ovan, kan refaktoriseras och förenklas, i bara några få steg, vilket visas på callbackhell.com.
Θ Omognad av verktyg
Och även om de centrala Node.js-modulerna är ganska stabila och kan betraktas som mogna, finns det många verktyg i npm-registret som antingen är av dålig kvalitet eller som inte är ordentligt dokumenterade/testade. Dessutom är själva registret inte tillräckligt välstrukturerat för att kunna erbjuda verktygen baserat på deras betyg eller kvalitet. Därför kan det vara svårt att hitta den bästa lösningen för dina syften utan att veta vad du ska leta efter.
Det faktum att Node.js ekosystem är mestadels öppen källkod, vilket också har en inverkan. Även om kvaliteten på kärntekniken i Node.js övervakas av Joyent och andra stora bidragsgivare kan resten av verktygen sakna den kvalitet och de höga kodningsstandarder som fastställts av globala organisationer.
Θ Växande efterfrågan på erfarna yrkesverksamma
Trots den allmänna uppfattningen är inte alla JavaScript-utvecklare också Node.js-utvecklare. Att behärska JavaScript-programmering på serversidan kräver en betydande insats och en viss bakgrund inom backend-utveckling. På grund av en sådan brant inlärningskurva är antalet Node.js ingenjörer betydligt lägre än det totala antalet JS yrkesverksamma.
I takt med att hypen kring Node.js fortsätter att växa ökar efterfrågan på erfarna yrkesverksamma inom detta område.
Det finns en stor kunskapsklyfta mellan ingenjörsstuderande som börjar på sina jobb och arbetsgivarnas behov
Källa: Med miljontals JavaScript-utvecklare där ute kan det vara svårt att hitta en skicklig Node.js-expert för ditt projekt. I det här fallet vill du absolut inte begränsa din sökning till endast ett land. Att hitta tekniska talanger utomlands har länge blivit normen i IT-branschen.
Hur man lär sig Node.js
Här är ditt startpaket för att förstå och arbeta med Node.js.
Torier. Begränsa dig inte till den officiella dokumentationen: Se massor av gratis lektioner på W3Schools, besök internationella workshops från Nodeschool och använd förstås biblioteket med gratis handledningar från freeCodeCamp.
Kurser. Om du är en hängiven student kan du starta en onlinekurs om Node.js: Här finns en på PluralSight och naturligtvis en på Udemy.
Interaktivt lärande. Se gratis och betalda resurser där du kan lära dig Node.js med hjälp av interaktiva lektioner och övningar. En av de mest populära är The Art of Node.
Community. Se den officiella listan över gemenskapsdrivna Node.js-projekt. Ett snabbt tips: Undersök Facebook-grupper och gemenskaper i ditt område/första språk. Och naturligtvis, se Node.js communities på Reddit, en tagg på StackOverflow och ämnet på Quora.
Node.js vs Ruby on Rails vs Django vs Symfony
Det finns inte många tekniker som kan konkurrera med Node.js popularitet eller efterfrågan på marknaden. Om vi tittar på alternativen för serverbaserad programmering ser vi dock minst tre ytterligare lysande stjärnor på himlen. Det är Ruby on Rails, Django och Symfony. Låt oss se om de håller måttet för Node.js fördelar och delar dess nackdelar.
Varje jämförelse mellan Node.js, Rails, Django och Symfony statistik
Källa: StackShare
Ruby on Rails är känt för sitt enkla men bestämda språk och tillgången till gems – Rails eget ekosystem av anpassade paket. Ruby i sig är ett intuitivt och nybörjarvänligt språk med en stödjande och hängiven gemenskap som bidrar med kod till RubyGems. Rails skapades för snabb utveckling och prototyper, även om det framgångsrikt används av varumärken som GitHub, Twitter och Airbnb, vilket bevisar att det finns många olika användningsområden. Dess funktionalitet för datamigrering är särskilt imponerande – till skillnad från Node.js, som använder ytterligare paket, har Rails redan en funktion som gör att du enkelt och konsekvent kan manipulera din databas.
När ska du använda Rails framför Node.js? Rails kan inte konkurrera med Nodes prestanda och skalbarhet, men Rails kan vara ett bättre val för snabb utveckling. Node.js måste visserligen använda moduler från tredje part för att uppnå denna utvecklingshastighet, men Ruby har allt okonventionellt. När det gäller språket har inget verktyg en tydlig fördel – medan Node.js har en hög efterfrågan men ett lågt förslag är Rubys talangpool inledningsvis mindre.
Django är ett webbramverk på Python, det snabbast växande programmeringsspråket enligt uppgifter på StackOverflow. Det marknadsförs som ett verktyg för perfektionister med deadlines och är skapat för att göra applikationer så snabba som möjligt och på det mest strukturerade, säkra och lättförståeliga sättet. Django, tillsammans med Python, anses också ha en mildare inlärningskurva. Medan arbete med Node.js kräver omfattande kunskaper i JavaScript är Django en ”batterier inkluderad” teknik. Den har en inbyggd adminpanel för att enkelt uppdatera och underhålla dina databaser och mallar för att påskynda ditt arbete.
När ska du använda Django framför Node.js? Jämfört med Node.js är Django ett nybörjarvänligt verktyg. Förutom själva språket finns det ingen egentlig anledning att välja det ena framför det andra. Det är mer en fråga om din bekvämlighet och erfarenhet av antingen JavaScript eller Python än de specifika användningsfallen.
Symfony är ett PHP-ramverk som automatiskt ger det 20+ års dokumentation och ett massivt, aktivt community. Mer än 80 procent av webben drivs av PHP med projekt som Facebook, Baidu eller någon annan webbplats som körs på WordPress. Även om Symfony bara är ett av de PHP-ramverk som finns på marknaden är det imponerande stabilt, skalbart och fungerar bra för storskaliga projekt. Det använder också en templatingmotor Twig som fungerar på samma sätt som många PHP-baserade innehållshanteringssystem.
När ska du använda Symfony framför Node.js? Symfony stöder naturligtvis CMS-funktioner som t.ex. mallar och administratörspaneler, vilket gör det möjligt att driva bloggar, nyhetssajter och e-handelsbutiker. Några exempel är Yahoo Answers, Dailymotion och National Geographic.
Få Node.js att lysa
Oppenbarligen, med alla de listade Node.js-fördelar och nackdelar, är tekniken ingen silverkula. Men det är inte heller Java, .Net Framework eller PHP. Ändå finns det specifika fall där var och en av de uppräknade teknikerna presterar bäst. För Node.js handlar det om realtidstillämpningar med intensiv I/O som kräver snabbhet och skalbarhet.
Det kan handla om sociala nätverk, speltillämpningar, livechattar eller forum samt börsprogram eller annonsservrar, där snabbhet är allt. Node.js är snabb och skalbar och är därför den bästa tekniken för dataintensiva IoT-enheter och IoT-applikationer i realtid.
Node.js gjorde JavaScript till den bästa tekniken för utveckling av webbapplikationer. På grund av sin icke-blockerande arkitektur fungerar Node.js bra för kodning och sändning av video och ljud, uppladdning av flera filer och dataströmning. Det sistnämnda kan vara ytterst användbart för programvara för resebranschen där man behöver hämta data från olika API:er från olika leverantörer.
På senare tid har Node.js använts aktivt i programvara på företagsnivå. Även om det fortfarande finns många diskussioner om detta har många stora företag och globala organisationer, som Capital One och NASA, redan anammat Node.js. Och Node.js ekosystemet för företag fortsätter att mogna med verktyg som IBM API Connect, Triton från Joyent, N|Solid från NodeSource, Red Hat OpenShift, Trace från RisingStack och andra.
Detta inlägg är en del av vår serie ”The Good and the Bad”. För mer information om för- och nackdelar med de mest populära teknikerna, se de andra artiklarna i serien:
The Good and the Bad of Xamarin Mobile Development
The Good and the Bad of JavaScript Full Stack Development
The Good and the Bad of ReactJS and React Native
The Good and the Bad of Swift Programming Language
The Good and the Bad of .NET Framework Programming
Det goda och det dåliga med Angular Development
Det goda och det dåliga med Selenium Test Automation Tool
Det goda och det dåliga med Android App Development