Folder proyek JavaScript biasanya langsung ketahuan isinya: node_modules berisi puluhan ribu file, package.json penuh dependensi, dan tsconfig.json yang harus disetel dulu sebelum TypeScript mau jalan. Deno 2 memotong ritual itu semua. Kamu tulis satu file .ts, jalankan deno run, selesai. Tidak ada package manager terpisah, tidak ada build step, dan akses ke file atau jaringan dikontrol langsung oleh runtime-nya.

Deno dibuat oleh Ryan Dahl, orang yang sama yang menciptakan Node.js. Versi 2.0 membawa satu fitur yang mengubah segalanya: kompatibilitas penuh dengan npm, jadi paket-paket yang sudah kamu kenal bisa dipakai tanpa instalasi manual. Kalau kamu datang dari Node.js, saya sarankan baca panduan REST API dengan Node.js dan Express sebagai pembanding. Kalau penasaran dengan runtime JavaScript lain yang sama ngebutnya, ada juga Belajar Bun.

Instalasi Deno

Di Linux dan macOS, instalasi cuma butuh satu perintah:

bash
curl -fsSL https://deno.land/install.sh | sh

Pengguna macOS bisa juga lewat Homebrew (brew install deno), dan Windows lewat PowerShell: irm https://deno.land/install.ps1 | iex. Setelah itu tutup dan buka kembali terminal, lalu cek versinya:

bash
deno --version

Menjalankan TypeScript Tanpa Konfigurasi

Buat file halo.ts dengan isi seperti ini:

typescript
// halo.ts
const nama = "Deno";

function sapa(n: string): string {
  return `Halo, ${n}! Kamu jalan tanpa tsconfig apa pun.`;
}

console.log(sapa(nama));
bash
deno run halo.ts

Deno membaca TypeScript secara native. Tidak perlu tsc, tidak perlu tsconfig.json, tidak perlu bundler. File .js juga langsung jalan dengan cara yang sama, dan modul ES bekerja secara bawaan. Kalau kamu masih asing dengan tipe-tipenya, tutorial TypeScript dari nol ini jadi titik awal yang pas.

Alat Bawaan: fmt, lint, dan test

Deno membawa formatter, linter, dan test runner sendiri — tidak perlu install Prettier, ESLint, atau Vitest untuk kasus sehari-hari. Mulai dengan deno init untuk membuat kerangka proyek, lalu tulis fungsi dan tesnya.

typescript
// main.ts
export function tambah(a: number, b: number): number {
  return a + b;
}

export function bagi(a: number, b: number): number {
  if (b === 0) {
    throw new Error("Tidak bisa bagi dengan nol");
  }
  return a / b;
}
typescript
// main_test.ts
import { assertEquals, assertThrows } from "jsr:@std/assert";
import { tambah, bagi } from "./main.ts";

Deno.test("tambah menjumlahkan dua angka", () => {
  assertEquals(tambah(2, 3), 5);
});

Deno.test("bagi melempar error saat pembagi nol", () => {
  assertThrows(() => bagi(10, 0), Error, "Tidak bisa bagi dengan nol");
});
bash
deno test

Kalau kamu juga ingin merapikan dan memeriksa kode, tinggal jalankan dua perintah ini:

bash
deno fmt
deno lint

deno fmt merapikan semua file sesuai gaya standar Deno, dan deno lint menandai pola yang bermasalah. Tidak ada satu pun file konfigurasi seperti .eslintrc atau .prettierrc yang perlu kamu pelihara.

Import Paket npm Tanpa npm install

Ini fitur yang paling sering bikin orang kaget waktu pindah ke Deno. Kamu bisa import paket npm langsung dari kode dengan prefiks npm:, dan Deno menyimpannya di cache global, bukan di folder proyekmu. Contohnya Zod untuk validasi skema:

typescript
// npm_compat.ts
import { z } from "npm:zod@3";

const SkemaArtikel = z.object({
  judul: z.string().min(1),
  kategori: z.enum(["python", "web", "devops"]),
});

const data = { judul: "Belajar Deno", kategori: "web" };
console.log(SkemaArtikel.parse(data));
bash
deno run -A npm_compat.ts

Prefiks npm:zod@3 memberitahu Deno untuk mengambil Zod versi 3 dari registry npm saat pertama kali dijalankan. Tidak ada node_modules yang menumpuk, dan tiap proyek bisa memakai versi berbeda tanpa bentrok.

Flag -A memberi semua izin sekaligus, nyaman buat ngoding. Untuk produksi, gunakan izin granular seperti --allow-net dan --allow-read supaya aplikasi hanya bisa mengakses yang benar-benar dibutuhkan.

Membangun REST API dengan Hono

Hono adalah framework HTTP kecil yang sangat populer di ekosistem Deno dan edge runtime. Kombinasi Deno + Hono menghasilkan server ringan yang bisa di-deploy ke Deno Deploy tanpa perubahan apa pun. Buat file server.ts:

typescript
// server.ts
import { Hono } from "npm:hono@4";

const app = new Hono();

app.get("/", (c) => c.text("Halo dari Deno + Hono!"));

app.get("/artikel/:id", (c) => {
  const id = c.req.param("id");
  return c.json({ id, judul: `Artikel nomor ${id}` });
});

app.post("/artikel", async (c) => {
  const body = await c.req.json();
  return c.json({ pesan: "Artikel tersimpan", data: body }, 201);
});

Deno.serve(app.fetch);
bash
deno run -A server.ts

Server langsung mendengarkan di port 8000. Uji dengan curl:

bash
curl http://localhost:8000/
curl http://localhost:8000/artikel/7
curl -X POST http://localhost:8000/artikel \
  -H "Content-Type: application/json" \
  -d '{"judul":"Belajar Deno 2"}'

Struktur ini mirip Express, tapi tanpa app.listen manual — Deno.serve yang menangani loop server-nya. Kalau kamu lebih nyaman dengan Express, perbandingan langsungnya ada di tutorial Node.js + Express.

Simpan Data dengan Deno KV

Deno punya key-value store bawaan bernama Deno KV. Untuk prototipe atau aplikasi kecil, kamu tidak perlu menyiapkan Redis atau database eksternal dulu.

typescript
// kv.ts
const kv = await Deno.openKv();

await kv.set(["artikel", "deno"], { judul: "Belajar Deno 2", views: 128 });

const hasil = await kv.get(["artikel", "deno"]);
console.log(hasil.value); // { judul: "Belajar Deno 2", views: 128 }

for await (const entry of kv.list({ prefix: ["artikel"] })) {
  console.log(entry.key, entry.value);
}
bash
deno run -A kv.ts

Data tersimpan di file lokal dan tetap ada setelah proses selesai. Deno KV juga tersedia di Deno Deploy, jadi aplikasi yang kamu deploy langsung dapat penyimpanan persisten tanpa mengubah satu baris pun.

Kompilasi ke Binary Tunggal

Satu perintah lagi dan server-mu jadi file eksekusi mandiri yang bisa dikirim ke server tanpa perlu install Deno di sana:

bash
deno compile -A server.ts
./server

File server yang dihasilkan sudah membawa runtime Deno di dalamnya, jadi mesin tujuan cukup Linux biasa tanpa dependensi tambahan. Mulai dari sini, coba port salah satu endpoint Express-mu ke Hono, lalu tambahkan Deno KV ke API yang tadi kamu buat untuk menyimpan data artikelnya.