Den nyeste store utgivelsen av node.js bringer mange betydelige forbedringer til JavaScript-fellesskapet, inkludert en oppdatert JavaScript-motor, NPM-versjon 5, Googles V8, Node.js API, Async_hooks, en WhatWG URL Parser, mer sikre buffere og mer. Her oppdaterer vi deg på disse funksjonene og de andre viktigste aspektene ved denne utgivelsen.
Node.js 8 er utgitt under kodenavnet Carbon, og er tilgjengelig nå fra Node.js Site. . Det vil bli aktivt jobbet på i ytterligere 18 måneder (ingen nye funksjoner, bare feilrettinger, sikkerhetsforbedringer og NPM-oppdateringer), før du går inn i vedlikeholdsmodus. Som med tidligere utgivelser, vil utgivelser på vedlikeholdsmodus bare motta kritiske sikkerhetsoppdateringer og feilrettinger.
Det er trygt å si at siden node.js har eksistert, er dette en av de største oppdateringene som kjøretiden noen gang har mottatt - det endrer hvordan innfødte tillegg er skrevet og gir også flere sikkerhets- og ytelsesforbedringer.
RisingStack. Har vært hjelpende selskaper lykkes med node.js i fire år med opplæring, rådgivning eller utvikling. En av de største kampene vi hadde var å legge til innfødte avhengigheter til prosjekter.
Før node.js 8, hvis applikasjoner var avhengige av moduler med innfødt kode, når store nye node.js-versjoner ankom, som en applikasjonsinstrumenter måtte du kompilere avhengighetene dine. Hvis du var heldig, jobbet de først.
Denne prosessen ble gjort mulig med de enorme arbeidsmodulene vedlikeholderne som ble satt i å gjøre modulene på tvers av inkompatible node.js-versjoner, hovedsakelig ved hjelp av en modul kalt Nan (node.js Native Abstraksjoner).
Denne prosessen er langt fra ideell, da mange selskaper ikke klarte å få sine avhengigheter oppdatert hvis de ikke kunne bli samlet, og det legger også en stor ekstra arbeidsbelastning på modulableder. For å løse dette problemet ble noden.js API (eller N-API) introdusert.
Noden.js API er en av de viktigste forbedringene av node.js 8. Det bringer et veldefinert ABI (søknad binært grensesnitt) til node.js for å gjøre sin virtuelle maskin agnostic. Dette betyr at innfødte moduler ikke bare fungerer med forskjellige node.js-versjoner ved hjelp av Googles V8 JavaScript-motor, men med Microsofts Chakra også.
For nå er N-API i en eksperimentell stat, noe som betyr at betydelige endringer kan skje med både implementeringen og API. Med dette nevnte, oppfordres Native Module-vedlikeholdere til å prøve det nye grensesnittet og gi tilbakemelding.
Hvis du er en modul vedlikeholder, kan du slippe en N-API-versjon av modulen din parallelt med hovedmodulversjonen. For å gjøre det, er den offisielle anbefalingen å publisere en versjon av modulen din med N-API-taggen til NPM.
For å publisere en N-API-versjon, må du:
På denne måten sikrer du at N-API-versjonen ikke blir den nyeste versjonen, så hvis noen installerer modulen, får de som standard den ikke-N-API-versjonen.
Garn, pakkeforvalter laget av ingeniører av Facebook, ble utgitt i oktober 2016. Det prøvde å ta opp noen mangler i den offisielle NPM-klienten, hovedsakelig ved å bli mer formidlet og deterministisk. De fleste av disse innovasjonene er også omtalt i NPM 5.
Akkurat som garn, NPM 5 introduserte en låsemekanisme - når du installerer en ny avhengighet av prosjektet, blir det lagt til automatisk ikke bare for pakke.json. , men en ny fil kalt pakke-lock.json. også.
Du kan spørre hva forskjellen er mellom pakke-lock.json. og npm-shrinkwrap.json. , som NPM-Shrinkwrap har vært i NPM siden for alltid? Lang historie kort, de er i hovedsak det samme, men pakke-lock.json. blir automatisk opprettet.
Deres formål er å beskrive nøyaktig hvilken avhengighetstreet NPM må opprette for pakken din. Hvis du har begge, npm-shrinkwrap. vil ha forrang. Basert på NPMs anbefaling, bør du bruke npm-shrinkwrap.json. Hvis du vil publisere den, så vil modulen forbrukere bruke den også. På den annen side bør du bruke pakke-lock.json internt - selv sjekket inn i repositories.
Men forbedringer i NPM 5 er ikke stoppet med å legge til en låsfil - med den nye versjonen, lagres alle modulene du installerer automatisk, og de vil bli lagt til begge til din pakke.json. og pakke-lock.json. fil.
Måten NPM-skriptarbeid har også endret seg litt. Først av alt, forhåndsinstallerte skript kjører nå før alt annet, slik at de kan endre node_modules katalogen før CLI faktisk leser det. Foruten dette har to nye skript blitt lagt til - Prepack og Postpack. De begge kjører på NPM Pack og NPM publiserer også, men ikke på NPM Installer.
I hjertet av node.js er JavaScript-motoren som tolker JavaScript-koden, skaper bytecode fra den og lar søknaden din kjøre. Med den nye noden.js 8-utgivelsen, ble dette også oppdatert.
Med den oppdaterte V8-motoren blir store ytelsesforbedringer introdusert - men enda viktigere, det er garantert å ha et fremdrifts-kompatibelt programbinært grensesnitt. Dette betyr at node.js vil kunne oppdatere V8-motoren uten en stor node.js utgivelse.
Dette er avgjørende, da de nyere versjonene av V8-motoren vil introdusere en ny kompilatorrørledning, som vil introdusere ytterligere ytelsesforbedringer til node.js. Denne oppdateringen var så viktig at det var grunnen til at den opprinnelige node.js 8 utgivelsesdatoen ble utsatt.
Den nåværende rørledningen er altfor komplisert, og introduserer nye språkfunksjoner betyr vanligvis å berøre flere deler av rørledningen. Med den nye rørledningen blir det mye enklere.
Tenning, den nye tolk og turbofan, den nye optimaliserende kompilatoren, har vært i utvikling i nesten tre og et halvt år. De er grunnlaget for hvilke nye språkfunksjoner som skal bygges på. De inkluderer opplevelsen som V8-teamet på Google samlet inn fra Måling av Real-Life JavaScript-applikasjoner.
For bedre å forstå hva Async kroker er, la oss ta et skritt tilbake og få tak i fortsettelse-lokal lagring først. De jobber som trådlokal lagring i gjenget programmering, men i node.js bruker det tilbakeringinger for å passere ned kontekst.
Tenk deg at du skriver et program som henter et produkt fra databasen, så senere vil du sende den ut i HTML-svaret ditt:
CONST CREATENAMESPACE = KRAV ('Fortsatt-Local-Storage'). CreateAmesPace
CONT SESSION = CREATENAMESPACE ('MY-APP-SOIEST')
const db = krever ('./ db.js')
Funksjon onrequest (Valg, Neste) {
db.fetchuserbyid (alternativer.id, funksjon (feil, bruker) {
hvis (feil) {
Returner neste (feil)
}
SESSION.SET ('User', bruker)
neste ()
})
Senere, hvis du vil få tilgang til brukerobjektet, er alt du trenger å gjøre det fra den lokale lagringen:
CONT GETNAMESPACE = KRAV ('Fortsatt-Local-Storage'). Getnamespace
const Session = Getnamespace ('My Session')
const Render = krever ('./ Render.js')
Funksjon Finish (Svar) {
const user = session.get ('bruker')
Render ({Bruker: Bruker}). Pipe (respons)
}
Denne teknikken brukes i stor grad av applikasjonsytelsesovervåkningsleverandører, for eksempel spor av RisingStack, for å holde gjennomføringskontekst og samle overvåkingsinformasjon fra produksjonssystemer.
Med Async-kroker flyttes en lignende funksjon til noden.js kjernen - det bidrar til å spore asynkrone forespørsler og håndtere gjennom deres livssyklus. De async_hooks. Modulen gir en API for å registrere tilbakeringinger som sporer levetiden til asynkrone ressurser som er opprettet i en node.js-applikasjon.
Før node.js 8, hvis du ønsket å bruke kjernemodulene i et program som bruker løfter, måtte du manuelt vikle kjernemodulene slik at de kunne brukes på samme måte. Det så på noe slikt:
const fs = krever ('fs')
Funksjon ReadFilePromise (... args) {
returnere nytt løfte ((løse, avvise) = & gt; {
fs.readfile (... args, (feil, resultat) = & gt; {
hvis (err) {
returnere løse (ERR)
}
Løs (resultat)
})
})
}
ReadFilePromise ('./ Package.Json', 'UTF-8')
.Den ((res) = & gt; console.log (res))
.Catch ((err) = & gt; console.log (err))
Med node.js 8 blir en ny hjelperemetode lagt til Utilkjernemodulen, Util.Promisify. Det tillater standard node.js tilbakekallingsstil APIer som skal innpakes i en funksjon som returnerer løfter.
Ved hjelp av denne funksjonen, er ovennevnte kastet forenklet og blir dette:
CONST FS = KRAV ('FS')
const Promisify = krever ('Util'). Promisify
ReadFilePromise = Promisify (fs.readfile)
ReadFilePromise ('./ Package.Json', 'UTF-8')
.Den ((res) = & gt; console.log (res))
.Catch ((err) = & gt; console.log (err))
Før node.js versjon 8 ble ikke buffere tildelt ved hjelp av den nye bufferen (nummer) konstruktøren ikke initialiserer minnespaken med nuller. Som et resultat kan nye bufferinstanser inneholde sensitiv informasjon, noe som fører til alvorlige sikkerhetsproblemer - selv populære moduler som mongoose, WS eller forespørselsmodulen ble påvirket.
Men hvordan kom vi dit? Når JavaScript ble flyttet fra nettleseren til serversiden, var det behov for rask og enkel databehandling - slik at bufferkassen ble lagt til. Buffer er et mutabelt utvalg av binære data. Når det brukes sammen med konstruktøren som ber om størrelsen på den nye bufferen, reserverte det bare minneplassen, men rente ikke den.
Siden serveren din kan tjene flere brukere samtidig (i motsetning til nettleseren din), er det mulig at det ferske allokerte minneområdet inneholder sensitiv informasjon fra andre brukere (til og med passord!), Og kan potensielt bli utsatt for en angriper.
Selv om det var en forsettlig beslutning om å øke ytelsen til den nye bufferopprettelsen, for de fleste av oss, var det ikke den tilsiktede bruken - selv om den ble dokumentert. På grunn av dette, starter med node.js 8, vil buffere tildelt ved hjelp av ny buffer (tall) eller buffer (nummer) automatisk fylles med nuller.
Før node.js 8, hvis du ønsket å feilsøke noden.js-applikasjonene, var en av de enkleste løsningene å starte den innebygde debuggeren, ved hjelp av Node Debug index.js. Med node.js 8 blir dette fjernet og erstattet av node-inspektør. Du kan fortsatt bruke CLI-debuggeren, men den vil bli fjernet kort tid.
Fra nå av, bør du bruke node --Ivpect index.js. eller node --Ispekt-BRK-index.js Hvis du vil at debuggeren skal sette et bruddpunkt på den første linjen i applikasjonen. Når du har kjørt den, vil du motta en websocket-lenke som Google Chrome kan bruke til å koble dens debugger.
Du burde gå over til krom: // inspisere I din Chrome-nettleser, og det vil automatisk gjenkjenne den løpende node.js-programmet, slik at du kan koble til. Etter at du har koblet til prosessen, vil du få Chrome debugger for å inspisere din løpende node.js-applikasjon.
Tidligere, hvis du ønsket å sjekke en feil du mottok i kjøretiden og handle tilsvarende, måtte du i de fleste tilfeller sjekke feilmeldingen. Dette var feilaktig, da feilmeldinger kan ha endret seg med nye node.js-versjoner.
Med node.js 8 har statiske feilkoder blitt tildelt de fleste feilene - det er fortsatt en arbeidskraft, men når den er ferdig, vil disse feilkoderne ikke endres, selv om meldingen i feilen gjør det .
For eksempel, den nylig introduserte WhatWG URL API. vil kaste AN. Err_invalid_url. Feil i følgende snippret, da parameteren ikke er en gyldig nettadresse:
CONT URL = KRAV ('URL'). URL
const myurl = ny url ('/ foo')
Som du kan se, har utgivelsen av node.js 8-oppdateringen brakt mange nye og spennende forbedringer i JavaScript-fellesskapet. For å begynne å eksperimentere med alle disse nye funksjonene selv, gå over til nodejs.org. , last ned noden.js 8 binær og begynn å spille med ditt nye verktøysett!
Denne artikkelen opprinnelig dukket opp i Net Magazine. utgave 296. Kjøp det her .
Relaterte artikler:
Opprinnelsen til Pin-Up Art kan spores tilbake til slutten av 1800-tallet, men det ble mer utbredt på 1940-tallet og 1950-tallet, som ofte vises på plakater og kalendere. Definere egenskape..
[1. 3] Denne opplæringen vil vise deg hvordan du lager en tegneserie. Selv om vi bruker Clip Studio Paint. Her er ..
[1. 3] Denne trinnvise veiledningen er satt til å avsløre hvordan man skal gå om etableringen av realistiske skyer. Denne oppl�..
Adobe oppfordret meg med å skape en illustrasjon for å uttrykke begrepet multilokalisme, og over kan du se mitt svar. I denne opplæringen går jeg gjennom min kreative prosess ved hjelp av..
[1. 3] Med et stort utvalg av fryktelige skapninger og tegn å lage, jobber med spillverksted for å oversette Warhammer miniatyre..
[1. 3] Side 1 av 2: Komme i gang med Cinema 4D Komme i gang med Cinema 4D ..
[1. 3] Fem fremragende artister demonstrerer triksene i deres handel, og forklarer hvordan man lager urbane, sci-fi, naturlige, st..
[1. 3] Når du jobber i et lite lag, har det en tendens til å være vanskelig å skrive og vedlikeholde separat kode for Android,..