Deno 1.28 er lansert, en plattform for isolert kjøring av applikasjoner skrevet i JavaScript og TypeScript, som kan brukes til å lage serverbaserte håndterere. Plattformen blir utviklet av Ryan Dahl, skaperen av Node.js. På samme måte som i Node.js, bruker Deno JavaScript-motoren V8, som også benyttes i Chromium-baserte nettlesere. Deno er imidlertid ikke en avlegger av Node.js, men et nytt prosjekt utviklet fra bunnen av. Koden for prosjektet distribueres under MIT-lisensen. Byggene er forberedt for Linux, Windows og macOS.
Deno-prosjektet ble opprettet for å gi brukerne et mer sikkert miljø og rette opp konseptuelle feil gjort i arkitekturen til Node.js. For å forbedre sikkerheten er innpakningen rundt V8-motoren skrevet i Rust, som forhindrer mange sårbarheter som kommer fra lavnivå minnehåndtering. For å håndtere forespørslene på en ikke-blokkerende måte, brukes Tokio-plattformen, som også er skrevet i Rust. Tokio gjør det mulig å lage høytytende applikasjoner basert på en hendelsesdrevet arkitektur som støtter multitråding og asynkron behandling av nettverksforespørsler.
Den viktigste endringen i den nye utgivelsen er stabiliseringen av kompatibilitet med pakker som er lagt ut i NPM-repositoriet, noe som gjør det mulig å bruke mer enn 1,3 millioner moduler laget for Node.js i Deno. For eksempel kan applikasjoner basert på Deno nå bruke moduler som Prisma, Mongoose og MySQL for å organisere vedvarende datatilgang, samt rammeverk som React og Vue for å støtte frontend-operasjoner. Noen NPM-moduler er fortsatt inkompatible med Deno, for eksempel på grunn av bindninger til Node.js-spesifikke miljøelementer, som package.json-filen. Det er også fortsatt umulig å bruke kommandoen «deno compile» med NPM-moduler. I fremtidige utgivelser er det planlagt å eliminere slike inkompatibiliteter og begrensninger.
Støtte for den tidligere anvendte Deno-modellen basert på ECMAScript-modulsystemet og Web API er bevart på samme nivå, og for import av NPM-moduler brukes den kjente Deno-URL-lasteordningen. For å få tilgang til NPM-moduler er det en spesial-URL-prefiks «npm:», som kan brukes på samme måte som vanlige Deno-moduler. For eksempel kan man for å importere en NPM-modul skrive ‘import { chalk } from «npm:chalk@5»;’, og for å kjøre en NPM-skript fra kommandolinjen — «deno run —allow-env —allow-read npm:create-vite-extra».
Bruken av NPM-pakker i Deno er betydelig enklere enn i Node.js, da det ikke er nødvendig med forhåndsinstallering av moduler (moduler installeres ved første kjøring av applikasjonen), og filen package.json brukes ikke, samt at katalogen node_modules ikke benyttes som standard (moduler caches i en felles katalog, men det er mulighet for å gjenvinne det gamle atferden ved hjelp av alternativet «—node-modules-dir»).
I applikasjoner basert på NPM bevares muligheten for å bruke Deno-mekanismene for tilgangskontroll, isolasjon og aktivering av sikkerhetsrelaterte utvidede funksjoner. For å motvirke angrep gjennom tvilsomme avhengigheter blokkerer Deno som standard alle forsøk på å få tilgang til systemet fra avhengigheter og gir advarsel om oppdagede problemer. For eksempel, når en modul prøver å få tilgang til skriving i /usr/bin/, vil det komme opp en bekreftelsesforespørsel for denne handlingen: deno run npm:install-malware ⚠️ ┌ Deno ber om skriveadgang til /usr/bin/. ├ Forespurt av `install-malware` ├ Kjør igjen med —allow-write for å omgå denne bekreftelsen. └ Tillat? [y/n] (y = ja, tillat; n = nei, nekt) >
Blant NPM-tilknyttede forbedringer nevnes oppdatering av V8-motoren til versjon 10.9, automatisk oppdagelse av låste filer, stabilisering av API-ene Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() og Deno.uid(), samt tilførsel av et nytt ustabilt API, Deno.Command(), for å kjøre kommandoer (generell erstatning for Deno.spawn, Deno.spawnSync og Deno.spawnChild).
Hovedfunksjoner ved 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;
- Innebygd støtte for TypeScript i tillegg til JavaScript. Typekontroll og generering av JavaScript skjer ved hjelp av den innebygde TypeScript-kompilatoren, noe som fører til en nedgang i ytelse sammenlignet med JavaScript-parsing i V8;
- Runtime blir levert som en selvstendig kjørbar fil («deno»). For å kjøre applikasjoner med Deno er det tilstrekkelig å laste ned én kjørbar fil for din plattform, som er omtrent 30 MB stor, har ingen eksterne avhengigheter, og krever ingen spesialisert installasjon. Deno er imidlertid ikke en monolittisk applikasjon, men en samling crate-pakker i Rust (deno_core, rusty_v8), 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;
- Tilgjengeligheten av et standard sett med moduler som ikke krever binding til eksterne avhengigheter. Modulene i standardpakken har gjennomgått en ekstra revisjon og kompatibilitetstest;
- I tillegg til runtime-funksjonen tilbyr Deno-plattformen også en pakkehåndterer som gjør det mulig å referere til moduler ved URL i koden. For eksempel, for å laste ned en modul kan man angi i koden «import * as log from «https://deno.land/std/log/mod.ts». Filer som er lastet ned fra eksterne servere via URL, blir cachet. Bindingen til versjoner av moduler bestemmes gjennom angivelse av versjonsnumre i URL-en, 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.
Kilde: opennet.ru
