Efter to års udvikling den første betydningsfulde version , en platform for isoleret udførelse af applikationer på JavaScript og TypeScript, som kan bruges til at skabe serverbaserede håndteringsprogrammer. Platformen er udviklet af Ryan Dahl (), skaberen af Node.js. Ligesom i Node.js anvender Deno JavaScript-motoren , som også anvendes i Chromium-baserede browsere. Deno er dog ikke en aflægger af Node.js, men et helt nyt projekt, der er bygget fra bunden. Koden på projektet er under MIT-licensen. Bygningerne til Linux, Windows og macOS.
Den betydelige versionsnummer er relateret til stabilisering af API'et i Deno-navnerummet, som er ansvarligt for interaktionen mellem applikationer og operativsystemet. De softwaregrænseflader, som endnu , er som standard skjult og kun tilgængelige, når de køres i "--unstable"-tilstand. Efterhånden som nye versioner dannes, vil sådanne API'er gradvist blive overført til den stabile kategori. API'et i det globale navnerum, som inkluderer almene funktioner som setTimeout() og fetch(), er så vidt muligt tilpasset API'et i almindelige web-browsere og udvikles i overensstemmelse med webstandarder for browsere. De tilgængelige Rust API'er, som anvendes direkte i platformens kode, samt grænsefladen til udvikling af plugins til Deno runtime, er endnu ikke stabiliserede og fortsætter med at udvikle sig.
De vigtigste motiver bag oprettelsen af den nye JavaScript-platform var ønsket om at rette de konceptuelle fejl, i arkitekturen af Node.js og give brugerne et mere sikkert miljø. For at øge sikkerheden er indpakningen omkring V8-motoren skrevet i Rust, som undgår mange sårbarheder, der opstår ved lavnivå hukommelsesinteraktioner, såsom adgang til hukommelse efter frigivelse, dereferering af nulpegepunkter og buffer-overløb. For at håndtere forespørgsler i ikke-blokerende tilstand anvendes platformen , som også er skrevet i Rust. Tokio muliggør oprettelsen af højtydende applikationer baseret på en begivenhedsdrevet arkitektur, der understøtter multitrådning og behandling af netværksforespørgsler i asynkron tilstand.
Vigtige Deno:
- Fokus på sikkerhed i standardkonfigurationen. Adgang til filer, netværksmuligheder og miljøvariabler er som standard blokeret og kræver eksplicit aktivering. Standardprogrammer kører i isolerede sandbox-miljøer og kan ikke få adgang til systemressourcer uden at få tildelt specifikke rettigheder;
- Indbygget understøttelse af TypeScript-sprog udover JavaScript. Typesystemet håndteres af den indbyggede TypeScript-kompilator, hvilket medfører nedsat ydeevne sammenlignet med JavaScript-parsing i V8. I fremtiden planlægges det at udvikle en egen implementering af Typescript typesystem, som vil markant forbedre ydeevnen ved TypeScript-behandling;
- Runtime leveres som en enkelt, selvforsynende eksekverbar fil ('deno'). For at køre programmer med Deno er det nok at have én eksekverbar fil til sin platform, som er ca. 20 MB, uden eksterne afhængigheder og der kræves ikke nogen særlig installation i systemet. Deno er dog ikke en monolitisk applikation, men en samling crate-pakker på Rust (, ), som kan bruges individuelt;
- Ved kørsel af programmer og til indlæsning af moduler kan der anvendes URL-adresser. For eksempel kan man bruge kommandoen 'deno https://deno.land/std/examples/welcome.js' til at køre programmet welcome.js. Kode fra eksterne ressourcer hentes og cachelagres på det lokale system, men opdateres aldrig automatisk (for at opdatere kræver det, at man eksplicit starter applikationen med flaget '--reload');
- Effektiv håndtering af HTTP-netværksanmodninger, platformen er designet til at skabe højtydende netværksapplikationer;
- Mulighed for at skabe universelle webapplikationer, der kan køre både i Deno og i almindelige web-browsere;
- Tilstedeværelsen af , hvis brug ikke kræver binding til eksterne afhængigheder. Modulerne fra standardkollektionen har gennemgået yderligere revision og kompatibilitetstest;
- Udover runtime fungerer Deno også som en pakkehåndtering og tillader at tilgå moduler via URL i koden. For eksempel kan man angive "import * as log from "https://deno.land/std/log/mod.ts" for at indlæse en modul. Filer, der hentes fra eksterne servere via URL, caches. Versionsbinding af moduler bestemmes gennem angivelse af versionnumre i URL'en, for eksempel "https://unpkg.com/liltest@0.0.5/dist/liltest.js";
- Integreret er et system til inspektion af afhængigheder (kommandoen "deno info") og et værktøj til kodeformatering (deno fmt);
- Alle applikationsscripts kan sammenlægges til én JavaScript-fil.
Forskelle fra Node.js:
- Deno bruger ikke npm som pakkehåndtering.
Og binder sig ikke til repositorier; moduler adresseres via URL eller filsti, og modulerne kan placeres på enhver hjemmeside; - I Deno bruges "package.json" ikke til at definere moduler;
- API-forskelle; alle asynkrone handlinger i Deno returnerer et promise;
- Deno kræver eksplicit angivelse af alle nødvendige tilladelser for filer, netværk og miljøvariabler;
- Alle fejl, der ikke har håndterere, fører til, at applikationen afsluttes;
- Deno anvender ECMAScript modul-systemet og understøtter ikke require();
- Deno's indbyggede HTTP-server er skrevet i TypeScript og fungerer oven på native TCP-sockets, mens Node.js' HTTP-server er skrevet i C og giver bindings til JavaScript. Deno's udviklere har fokuseret på at optimere hele TCP-socketlaget og levere et mere generelt interface. Deno's HTTP-server leverer lavere båndbredde, men garanterer forudsigelige lave forsinkelser. For eksempel kunne en simpel Deno HTTP-server-applikation håndtere 25.000 forespørgsler i sekundet med en maksimal forsinkelse på 1,3 millisekunder. I Node.js kunne et tilsvarende program håndtere 34.000 forespørgsler i sekundet, men forsinkelserne varierede mellem 2 og 300 millisekunder.
- Deno er ikke kompatibel med pakker til Node.js (NPM), men udvikles separat for at være kompatibel med Node.js' standardbibliotek, hvilket gør, at flere applikationer skrevet til Node.js kan køre i Deno, efterhånden som det udvikler sig.
Kilde: opennet.ru
