Deno 1.28 er blevet præsenteret, en platform til isoleret udførelse af applikationer skrevet i JavaScript og TypeScript, som kan anvendes til at skabe serverbaserede håndteringssystemer. Platformen udvikles af Ryan Dahl, skaberen af Node.js. Ligesom Node.js bruger Deno JavaScript-motoren V8, der også anvendes i Chromium-baserede browsere. Deno er dog ikke en gren af Node.js, men et helt nyt projekt, der er bygget fra bunden. Projektkoden distribueres under MIT-licensen. Bygningerne er forberedt til Linux, Windows og macOS.
Deno-projektet blev skabt for at give brugerne et mere sikkert miljø og rette de konceptuelle fejl, der blev begået i Node.js-arkitekturen. For at øge sikkerheden er indpakningen omkring V8-motoren skrevet i Rust, hvilket hjælper med at undgå mange sårbarheder, der opstår på grund af lavniveauhåndtering af hukommelse. Plattformen Tokio, der også er skrevet i Rust, anvendes til at behandle anmodninger non-blocking. Tokio muliggør højtydende applikationer baseret på event-drevet arkitektur, understøtter multithreading og behandling af netværksanmodninger asynkront.
Den vigtigste ændring i den nye udgave er stabiliseringen af kompatibilitet med pakker, der er hosts i NPM-repositoriet, hvilket muliggør, at Deno kan bruge mere end 1,3 millioner moduler, der er skabt til Node.js-platformen. For eksempel kan applikationer baseret på Deno nu anvende moduler til at organisere vedvarende dataadgang som Prisma, Mongoose og MySQL, samt rammer til frontend-udvikling såsom React og Vue. Nogle NPM-moduler forbliver dog stadig inkompatible med Deno, eksempelvis på grund af bindinger til specifikke Node.js-miljøelementer som package.json-filen. Det er også stadig umuligt at bruge kommandoen „deno compile“ med NPM-moduler. Fremtidige udgivelser planlægger at afhjælpe sådanne inkompatibiliteter og begrænsninger.
Støtten til den tidligere anvendte Deno-model baseret på ECMAScript-modulsystemet og Web API er opretholdt på samme niveau, og til import af NPM-moduler bruges den velkendte Deno-lasteordning baseret på URL. Der er et specielt URL-præfiks "npm:" til brug ved adgang til NPM-moduler, som kan anvendes på samme måde som almindelige Deno-moduler. For eksempel kan NPM-modulet importeres med 'import { chalk } from "npm:chalk@5";', og for at køre et NPM-script fra kommandolinjen kan man skrive "deno run —allow-env —allow-read npm:create-vite-extra".
Brug 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 opstart af applikationen), der bruges ikke en package.json-fil, og den standard katalog node_modules anvendes ikke (moduler caches i en fælles katalog, men der er mulighed for at genoptage den gamle adfærd ved hjælp af indstillingen "—node-modules-dir").
I applikationer baseret på NPM er det muligt at anvende de enkelte mekanismer til adgangskontrol, isolation og aktivering af sikkerhedsfunktioner, som tilbydes i Deno. For at modvirke angreb gennem tvivlsomme afhængigheder blokerer Deno som standard for alle forsøg på at få adgang til systemet fra afhængigheder og giver en advarsel ved forekomsten af problemer. For eksempel, hvis et modul forsøger at få skriveadgang til /usr/bin/, vil der blive givet en bekræftelsesforespørgsel for operationen: deno run npm:install-malware ⚠️ ┌ Deno anmoder om skriveadgang til /usr/bin/. ├ Anmodet af `install-malware` ├ Kør igen med —allow-write for at omgå denne besked. └ Tillad? [y/n] (y = ja, tillad; n = nej, nægt) >
Blandt de ikke-relaterede forbedringer i NPM, nævnes opdatering af V8-motoren til version 10.9, automatisk opdagelse af låste filer, stabilisering af API'er som Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() og Deno.uid(), samt tilføjelsen af en ny ustabil API Deno.Command() til at køre 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 støtte til TypeScript-sproget ud over JavaScript. Typekontrol og generering af JavaScript foretages af den indbyggede TypeScript-kompilator, hvilket medfører et præstationsfald sammenlignet med parsing af JavaScript i V8;
- Runtime leveres i form af en enkelt selvstændig eksekverbar fil («deno»). For at køre applikationer med Deno er det nok at downloade én eksekverbar fil til din platform, som er omkring 30 MB i størrelse, ikke har eksterne afhængigheder og ikke kræver nogen særlig installation i systemet. Deno er heller ikke en monolitisk applikation, men en samling af crate-pakker i Rust (deno_core, rusty_v8), som kan bruges hver for sig;
- 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 af moduler, som kan bruges uden at være bundet til eksterne afhængigheder. Modulerne i standardkollektionen har gennemgået en ekstra revision og er blevet kontrolleret for kompatibilitet;
- Udover runtime fungerer Deno-platformen også som en pakkeadministrator og gør det muligt at referere til moduler via URL i koden. For eksempel kan du angive i koden for at hente et modul: «import * as log from «https://deno.land/std/log/mod.ts». Filer, der hentes fra eksterne servere via URL, caches. Bindeled til versionsnumre af moduler bestemmes gennem angivelse af versionsnumre inden for URL, 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.
Kilde: opennet.ru
