De release van Deno 1.28 is gepresenteerd, een platform voor het afzonderlijk uitvoeren van applicaties in JavaScript en TypeScript, dat gebruikt kan worden voor het creëren van server-side handlers. Het platform wordt ontwikkeld door Ryan Dahl, de maker van Node.js. Zoals in Node.js maakt Deno gebruik van de JavaScript-engine V8, die ook wordt gebruikt in op Chromium gebaseerde browsers. Deno is echter geen afsplitsing van Node.js, maar een nieuw project dat vanaf de grond af is opgebouwd. De code van het project wordt verspreid onder de MIT-licentie. Versies zijn voorbereid voor Linux, Windows en macOS.
Het Deno-project is opgezet om gebruikers een veiliger omgeving te bieden en conceptuele fouten in de architectuur van Node.js te corrigeren. Om de beveiliging te verbeteren, is de wrapper rondom de V8-engine geschreven in Rust, wat helpt om veel kwetsbaarheden te vermijden die voortkomen uit laag-niveau geheugenbeheer. Voor het verwerken van aanvragen in een niet-blokkerende modus wordt het Tokio-platform gebruikt, dat ook in Rust is geschreven. Tokio maakt het mogelijk om hoogpresterende applicaties te creëren op basis van een event-driven architectuur, die multithreading en asynchrone verwerking van netwerkverzoeken ondersteunt.
De belangrijkste wijziging in de nieuwe release is de stabilisatie van de compatibiliteit met pakketten die zijn gehost in de NPM-repository, waardoor meer dan 1,3 miljoen modules die voor Node.js zijn gemaakt, nu in Deno kunnen worden gebruikt. Bijvoorbeeld, in Deno-applicaties kunnen nu modules zoals Prisma, Mongoose en MySQL voor constante gegevens toegang worden gebruikt, evenals frameworks zoals React en Vue voor frontend-ontwikkeling. Sommige NPM-modules blijven vooralsnog incompatible met Deno, bijvoorbeeld vanwege afhankelijkheden aan Node.js-specifieke omgevingscomponenten, zoals het package.json-bestand. Het is ook nog niet mogelijk om de "deno compile"-opdracht te gebruiken met NPM-modules. Toekomstige releases plannen om dergelijke incompatibiliteiten en beperkingen aan te pakken.
De ondersteuning voor het eerdere Deno-model op basis van het ECMAScript-module-systeem en de Web API is op hetzelfde niveau behouden en voor het importeren van NPM-modules wordt de bekende Deno-laadstructuur op basis van URL's gebruikt. Voor toegang tot NPM-modules is er een speciale URL-prefix 'npm:' die kan worden gebruikt zoals bij reguliere Deno-modules. Bijvoorbeeld, voor het importeren van een NPM-module kan men 'import { chalk } from "npm:chalk@5";' opgeven, en voor het uitvoeren van een NPM-script vanuit de commandoregel - 'deno run --allow-env --allow-read npm:create-vite-extra'.
Het gebruik van NPM-pakketten in Deno is aanzienlijk eenvoudiger dan in Node.js, aangezien er geen noodzaak is voor voorafgaande installatie van modules (modules worden geïnstalleerd bij de eerste uitvoering van de toepassing), er geen package.json-bestand wordt gebruikt en de standaard node_modules-map niet wordt gebruikt (modules worden gecached in een algemene map, maar het is mogelijk om het oude gedrag te herstellen met de optie '--node-modules-dir').
In NPM-gebaseerde toepassingen blijft de mogelijkheid bestaan om gebruik te maken van de toegangbeperkingsmechanismen, isolatie en activering van beveiligingsverhogende functionaliteit die door Deno worden geboden. Om aanvallen via verdachte afhankelijkheden tegen te gaan, blokkeert Deno standaard alle pogingen tot systeembelang van afhankelijkheden en geeft een waarschuwing over gedetecteerde problemen. Bijvoorbeeld, bij een poging van een module om schrijfrechten in /usr/bin/ te verkrijgen, zal er een bevestigingsprompt voor deze actie verschijnen: deno run npm:install-malware ⚠️ ┌ Deno vraagt om schrijfrechten voor /usr/bin/. ├ Aangevraagd door 'install-malware' ├ Voer opnieuw uit met --allow-write om deze prompt te omzeilen. └ Toestaan? [y/n] (y = ja, toestaan; n = nee, weigeren) >
Van de ongerelateerde verbeteringen in NPM wordt in de nieuwe versie de upgrade van de V8-engine naar release 10.9, automatische detectie van bestanden met lock-bestanden, stabilisatie van de API's Deno.bench(), Deno.gid(), Deno.networkInterfaces(), Deno.systemMemoryInfo() en Deno.uid(), en de toevoeging van een nieuwe onbetrouwbare API Deno.Command() voor het uitvoeren van opdrachten (een universele vervanging voor Deno.spawn, Deno.spawnSync en Deno.spawnChild) genoemd.
Belangrijkste kenmerken van Deno:
- Focus op veiligheid in de standaardconfiguratie. Toegang tot bestanden, netwerkmogelijkheden en omgevingsvariabelen is standaard geblokkeerd en vereist expliciete inschakeling. Applicaties worden standaard uitgevoerd in geïsoleerde sandbox-omgevingen en kunnen geen systeemfunctionaliteiten benaderen zonder expliciete toestemming.
- Ingebouwde ondersteuning voor de programmeertaal TypeScript naast JavaScript. Voor typecontrole en het genereren van JavaScript wordt de standaard TypeScript-compiler gebruikt, waardoor de prestaties in vergelijking met de parsing van JavaScript in V8 kunnen afnemen.
- Runtime wordt geleverd in de vorm van één enkele, zelfstandige uitvoerbare bestand («deno»). Om applicaties met Deno uit te voeren, hoeft u alleen het uitvoerbare bestand voor uw platform te downloaden, dat ongeveer 30 MB groot is, geen externe afhankelijkheden heeft en geen bijzondere installatie in het systeem vereist. Bovendien is Deno geen monolithische applicatie, maar een verzameling crate-pakketten in Rust (deno_core, rusty_v8), die afzonderlijk kunnen worden gebruikt;
- Bij het uitvoeren van een programma en het laden van modules kan adressering via URL's worden gebruikt. Bijvoorbeeld, om het programma welcome.js uit te voeren, kan de opdracht «deno https://deno.land/std/examples/welcome.js» worden gebruikt. Code van externe bronnen wordt gedownload en in de lokale systeemcache opgeslagen, maar wordt nooit automatisch bijgewerkt (voor updates moet de applicatie expliciet worden gestart met de vlag «—reload»).
- Efficiënte verwerking van HTTP-netwerkverzoeken in applicaties, het platform is ontworpen voor het maken van hoogpresterende netwerkaanstellingen.
- De mogelijkheid om universele webapplicaties te maken die zowel in Deno als in standaard web-browsers kunnen worden uitgevoerd.
- De beschikbaarheid van een standaardset modules die niet afhankelijk zijn van externe afhankelijkheden. Modules uit de standaardcollectie zijn onderworpen aan aanvullende audits en compatibiliteitscontroles;
- Naast runtime fungeert het Deno-platform ook als een pakketbeheerder en maakt het mogelijk om binnen de code modules via URL aan te roepen. Bijvoorbeeld, om een module te laden, kun je in de code «import * as log from «https://deno.land/std/log/mod.ts». Bestanden die van externe servers URL's worden gecached. Versiebeheer van modules wordt bepaald door versienummers in de URL op te nemen, bijvoorbeeld «https://unpkg.com/liltest@0.0.5/dist/liltest.js»;
- Het pakket bevat een systeem voor het inspecteren van afhankelijkheden (commando «deno info») en een tool voor het opmaken van code (deno fmt);
- Alle applicatiescripts kunnen worden samengevoegd tot één JavaScript-bestand.
Bron: opennet.ru
