Etter to års utvikling den første betydelige utgivelsen , en plattform for isolert kjøring av applikasjoner skrevet i JavaScript og TypeScript, som kan brukes til å lage serverbaserte håndterere. Plattformen utvikles av Ryan Dahl (), skaperen av Node.js. Som i Node.js bruker Deno JavaScript-motoren , som også brukes i Chromium-baserte nettlesere. Deno er imidlertid ikke et avlegger av Node.js, men et helt nytt prosjekt laget fra bunnen av. Koden for prosjektet er lisensiert under MIT. Byggene for Linux, Windows og macOS.
Den betydelige versjonsnummeret er knyttet til stabilisering av API i Deno-navnerommet, som ansvarer for samhandlingen mellom applikasjoner og operativsystemet. Programgrensesnittene som ennå , er som standard skjult og tilgjengelig bare når det kjøres i «—unstable»-modus. Etter hvert som nye versjoner dannes, vil slike API gradvis bli flyttet til stabile. API i det globale navnerommet, som inkluderer vanlige funksjoner som setTimeout() og fetch(), er i den grad det er mulig tilpasset APIene i vanlige nettlesere og utvikles i samsvar med webstandardene for nettlesere. Rust-APIene som brukes direkte i plattformkoden, samt grensesnittet for utvikling av plugins til Deno runtime, er ennå ikke stabilisert og fortsetter å utvikles.
De viktigste motivene bak opprettelsen av den nye JavaScript-plattformen var ønsket om å fjerne de konseptuelle feilene, i arkitekturen til Node.js, og for å gi brukerne et sikrere miljø. For å øke sikkerheten er innkapslingen rundt V8-motoren skrevet i Rust, som unngår mange sårbarheter knyttet til lavnivå minnehåndtering, som tilgang til minneområder etter at de er frigitt, dereferering av nullpeker og bufferoverløp. For å håndtere forespørslene brukes plattformen , også skrevet i Rust. Tokio gjør det mulig å lage høytytende applikasjoner basert på hendelsesdrevet arkitektur, som støtter multitråding og behandling av nettverksforespørsler asynkront.
Viktige Deno:
- Sikkerhetsfokus i standardkonfigurasjonen. Filtilgang, nettverksmuligheter og tilgang til miljøvariabler er som standard blokkert og krever eksplisitt tillatelse. Applikasjoner kjøres som standard i isolerte sandkassemiljøer og kan ikke få tilgang til systemressurser uten å bli eksplisitt gitt tillatelser;
- Integrert støtte for TypeScript i tillegg til JavaScript. For typekontroll og generering av JavaScript brukes den innebygde TypeScript-kompilatoren, noe som resulterer i lavere ytelse sammenlignet med JavaScript-parsing i V8. I fremtiden planlegges det å lage en egen implementering av TypeScript-typekontrollsystemet, som vil kunne forbedre ytelsen ved behandling av TypeScript betydelig.
- Runtime leveres som en enkelt, selvstendig kjørbar fil («deno»). For å kjøre applikasjoner med Deno er det nok å for sin plattform én kjørbar fil, på rundt 20 MB, uten eksterne avhengigheter og som ikke krever noen spesiell installasjon i systemet. Deno er imidlertid ikke en monolitisk applikasjon, men representerer en samling av crate-pakker i Rust (, ), som kan brukes separat;
- Når programmet kjøres, samt for å laste moduler, kan adressene brukes gjennom URL. For eksempel kan kommandoen «deno https://deno.land/std/examples/welcome.js» brukes for å kjøre programmet welcome.js. Kode fra eksterne ressurser lastes ned og lagres i det lokale systemet, men oppdateres aldri automatisk (for oppdateringer kreves det at applikasjonen kjøres eksplisitt med flagget «—reload»);
- Effektiv behandling av HTTP-nettverksforespørsel i applikasjoner, plattformen er designet for å lage høyytelses nettverksapplikasjoner;
- Mulighet til å lage universelle webapplikasjoner, som kan kjøres både i Deno og i vanlige nettlesere;
- Tilstedeværelsen av , hvis bruk ikke krever binding til eksterne avhengigheter. Modulene fra standardkolleksjonen har gjennomgått ekstra revisjon og kompatibilitetssjekk;
- I tillegg til runtime fungerer Deno-plattformen også som en pakkeadministrator og lar deg få tilgang til moduler innenfor koden via URL. For eksempel, for å laste ned en modul kan du spesifisere i koden «import * as log from «https://deno.land/std/log/mod.ts». Filer lastet ned fra eksterne servere via URL caches. Binding til versjoner av moduler bestemmes gjennom spesifikasjon av versjonsnumre innen URL, for eksempel «https://unpkg.com/liltest@0.0.5/dist/liltest.js»;
- Det er integrert et system for inspeksjon av avhengigheter (kommandoen «deno info») og et verktøy for kodingformattering (deno fmt);
- Alle applikasjonsskript kan slås sammen til én JavaScript-fil.
Forskjeller fra Node.js:
- Deno bruker ikke npm-pakkeadministratoren
og er ikke knyttet til registre, moduladressering skjer gjennom URL eller filbane, og modulene kan plasseres på hvilken som helst nettside; - I Deno brukes ikke «package.json» for å definere moduler;
- API-ulikhet, alle asynkrone handlinger i Deno returnerer promise;
- Deno krever eksplisitt definisjon av alle nødvendige rettigheter for filer, nettverk og miljøvariabler;
- Alle feil uten håndterere fører til at applikasjonen stoppes;
- I Deno brukes ECMAScript-modulsystemet og require() støttes ikke;
- Den innebygde HTTP-serveren i Deno er skrevet i TypeScript og fungerer over native TCP-sokler, mens HTTP-serveren i Node.js er skrevet i C og gir bindings til JavaScript. Utviklerne av Deno har fokusert på å optimalisere hele TCP-sokkelaget og gi et mer generelt grensesnitt. Deno HTTP-serveren gir lavere båndbredde, men garanterer forutsigbare lave latenser. For eksempel, i testen klarte en enkel applikasjon basert på Deno HTTP-server å håndtere 25 000 forespørsel per sekund med maksimal latens på 1,3 millisekunder. I Node.js klarte en lignende applikasjon å håndtere 34 000 forespørsel per sekund, men latensene varierte fra 2 til 300 millisekunder.
- Deno er ikke kompatibel med pakker for Node.js (NPM), men en egen utvikling av for kompatibilitet med Node.js sin standardbibliotek, som vil tillate at flere applikasjoner skrevet for Node.js kan kjøres i Deno etter hvert som utviklingen går fremover.
Kilde: opennet.ru
