Deno 1.28 er blevet lanceret, en platform til isoleret kørsel af applikationer skrevet i JavaScript og TypeScript, som kan bruges til at skabe server-baserede håndteringsprogrammer. Platformen er udviklet af Ryan Dahl, skaberen af Node.js. Ligesom Node.js bruger Deno JavaScript-motoren V8, som også anvendes i Chromium-baserede browsere. Deno er dog ikke en aflægger af Node.js, men et nyudviklet projekt fra bunden. Koden til projektet distribueres under MIT-licensen. Bygninger er tilgængelige for Linux, Windows og macOS.
Deno-projektet blev skabt for at tilbyde brugerne et mere sikkert miljø og rette konceptuelle fejl, der blev begået i Node.js-arkitekturen. For at forbedre sikkerheden er omslaget omkring V8-motoren skrevet i Rust, som hjælper med at undgå mange sårbarheder, der kan opstå ved lavniveau hukommelsesoperationer. Til behandling af anmodninger i en ikke-blokerende tilstand anvendes Tokio, også skrevet i Rust. Tokio gør det muligt at skabe højtydende applikationer baseret på en hændelsesdrevet arkitektur, der understøtter multitrådning og asynkron behandling af netværksanmodninger.
Hovedændringen i den nye udgave er stabiliseringen af kompatibilitet med pakker, der er placeret i NPM-repositoriet, hvilket gør det muligt at bruge over 1,3 millioner moduler, der er oprettet til Node.js-platformen i Deno. For eksempel kan applikationer baseret på Deno nu bruge moduler såsom Prisma, Mongoose og MySQL til at organisere vedvarende datatilgang, samt frameworks til frontend-udvikling som React og Vue. Nogle NPM-moduler forbliver dog stadig inkompatible med Deno, for eksempel på grund af bindinger til Node.js-specifikke miljøelementer, såsom package.json-filen. Desuden er det i øjeblikket ikke muligt at bruge kommandoen „deno compile“ med NPM-moduler. I fremtidige udgivelser planlægges det at afhjælpe sådanne inkompatibiliteter og begrænsninger.
Støtte til den tidligere anvendte Deno-model, baseret på ECMAScript-modulsystemet og Web API, er bevaret på samme niveau, og for import af NPM-moduler anvendes den velkendte Deno URL-baserede indlæsning. For at tilgå NPM-moduler er der en særlig URL-præfiks "npm:", som kan bruges som ved almindelige Deno-moduler. For eksempel kan man angive ‘import { chalk } from "npm:chalk@5";’ for at importere et NPM-modul, og for at køre et NPM-script fra kommandolinjen — "deno run —allow-env —allow-read npm:create-vite-extra".
Brugen af NPM-pakker i Deno er betydeligt lettere end i Node.js, da der ikke er behov for at installere moduler på forhånd (moduler installeres ved første kørsel af applikationen), filen package.json anvendes ikke, og som standard bruges heller ikke mappen node_modules (moduler cacheres i en fælles mappe, men der er mulighed for at vende tilbage til den gamle adfærd med indstillingen "—node-modules-dir").
I NPM-baserede applikationer bevares muligheden for at anvende de adgangsbegrænsnings-, isolerings- og sikkerhedsmekanismer, som Deno tilbyder. For at modvirke angreb gennem tvivlsomme afhængigheder blokerer Deno som standard alle forsøg på at få adgang til systemet fra afhængigheder og viser en advarsel om identificerede problemer. For eksempel vil der ved et modul, der forsøger at få skriveadgang til /usr/bin/, blive vist en bekræftelsesforespørgsel: deno run npm:install-malware ⚠️ ┌ Deno requesterer skriveadgang til /usr/bin/. ├ Anmodet af `install-malware` ├ Kør igen med —allow-write for at omgå denne prompt. └ Tillade? [y/n] (y = ja, tillad; n = nej, afslå) >
Blandt de ikke-relaterede forbedringer i NPM i den nye version kan nævnes opdateringen af V8-motoren til version 10.9, automatisk identifikation af låste filer, stabilisering af API'erne Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() og Deno.uid(), samt tilføjelsen af et nyt ustabilt API Deno.Command() til kørsel af kommandoer (universel erstatning for Deno.spawn, Deno.spawnSync og Deno.spawnChild).
De vigtigste funktioner i 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 support til TypeScript ud over JavaScript. Typekontrol og generering af JavaScript udføres af den indbyggede TypeScript-kompilator, hvilket fører til lavere ydeevne sammenlignet med JavaScript-parsing i V8;
- Runtime leveres som én selvstændig eksekverbar fil («deno»). For at køre applikationer med Deno er det tilstrækkeligt at hente én eksekverbar fil til din platform, der er omkring 30 MB stor, uden eksterne afhængigheder og uden behov for en særlig installation i systemet. Den er dog ikke en monolitisk applikation, men repræsenterer en samling af crate-pakker i Rust (deno_core, rusty_v8), 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;
- Der er et standard sæt moduler, hvis anvendelse ikke kræver binding til eksterne afhængigheder. Modulerne fra standardkollektionen har været gennem en yderligere revision og kompatibilitetskontrol;
- Udover runtime fungerer Deno-platformen også som en pakkemanager og tillader tilgang til moduler via URL i koden. For eksempel kan man angive i koden «import * as log from «https://deno.land/std/log/mod.ts». Filer downloadet fra eksterne servere via URL caches. Bindingen til versioner af moduler defineres gennem angivelse af versionsnumre inden for URL, f.eks. «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.
Kilde: opennet.ru
