Kontakt os

Jeg ved ikke, om du er opdateret med nyhederne, men Deno er den nye stjerne på Javascript økosystem - nogle mennesker siger endda, at det vil dræbe Node. Nu hvor Deno er frigivet, er det tid til at finde ud af, om det kan være en værdig konkurrence for Node. Nysgerrig? Lad os starte!
I dette indlæg vil vi tage et kig på Deno k Node og sammenlign dem for at hjælpe med at forstå, hvad de har til fælles, og hvad der adskiller dem med hensyn til:
Jeg håber, at vi kan hjælpe dig med at få et klart billede af, hvad der er bedst for dig.
Ved Imaginær sky, vi har brugt Node til blandt andet at bygge API'er, betjene frontend og til at bygge mikroservicearkitekturer.
Node et JavaScript-miljø på serversiden baseret på Googles V8 JavasScript-motor, oprettet af Ryan Dahl i 2009 og var stærkt fokuseret på hændelsesdrevne HTTP-servere. Det bragte JavaScript på serversiden til mainstream, og det var dette JavaScript overalt paradigme, der tillod udvikling af webapplikationer ved hjælp af et enkelt programmeringssprog.
Spol frem til 2018 holdt Ryan Dahl et foredrag i JSconf EU med titlen Designfejl i node - også kendt som „10 ting jeg fortryder om Node.js“. I sin tale beskriver han sine beklagelser vedrørende nogle af de valg, der blev truffet i udviklingen af Node. Som han påpeger, var JavaScript på det tidspunkt, hvor Node begyndte at blive udviklet, et meget andet sprog, og det manglede nogle af de mest moderne funktioner:
I betragtning af at mange af de designfejl, der blev nævnt under foredraget, ikke kunne løses uden at omskrive kernen i Node og dermed afslutte understøttelsen af ældre applikationer, besluttede Ryan at introducere Deno.
Først og fremmest er det ikke en fork af Node - det er en ny implementering baseret på moderne funktioner i JavaScript-sproget, selvom navnet er et anagram af Node. Deno er en sikker runtime til JavaScript og TypeScript baseret på Googles V8, og dens kerne er bygget i Rust (Node's implementering er i C ++). Den bruger Tokio til sin begivenhedsløjfe, som også er skrevet i Rust.
For andre installationsmetoder skal du kontrollere officiel dokumentation.
(På det tidspunkt, jeg skriver dette, er den tilgængelige Deno-version 1.46.3).
Deno leveres som en enkelt eksekverbar fil uden afhængigheder og leveres med nogle indbyggede værktøjer til at gøre udvikleroplevelsen lettere:
Alle disse værktøjer er standardiseret til Deno, så du er sikker på, at de får fuld support.
Da Deno er en enkelt eksekverbar fil, kan Deno opdatere sig selv via: deno opgradering eller deno opgradering - version <new_version>.
Dette henter den angivne version (eller nyeste, hvis uspecificeret) og erstatter din nuværende eksekverbare version med den.
Det er muligt at have flere versioner installeret ved hjælp af versionshåndtering.
For Node er versionshåndterere også ansvarlige for at opdatere/installere nye versioner, f.eks nvm.
Deno er baseret på TypeScript, så det understøtter det ud af boksen uden behov for at installere eller konfigurere værktøjer, som at tilføje en tsconfig.json konfigurationsfil i Node. Selvom det leveres med en standardkonfigurationsfil, er det muligt at tilføje din egen deno run -c tsconfig.json [fil-til-køre.ts].
Da TypeScript kun er et supersæt af JavaScript, kan Deno også køre det.
Hvis du vil køre et script, kan du oprette en hello-world.ts fil med uddraget ovenfor og kør det ved at udføre: deno run hello-world.ts. Dette bruger Microsofts TypeScript-kompilator til at kontrollere typer og producere JavaScript og derefter køre scriptet.
Lige nu antager Denos team, at den tid, det tager V8 at analysere TypeScript sammenlignet med JavaScript, er meget højere, og det er en løbende opgave for at portere TypeScript Compiler til Rust.
Et af hovedfokuserne er sikkerhed. Deno er sikret som standard, og koden udføres i en sikker sandkasse, der replikerer den samme tilladelsesmodel, som browseren implementerer. Medmindre det er angivet, har den ingen adgang til filsystemet, netværks- eller miljøvariablerne, og adgangstilladelser skal udtrykkeligt overføres til Deno-processen på kommandolinjen.
Hvis du forsøger at køre det forrige uddrag:
For at undgå fejlen skal du tilføje --tillad-env flag for at kunne få adgang til miljøvariablerne:
Der er mulighed for at tillade al adgang --tillad-alle eller -EN, men dette anbefales ikke.
Diverse er Node meget permissiv, du har fuld adgang til stort set alt:
Deno bruger ES-moduler, det officielle standardformat til at pakke JavaScript-kode, introduceret i ES6/ES2015:
Da Node blev oprettet, havde JavaScript ikke sit eget modulsystem, så det brugte CommonJS-standarden:
Lige nu har Node kun eksperimentel støtte for ES-moduler, og du skal foretage nogle konfigurationer/ændringer til eksisterende filer.
Selvom Deno generelt ikke er kompatibel med Node-pakker, leverer Deno et Node Compatibility Library, der giver os mulighed for at bruge nogle NPM-pakker, der ikke bruger ikke-polyfyldte Node API'er.
En af de største fordele er, at der bruges en standard browserkompatibel protokol til indlæsning af moduler, så du kan importere moduler direkte via URL'er, hvilket har en enorm indflydelse på den måde, vi håndterer moduler på.

I betragtning af at Deno bruger webadresser til indlæsning af moduler, påtager det sig eksplicit rollen som både runtime og pakkehåndtering. Det er ikke afhængigt af en centraliseret server til distribution af moduler. Det betyder, at det kræver fuldt kvalificerede modulnavne, herunder udvidelsen (eller en server, der leverer den korrekte medietype).
Du kan importere moduler direkte og bruge afhængigheder som kode:
For at køre det forrige uddrag kan du bare udføre: deno køre --allow-net http-server.ts. Der er ingen installation at gøre på forhånd, fordi Deno downloader og cacher et modul i en global mappe første gang dets URL findes i et script. Modulens cache har to hovedmål:
—genindlæse flag, hvis du vil nulstille cachen manuelt.
Alle moduler og filer, der er indlæst fra eksterne URL'er, bortset fra at være cachelige, er også beregnet til at være uforanderlige.
Som du sikkert har bemærket, kræver import fuldt kvalificerede modulnavne, inklusive udvidelsen. Desuden har Deno ingen „magisk“ modulopløsning. I stedet angives importerede moduler som filer (herunder udvidelser) eller fuldt kvalificeret URL-import.
Nodeanvendelser npm som pakkehåndtering til at installere og administrere tredjepartspakker, der er anført i NPM-registreringsdatabasen. Dette gør linkning til eksterne biblioteker fundamentalt centraliseret gennem NPM-registreringsdatabasen. Når du installerer en pakke i dit projekt med NPM/Yarn, er en pakke.json fil bruges til at angive pakkenavnet og accepterede versioner, og pakkerne downloades til en node_modules mappe inde i dit projekt. Som et resultat, node_moduler mapper bliver enorme, da moduler kræver specifikke versioner af andre moduler, og de vil blive replikeret i hver enkelt projektmappe, det kræver.
Deno bruger ikke NPM til afhængighedsstyring, så nejpakke.jsonog nejnode_moduler
Deno leverer kuraterede standardmoduler af hjælpere og hjælpeprogrammer til almindelige opgaver, der revideres af Deno Core-teamet.
Disse moduler vil blive mærket i overensstemmelse med Deno-udgivelser. Hvis du ikke angiver et tag, linkes automatisk til mastergrenen, så det anbefales, at du linker til taggede versioner for at undgå utilsigtede opdateringer og ødelæggende ændringer.
Hvis du vil låse en bestemt modulversion, kan du bruge en låse.json fil, for at kontrollere modul integritet.
Deno giver en hostingtjenestens integritet til Deno-scripts. Det cacher udgivelser af open source-moduler, der er gemt på GitHub, og serverer dem på et domæne, der er let at huske.
For eksempel, hvis du leder efter et datoværktøj, kan du bruge https://deno.land/x søgefunktion, der hjælper dig med at finde moduler. Når du har fundet det ønskede modul, i dette tilfælde date-fns, kan du bare importere den korrekte URL i den fil, du bruger den i:
For alle de andre NPM-pakker, hvis de ikke er kompatible med esmodule-import, kan du bruge en tjeneste som JSPM som løser tredjepartsmodulerne og kompilerer CommonJS-modulerne til at fungere som ES-moduler import.
Deno bruger løfter helt ned - alle asynkrone metoder returnerer løfter:
Fra det forrige uddrag kan du se, at Deno understøtter øverste niveau venter. Dette giver os mulighed for at bruge vente-syntaksen i det globale omfang uden at skulle pakke den ind i async-funktionen. For nylig tilføjede Node Node også understøttelse af afventning på øverste niveau.
Længe før Promises eller async/wait blev Node's API til asynkrone operationer designet til at bruge tilbagekald og følge fejltilbagekaldskonventionen:
Selvom Node-udviklere nu har adgang til Promises og syntaksen async/wait, forventer Node's API stadig tilbagekald for at opretholde bagudkompatibilitet.
Sandsynligvis er en stor forskel, at Deno altid dør med det samme på uhåndterede løfter, hvor Node i øjeblikket håndterer afvisninger ved at udsende en forældelsesadvarsel til stderr. Lige nu kører Node en undersøgelse for bedre at forstå, hvordan brugerne håndterer denne.
Udviklingsteamet besluttede også at bruge browser-API'er, hvor det er praktisk at gøre det. På den måde leverer Deno en global vindue objekt og API'er som f.eks AddEventListener, indlæse, aflæsning og hente.
Deno leverer en globalvindueobjekt og API'er som f.eksAddEventListener,indlæse,aflæsningoghente.
Dette betyder, at Deno-programmer skrevet fuldstændigt i JavaScript, som ikke bruger det globale Deno-navneområde (eller funktionstest til det), burde være isomorfe, hvilket betyder, at de vil kunne køres i en moderne webbrowser uden nogen ændring:
Mens vindueobjektet ikke er tilgængeligt i Node, kan du bruge hente hvis du polyudfylder dette eller bruger et tredjepartsbibliotek.
Hvilket er bedst: Deno eller Node? Deno er som standard sikker og understøtter TypeScript uden at have brug for en kompilator, men har et mindre økosystem. Node.js har et stort biblioteksøkosystem og bruges i vid udstrækning, men har historiske sikkerhedssårbarheder. Det „bedste“ valg afhænger af dine specifikke behov og fortrolighed.
Så målet med Deno er ikke at erstatte Node, men at tilbyde et alternativ.
Node har været under udvikling i over et årti, hvilket gør det mere stabilt og kamptestet, hvilket gør det til de facto-standarden for JavaScript på serversiden. Deno har kun været under udvikling i kun to år og fortsætter med at blive forbedret. Deno er blandt andet en fremragende erstatning for hjælpeprogrammer, der normalt er skrevet med bash eller python.
Det afhænger af kravene, men for de fleste Node-applikationer passer Deno muligvis ikke lige nu. En af de største forhindringer at tackle er oprettelse/konvertering af NPM-moduler, der skal bruges sammen med Deno, og dette vil sandsynligvis ændre sig i fremtiden, når Node ES Modules-support bliver mere standard.
Jeg tror dog, vi gradvist vil se Deno blive adopteret mere og mere på grund af dets førsteklasses TypeScript-understøttelse og moderne standardbibliotek. Nodeprogrammerere bør holde øje med Deno og måske prøve at bruge det til nogle sideprojekter.
En ting er sikker, Denos nuværende udvikling skubber JS-serverøkosystemet fremad, og det er en god ting.

Fandt du denne artikel nyttig? Du kan måske også lide disse!

Seniorudvikler hos Imaginær sky, specialiseret i at skabe innovative softwareløsninger, brænder for teknologi og kodningsekspertise.
People who read this post, also found these interesting: