Node.js er et populært Javascript-kjøremiljø for bruk av Javascript utenfor nettleseren og på servere. Kjøremiljøet er basert på Chromes V8-motor, den samme som brukes for kjøring av Javascript i blant annet Chrome-nettleseren.
Node ble opprinnelig laget av utvikleren Ryan Dahl, som i ettertid har sagt at han angrer på flere valg han gjorde da han i sin tid skapte Node. I 2018 avslørte Dahl at han jobber med et alternativ til Node som han ville kalle Deno. Nå skriver Dahl i et blogginnlegg at versjon 1.0 av Deno er lansert.
Dahl skriver at Node ble laget i 2009, på et tidspunkt da Javascript var et veldig annerledes språk sammenlignet med hva det er i dag, og at språket har gjennomgått mange forbedringer siden den gang.
– Ut av ren nødvendighet måtte Node finne opp konsepter som siden ble tatt inn av standardiseringsorganisasjonene og lagt til i Javascript på en annerledes måte, skriver Dahl.
Han holdt i juni 2018 en presentasjon der han gikk gjennom ti ting han angrer på med Node.js.
På grunn av det store antallet brukere Node har, er det vanskelig å gjøre veldig store endringer i Node i ettertid – og det tar lang tid. Med alle endringene i Javascript-språket, og nye tillegg som Typescript, kan det å bygge Node-prosjekter være ganske krevende, og rett og slett ta bort mye av kodegleden, mener Dahl.
Bruker ikke NPM – og Typescript er standard
Deno skal ifølge Dahl fungere for både små og store prosjekter, og støtter Typescript uten noen ekstra «tooling». Deno er skrevet i språket Rust, og det vil være mulig å utvide Deno ved hjelp av Rust-plugins.
I et intervju med Jaxenter forklarer Dahl at Deno i tillegg til å ha Typescript-støtte, bruker et enklere modulsystem hvor moduler kan legges inn i koden som avhengigheter med én enkelt linje. I stedet for å bruke require(), bruker Deno «ES Modules» – den nyeste ECMA-standarden for håndtering av Javascript-moduler (og som også fungerer i nye nettlesere).
I Deno importerer man moduler ved å peke til en URL, som på denne måten:
import { serve } from "https://deno.land/std@0.50.0/http/server.ts"; for await (const req of serve({ port: 8000 })) { req.respond({ body: "Hello World\n" }); }
Noe av det Dahl kritiserer med Node, er hvordan mekanismen for å lenke til eksterne biblioteker i stor grad er sentralisert gjennom at «alle» bruker NPM (Node Packet Manager). Denne sentraliseringen er ikke i tråd med idealene til weben, mener han. Deno er ikke kompatibel med NPM-pakker, selv om det jobbes med et kompatibilitetslag som kan brukes på toppen av Deno.
Deno skal være strengere på sikkerhet enn Node, og som standard kjøres script i en sikker sandkasse uten tilgang til for eksempel operativsystemet eller nettverket – med mindre man spesifikt har gitt tillatelse til det.
Angret på å ha tatt vekk «promises» i Node
Noe av det Dahl har sagt han angrer mest på med Node, er at han la til promises, men så fjernet det igjen kort tid etterpå. Promises, og async/await – som er «syntaktisk sukker» på toppen av promises, er ganske sentralt for håndtering av asynkron kode i moderne Javascript.
Deno er designet med støtte for promises hele veien – og alle asynkrone funksjoner i Deno returnerer en promise.
Dahl er for øvrig klar på at Deno ikke er en «fork» av Node, men en helt ny implementasjon av Javascript utenfor nettleseren. Prosjektet er bare to år gammelt, mens Node har vært under utvikling i over 10 år.
– Gitt den store interessen for Deno, så forventer vi at det vil fortsette å utvikle seg og modnes.
Du kan selv sjekke ut Deno 1.0. her.