Programmering

Hvad er Node.js? JavaScript-runtime forklaret

Skalerbarhed, ventetid og kapacitet er nøgleindikatorer for webservere. Det er ikke let at holde latenstiden og kapaciteten høj, mens du skalerer op og ud. Node.js er et JavaScript-runtime-miljø, der opnår lav latenstid og høj kapacitet ved at tage en “ikke-blokerende” tilgang til serveringsanmodninger. Med andre ord spilder Node.js ikke tid eller ressourcer på at vente på, at I / O-anmodninger vender tilbage.

I den traditionelle tilgang til oprettelse af webservere, for hver indgående anmodning eller forbindelse til serveren gyder en ny udførelsestråd eller endda gafler en ny behandle til at håndtere anmodningen og sende et svar. Konceptuelt giver dette perfekt mening, men i praksis medfører det en hel del overhead.

Mens du gyder tråde medfører mindre hukommelse og CPU-omkostninger end gafler processer, det kan stadig være ineffektivt. Tilstedeværelsen af ​​et stort antal tråde kan få et tungt belastet system til at bruge dyrebare cyklusser på trådplanlægning og kontekstskift, hvilket tilføjer latens og pålægger grænser for skalerbarhed og kapacitet.

Node.js tager en anden tilgang. Den kører en hændelsessløjfe med en gevind, der er registreret i systemet til at håndtere forbindelser, og hver nye forbindelse forårsager et JavaScript tilbagekaldsfunktion at fyre. Tilbagekaldsfunktionen kan håndtere anmodninger med ikke-blokerende I / O-opkald og kan om nødvendigt gyde tråde fra en pool for at udføre blokerende eller CPU-intensive operationer og for at indlæse balance på tværs af CPU-kerner. Nodes tilgang til skalering med callback-funktioner kræver mindre hukommelse til at håndtere flere forbindelser end de fleste konkurrencedygtige arkitekturer, der skaleres med tråde, herunder Apache HTTP-server, de forskellige Java-applikationsservere, IIS og ASP.NET og Ruby on Rails.

Node.js viser sig at være ret nyttigt til desktop-applikationer ud over servere. Bemærk også, at Node-applikationer ikke er begrænset til ren JavaScript. Du kan bruge ethvert sprog, der sendes til JavaScript, for eksempel TypeScript og CoffeeScript. Node.js inkorporerer Google Chrome V8 JavaScript-motoren, der understøtter ECMAScript 2015 (ES6) -syntaks uden behov for en ES6-til-ES5-spiller, såsom Babel.

Meget af Node's hjælpeprogram kommer fra dets store pakkebibliotek, som er tilgængeligt fra npm kommando. NPM, Node-pakkehåndtering, er en del af standard Node.js-installationen, selvom den har sin egen hjemmeside.

Noget JavaScript-historik

I 1995 oprettede Brendan Eich, dengang en entreprenør til Netscape, JavaScript-sproget til at køre i webbrowsere - på 10 dage, som historien går. JavaScript var oprindeligt beregnet til at aktivere animationer og andre manipulationer af browserdokumentobjektmodellen (DOM). En version af JavaScript til Netscape Enterprise Server blev introduceret kort efter.

Navnet JavaScript blev valgt til markedsføringsformål, da Suns Java-sprog var meget hypet på det tidspunkt. Faktisk var JavaScript-sproget faktisk primært baseret på ordningen og sprogene selv, med overfladisk Java-lignende semantik.

Oprindeligt afviste mange programmører JavaScript som ubrugeligt til "ægte arbejde", fordi dets tolk kørte en størrelsesorden langsommere end kompilerede sprog. Det ændrede sig, da flere forskningsindsatser, der havde til formål at gøre JavaScript hurtigere, begyndte at bære frugt. Mest fremtrædende kan open source Google Chrome V8 JavaScript-motoren, der udfører just-in-time kompilering, inlining og dynamisk kodeoptimering, faktisk overgå C ++ - koden for nogle belastninger og overgår Python for de fleste brugssager.

Den JavaScript-baserede Node.js-platform blev introduceret i 2009 af Ryan Dahl til Linux og MacOS som et mere skalerbart alternativ til Apache HTTP-serveren. NPM, skrevet af Isaac Schlueter, blev lanceret i 2010. En oprindelig Windows-version af Node.js debuterede i 2011.

Joyent ejede, styrede og støttede udviklingsindsatsen for Node.js i mange år. I 2015 blev Node.js-projektet overdraget til Node.js Foundation og blev styret af fondens tekniske styregruppe. Node.js blev også omfavnet som et Linux Foundation Collaborative Project. I 2019 fusionerede Node.js Foundation og JS Foundation til dannelse af OpenJS Foundation.

Grundlæggende Node.js-arkitektur

På et højt niveau kombinerer Node.js Google V8 JavaScript-motoren, en ikke-blokerende hændelsessløjfe med en enkelt tråd og et I / O API på lavt niveau. Den strippede eksempelkode vist nedenfor illustrerer det grundlæggende HTTP-servermønster ved hjælp af ES6-pilfunktioner (anonyme Lambda-funktioner erklæret ved hjælp af fedtpiloperatoren, =>) for tilbagekald.

Begyndelsen af ​​koden indlæser HTTP-modulet, indstiller serveren værtsnavn variabel til lokal vært (127.0.0.1) og indstiller Havn variabel til 3000. Derefter opretter den en server og en tilbagekaldsfunktion, i dette tilfælde en fed pilfunktion, der altid returnerer det samme svar på enhver anmodning: statusKode 200 (succes), indholdstype almindelig tekst og et tekstsvar på ”Hej verden \ n”. Endelig fortæller det serveren at lytte på lokal vært port 3000 (via et stik) og definerer et tilbagekald til at udskrive en logmeddelelse på konsollen, når serveren er begyndt at lytte. Hvis du kører denne kode i en terminal eller konsol ved hjælp af knude kommando og derefter gennemse til localhost: 3000 ved hjælp af en hvilken som helst webbrowser på samme maskine, vil du se "Hello World" i din browser. For at stoppe serveren skal du trykke på Control-C i terminalvinduet.

Bemærk, at hvert opkald, der foretages i dette eksempel, er asynkront og ikke-blokerende. Callback-funktionerne påberåbes som reaktion på begivenheder. Det createServer callback håndterer en klientanmodningshændelse og returnerer et svar. Det Lyt tilbagekald håndterer hører efter begivenhed.

Node.js-biblioteket

Som du kan se på venstre side, figuren nedenfor, har Node.js en lang række funktioner i sit bibliotek. HTTP-modulet, som vi tidligere brugte i prøvekoden, indeholder både klient- og serverklasser, som du kan se i højre side af figuren. HTTPS-serverfunktionaliteten, der bruger TLS eller SSL, lever i et separat modul.

Et iboende problem med en enkeltgevindet hændelsessløjfe er manglen på lodret skalering, da hændelsessløjfe-tråden kun bruger en enkelt CPU-kerne. I mellemtiden udsætter moderne CPU-chips ofte otte eller flere kerner, og moderne serverracks har ofte flere CPU-chips. En applikation med en enkelt gevind drager ikke fuld fordel af 24 plus-kernerne i et robust serverstativ.

Du kan ordne det, selvom det kræver yderligere programmering. Til at begynde med kan Node.js gyde underordnede processer og vedligeholde rør mellem forælder og børn på samme måde som systemet popen (3) opkald fungerer ved hjælp af child_process.spawn () og relaterede metoder.

Klyngemodulet er endnu mere interessant end underordnet procesmodul til oprettelse af skalerbare servere. Det cluster.fork () metode gyder arbejdsprocesser, der deler forældrenes serverporte ved hjælp af child_process.spawn () under dækslerne. Klyngemasteren distribuerer indgående forbindelser mellem sine medarbejdere ved hjælp af som standard en round-robin-algoritme, der er følsom over for arbejdsprocesbelastninger.

Bemærk, at Node.js ikke giver routinglogik. Hvis du vil opretholde tilstanden på tværs af forbindelser i en klynge, skal du opbevare dine session- og loginobjekter et andet sted end medarbejder-RAM.

Node.js-pakkeøkosystemet

NPM-registreringsdatabasen er vært for mere end 1,2 millioner pakker med gratis, genanvendelig Node.js-kode, hvilket gør det til det største softwareregister i verden. Bemærk, at de fleste NPM pakker (i det væsentlige mapper eller NPM-registreringsdatabaseelementer, der indeholder et program beskrevet af en package.json-fil) indeholder flere moduler (programmer, som du indlæser med kræve udsagn). Det er let at forveksle de to udtryk, men i denne sammenhæng har de specifikke betydninger og bør ikke udveksles.

NPM kan administrere pakker, der er lokale afhængigheder af et bestemt projekt såvel som globalt installerede JavaScript-værktøjer. Når den bruges som en afhængighedsmanager for et lokalt projekt, kan NPM i én kommando installere alle afhængighederne i et projekt gennem filen package.json. Når det bruges til globale installationer, kræver NPM ofte systemrettigheder (sudo).

Det gør du ikke har at bruge NPM-kommandolinjen til at få adgang til den offentlige NPM-registreringsdatabase. Andre pakkeforvaltere som Facebooks Garn tilbyder alternative oplevelser på klientsiden. Du kan også søge og søge efter pakker ved hjælp af NPM-webstedet.

Hvorfor vil du bruge en NPM-pakke? I mange tilfælde er installation af en pakke via NPM-kommandolinjen den hurtigste og mest praktiske for at få den nyeste stabile version af et modul, der kører i dit miljø, og det er typisk mindre arbejde end at klone kildelageret og opbygge en installation fra lageret. Hvis du ikke vil have den nyeste version, kan du angive et versionsnummer til NPM, hvilket er især nyttigt, når en pakke afhænger af en anden pakke og muligvis bryder med en nyere version af afhængigheden.

Eksempelvis giver Express-rammen, en minimal og fleksibel ramme til Node.js-webapplikationer, et robust sæt funktioner til opbygning af enkelt- og flersides- og hybrid-webapplikationer. Mens det let klonede Expresscode-lager ligger på //github.com/expressjs/express, og Express-dokumentationen findes på //expressjs.com/, er en hurtig måde at begynde at bruge Express på at installere det i en allerede initialiseret lokal arbejdsudvikling mappe med npm kommando, for eksempel:

$ npm install express - gem

Det -Gemme option, som faktisk er slået til som standard i NPM 5.0 og nyere, fortæller pakkehåndteringen at tilføje Express-modulet til listen over afhængigheder i filen package.json efter installationen.

En anden hurtig måde at begynde at bruge Express på er at installere den eksekverbare generatorudtrykke (1) globalt og brug det derefter til at oprette applikationen lokalt i en ny arbejdsmappe:

$ npm installer -g ekspressgenerator @ 4

$ express / tmp / foo && cd / tmp / foo

Med det opnåede kan du bruge NPM til at installere alle de nødvendige afhængigheder og starte serveren baseret på indholdet af package.json-filen oprettet af generatoren:

$ npm installation

$ npm start

Det er svært at vælge højdepunkter ud af de millioner plus-pakker i NPM, men et par kategorier skiller sig ud. Express er det ældste og mest fremtrædende eksempel på Node.js-rammer. En anden stor kategori i NPM-lageret er JavaScript-udviklingsværktøjer, herunder browserify, en modulbundler; bower, browser-pakkehåndtering; grunt, JavaScript task runner; og gulp, streaming build-systemet. Endelig er en vigtig kategori for Enterprise Node.js-udviklere databaseklienter, hvoraf der er mere end 8.000, inklusive populære moduler som redis, mangoose, firebase og pg, PostgreSQL-klienten.

For at sammenfatte er Node.js et JavaScript-runtime-miljø på tværs af platforme til servere og applikationer. Det er bygget på en enkelt tråd, ikke-blokerende begivenhedssløjfe, Google Chrome V8 JavaScript-motoren og et I / O API på lavt niveau. Forskellige teknikker, herunder klyngemodulet, tillader Node.js-apps at skalere ud over en enkelt CPU-kerne. Ud over dets kernefunktionalitet har Node.js inspireret et økosystem med mere end en million pakker, der er registreret og versioneret i NPM-arkivet og kan installeres ved hjælp af NPM-kommandolinjen eller et alternativ såsom Garn.

$config[zx-auto] not found$config[zx-overlay] not found