Node-skaperens Node-alternativ i versjon 2.0: – Endelig skjer det

Deno har kanskje havnet i skyggen av Bun – men nå er Ryan Dahl klart med en "release candidate" av versjon 2.0 av JavaScript-kjøremiljøet.

Det har gått mer enn fire år siden første versjon av JavaScript-kjøremiljøet Deno så dagens lys. Bak prosjektet står ingen ringere enn Node.js-skaperen Ryan Dahl, som lagde Deno etter å ha innsett at det var flere ting han angret på med Node.js.

Deno har imidlertid havnet litt i skyggen av et annet alternativt JavaScript-kjøremiljø, nemlig Bun. I den siste State of JS-undersøkelsen svarer 22 prosent av respondentene at de har brukt Bun, mens bare 15 prosent har brukt Deno (94 prosent har brukt Node.js).

Nå har Deno-teamet lansert en Release Candidate (RC) av Deno 2.0 en stor oppdatering de skal ha jobbet med i flere år. Det skriver InfoWorld.

Bun er mer populært enn Deno, viser den siste State of JS-undersøkelsen. 📸: State of JS
Bun er mer populært enn Deno, viser den siste State of JS-undersøkelsen. 📸: State of JS Vis mer

– Vi har planlagt en ny stor utgave av Deno i flere år. Ofte så den ut til å være rett rundt hjørnet, men så innså vi at funksjonaliteten vi ønsket krevde mer arbeid. Men endelig skjer det! skriver Deno-teamet.

Innså at utviklere trenger npm

I likhet med Node.js er Deno basert på JavaScript-motoren V8, mens Bun er basert på Apples WebKit JavaScriptCore.

Da Deno 1.0 ble lansert, var det i utgangspunktet ikke støtte for å installere npm-pakker. I stedet ville Ryan Dahl & co at du skulle importere moduler fra URL-er på denne måten:

import { serve } from "https://deno.land/std/http/server.ts";

Etter hvert innså Deno-teamet at utviklere rett og slett er for avhengige av npm, og Deno fikk støtte for npm.

Noe av det Deno har jobbet mest med de siste årene frem mot versjon 2.0 er å gjøre Deno enda mer kompatibelt med Node.js og npm.

– Det har blitt ganske tydelig de siste par årene at det er en masse npm-pakker folk rett og slett trenger å bruke, sa Dahl i et intervju på Syntax-podcasten som The New Stack viser til.

Det betyr at du nå kan importere tredjepartsmoduler på flere ulike måter:

import { camelCase } from "jsr:@luca/cases@1.0.0";
import { say } from "npm:cowsay@1.6.0";
import { pascalCase } from "https://deno.land/x/case/mod.ts";

Det er gjort en del forbedringer av pakkehåndtering i versjon 2.0, blant annet ved at hvis prosjektet inneholder en package.json-fil, så vil Deno legge til npm:-avhengigheter i package.json-filen, i stedet for som tidligere i deno.json.

I Deno 2.0 vil deno add-kommandoen også håndtere "subpaths". Det betyr at du kan skrive deno add npm:preact/hooks – noe som før versjon 2.0 ville gitt en feilmelding.

Det er ES Modules (ESM) som er det primære modulsystemet som brukes i Deno, mens støtten for CommonJS ("require") har vært begrenset. I Deno 2 er det lagt til en del forbedringer for å gjøre overgangen fra Common JS til ESM enklere. Du kan lese mer om det her.

Fjerner window

I versjon 1.0 introduserte Deno den globale variabelen window, der målet var å gjøre Deno så kompatibel med nettlesere som mulig. Men denne globale variabelen – som du ikke har i Node.js – viste seg å skape en masse problemer for mange biblioteker.

– Mange biblioteker sjekker om de kjører i nettleseren ved å sjekke for en global window-variabel i stedet for å sjekke om det eksisterer en DOM. Dette førte til en rekke bugs i biblioteker som ellers ville ha fungert i Deno, ettersom window var globalt tilgjengelig, skriver Deno.

Deno begynte fra versjon 1.46 å oppfordre brukere til å ikke bruke window, og heller bruke globalThis eller self:

// Deno v1.x
window.addEventListener("load", () => {
  console.log("loaded");
});

// Deno v2.x
globalThis.addEventListener("load", () => {
  console.log("loaded");
});

Fra og med Deno 2 er window fjernet.

Legger til process

Mens window har skapt problemer og ikke vært ønsket av brukerne, er det en annen global mange har etterspurt: process.

Det har riktignok vært mulig å bruke process tidligere ved å importere den fra node:process-modulen, men mange populære rammeverk har vært avhengig av å ha tilgang til den i det globale scopet (process brukes som kjent ofte i konfigurasjonsfiler, for eksempel gjennom process.env).

Nå er process tilgjengelig globalt i Deno:

– Ved å legge til globalen process kan du forvente at mye mer kode opprinnelig skrevet for Node.js vil fungere uten endringer i Deno, skriver Deno-teamet.

Du kan lese om alle nyhetene i Deno 2.0 her.

Sjekk også Denos egen video om hva som er nytt: