Deno, haastaja Nodelle

Published on Saturday, December 12, 2020

Deno, haastaja Nodelle

Tänä vuonna Javascript/Typescript-rintamalla on tapahtunut merkittävää kehitystä yhdellä osa-alueella, ja se on Deno-projektin kehittyminen haastajaksi Node.js:lle.

Denossa on pyritty korjaamaan Node.js:n pahimpia ongelmia, joiden takia ainakin allekirjoittanut on aiemmin vältellyt Nodella tapahtuvaa ohjelmistokehitystä. Alla olen listannut omalta osaltani merkittävimmät muutokset

Typescript-tuki

Denossa Typescript-tuki on sisäänrakennettuna, joten npm-helvettiin ei tarvitse tutustua, jos tarkoitus on kirjoittaa Typescript-koodia. Typescript-koodia voi suoraan suorittaa Denossa, ja tarvittaessa kääntää sen Javascriptiksi ilman mitään ulkopuolisia työkaluja.

esim. alla olevan Typescript-koodin

export class CharacterCounter {
    static CountVisibleCharacters(input: string) : number {
        return [...input].length;
    }

    static CountUTF_16Characters(input: string) : number {
        return input.length;
    }

    static CountUTF_8Characters(input: string) : number {
        const encoder = new TextEncoder();
        return encoder.encode(input).length;
    }
}

saa muutettua Javascriptiksi seuraavalla komennolla

deno bundle count.ts count.js

Deno bundle

Testausympäristö

Monien muiden kunnollisten ajoympäristöjen tapaan testitapausten luonti ja suorittaminen on sisäänrakennettu Denoon. Täten mitään ylimääräistä ei tarvitse asentaa, jos omaan projektiin haluaa lisätä testitapauksia.

esim. alla olevan Typescript-koodin

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
import { CharacterCounter } from "./count.ts";

Deno.test("test 123", () => {
    const testCase: string = "123";
    assertEquals(3, CharacterCounter.CountVisibleCharacters(testCase), "Count visible characters");
    assertEquals(3, CharacterCounter.CountUTF_16Characters(testCase), "Count UTF-16 characters");
    assertEquals(3, CharacterCounter.CountUTF_8Characters(testCase), "Count UTF-8 characters");
});

Deno.test("test äiti", () => {
    const testCase: string = "äiti";
    assertEquals(4, CharacterCounter.CountVisibleCharacters(testCase), "Count visible characters");
    assertEquals(4, CharacterCounter.CountUTF_16Characters(testCase), "Count UTF-16 characters");
    assertEquals(5, CharacterCounter.CountUTF_8Characters(testCase), "Count UTF-8 characters");
});

Deno.test("test ⛳", () => {
    const testCase: string = "⛳";
    assertEquals(1, CharacterCounter.CountVisibleCharacters(testCase), "Count visible characters");
    assertEquals(1, CharacterCounter.CountUTF_16Characters(testCase), "Count UTF-16 characters");
    assertEquals(3, CharacterCounter.CountUTF_8Characters(testCase), "Count UTF-8 characters");
});

saa testattua seuraavalla komennolla

deno test tests.ts

Deno test

Suorituskyky

Pahimmillaan Node.js-projekteissa testitapausten suorittaminen vie kymmeniä sekunteja, joten Denon vauhdikas suorituskyky, jossa testitapauksia suoritetaan muutamissa millisekunneissa tuntuu mullistavalta.

Ei NPM-helvettiä

Denossa NPM-tukea ei ole lainkaan, jonka takia NPM-helvettiä ei pääse syntymään. Ulkopuolisiin moduuleihin voi viitata suoraan https-osoitteilla, ja Deno ylläpitää kohtuullisen kattava standardi-kirjastoa, josta löytyy mm. kryptografiaan ja HTTP-yhteyksiin tarvittavat moduulit.

Tietoturva

Denossa ajettava ohjelma ei oletuksena pääse käsiksi levyllä oleviin tiedostoihin, tai internet-yhteyteen, jolloin esim. pieniä apuohjelmia voi ajaa turvallisemmin mielin. Verkkoyhteyksien osalta yhteyksiä voi myös rajoittaa domain-kohtaisesti, jotta ohjelmat eivät voi liikennöidä aivan minne sattuu.

Formatointi vakiona

Denossa on vakiona myös koodin formatointi/kaunistaminen. Toiminnon voi suorittaa kaikille projektissa oleville tiedostoille yksinkertaisesti seuravalla komennolla

deno fmt

tai jos haluaa esimerkiksi kaunistaa vain yhden koodi-tiedoston, voi sen puolestaan tehdä seuraavalla komennolla

deno fmt ugly.ts

Tulevaisuus

Denon edistymistä voi seurata projektin virallisen blogin kautta. Allekirjoittaneelle denon nykyinen 1.6-versio on toiminut niin hyvin, etten aio enää koskaan aloittaa omasta toimesta Node-projektia, vaan valinta on jatkossa aina deno.

🔥