Deno NodeJS

Geçtiğimiz sene içerisinde Node.js kurucusu olan Ryan Dahl, 1.5 yıl boyunca JavaScript için yeni bir runtime olan ve Node.js’de bulunan problemleri çözeceği varsayılan Deno üzerinde çalıştı.

Yanlış anlaşılmasın; Node, JavaScript kullanımı ve geniş ekosistemi sebebiyle kendince server tarafında mükemmel bir JavaScript runtime. Ancak Dahl, daha çok düşünülmesi gereken bir kaç şeyi de itiraf ediyor: güvenlik, modüller ve bağımlılıklar (dependencies)…

 

Deno nedir ve başlıca özellikleri nelerdir?

Deno, Google tarafından JavaScript için runtime engine olarak geliştirilen V8 üzerine kurulmuş güvenli bir TypeScript runtime’dır.

Deno’nun alt yapısında bulunan teknolojiler:

  • Rust (Deno’nun çekirdeği Rust ile yazıldı. Node’un ise C++ ile yazıldı.)
  • Tokio (Rust’ta yazılan bir event loop)
  • TypeScript (Deno hem JavaScript hem de TypeScript’i desteklemektedir.)
  • V8 (Yukarda belirtilmişti.)

Şimdi Deno’nun ne özellikler sunduğuna bir bakalım.

Güvenlik (izinler)

Deno’yu ön plana çıkartaran en önemli özelliklerinden bir tanesi de güvenliğin üzerine oldukça düşmesi.

Node’un aksine, Deno varsayılan olarak kodu sandbox’ta çalıştırır. Yani runtime’ın erişimi olmadığı şeyler:

  • Dosya sistemi
  • Network
  • Diğer scriptlerin çalıştırılması
  • Ortam değişkenleri

Şimdi de izin sisteminin nasıl çalıştığını inceleyelim.

(async () => {
const encoder = new TextEncoder();
const data = encoder.encode('Hello world\n');

await Deno.writeFile('hello.txt', data);
await Deno.writeFile('hello2.txt', data);
})();

 

Yukardaki kod bloğu Hello world mesajı içerecekleri şekilde hello.txt ve hello2.txt olarak adlandırılan iki tane metin dosyası oluşturuyor. Kod sandbox içerisinde yürütülüyor, yani dosya sistemine erişimi yok.

Ayrıca yazma işlemini Node’da yaptığımız gibi fs modülü yerine, Deno namespace’ini kullanarak yaptığımıza dikkat edelim. Deno namespace’i çokça temel yardımcı fonksiyon sağlamakta. Bu namespace’i kullanarak ilerleyen kısımlarda üzerinde duracağımız tarayıcı uyumluluğunu kaybediyoruz.

Yukardaki kod bloğunu çalıştırmaya kalktığımız zaman:

deno run write-hello.ts

Aşağıdaki mesajla karşılaşıyoruz:

Deno requests write access to "/Users/user/folder/hello.txt".
Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]

Aslında bu mesajla iki kere karşılaşıyor olacağız. Tabii ki eğer ilkinde allow always seçeneğini seçersek 2. kere sormayacaktır.

Eğer deny seçeneğini seçersek PermissionDenied hatası ile karşılaşacağız ve hata-yakalama (error-handling) için gerekli işlemleri yapmıyorsak işlem terminate olacak yani komple sona erecek.

Eğer aşağıdaki komut ile kod bloğunu çalıştırırsak:

deno run --allow-write write-hello.ts

Herhangi bir istek, uyarı ile karşılaşmaksızın işlemimiz yapılmış olacak yani iki dosya da oluşturulmuş olacaktır. Dosya sistemi için --allow-write flagi bir kenara, ayrıca --allow-net , --allow-env ve --allow-run flagleri de sırasıyla; network isteklerini, ortama erişmeyi ve alt işlemleri (subprocesses) etkinleştirir.

Modüller

Deno, aynı tarayıcılar gibi modülleri URL’ler aracılığıyla yükler. Çoğu insan server tarafında URL ile dahil etme işlemini görünce şaşkına dönüyor. Fakat bunun da bir inceliği var tabii ki:

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

Paketleri URL’leri ile import etmekteki mantık nedir, diye soruyor musunuz? Aslında cevabı basit: Deno npm gibi merkezi kayıt (centralized registry) yapmaksızın URL’ler beraberinde paketleri dağıtılabilir halde kullanıyor. npm ‘in seyrettiği yolda bir çok problem olduğu burada açıklanmıştır.

Bu yöntemi kullanarak paket geliştiricilerine, kodlarını nerede isterlerse orada host etme imkanı sağlayabiliriz.

Uygulamamızı başlattığımızda Deno, import ettiğimiz tüm paketleri yükler ve cachede saklar. Bir kere cachede sakladığı paketi biz --reload flagini belirtmediğimiz müddetçe tekrar tekrar yüklemez.

Aslında burada sorulması gereken bir kaç soru var:

Ya websitesi çökerse?

Merkezi kayıt sistemi olmazsa paketi host eden websitesi herhangi bir sebepten dolayı çökmesi söz konusu. Geliştirme sırasında ve hatta kötüsü projemiz ürün halini aldıktan sonra çökmesi durumunda oldukça risk arz ediyor.

Belirttiğimiz gibi, Deno indirilmiş paketleri cachede tutmaktadır. Cachei yerel diskimizde sakladıktan sonra Deno’nun geliştiricileri onu versiyon kontrol sistemimizde kontrol etmemizi ve repositoryde tutmamızı öneriyorlar. Böylelikle paketin websitesi çökse bile tüm geliştiriciler indirilmiş versiyona kolaylıkla erişebileceklerdir.

Deno cache’i $DENO_DIR ortam değişkeni altında belirtilen klasörde saklar. Eğer değişkeni kendimiz manuel ayarlamazsak, sistemin varsayılan cache dizini olarak belirlenen yer ayarlanacaktır. Yerel repositoryimizde nerede istersek orada$DENO_DIR ayarını yapabiliriz ve versiyon kontrol sistemi içerisinde kontol edebiliriz.

Daima URL ile mi import etmek zorundayım?

Sürekli URL yazmak sıkıcı olacaktır. Deno sağ olsun bunu önlemek için önümüze iki seçenek koymuş.

İlk seçenek yerel bir dosyaya import edilmiş modülü tekrar export etmek, şu şekilde:

export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";

Yukardaki dosyaya local-test-utils.ts diyelim. Şimdi tekrar test ve assertEquals fonksiyonlarını kullanmak istersek şu şekilde işimizi görebiliriz:

import { test, assertEquals } from './local-test-utils.ts';

Yani URL’den yüklenip yüklenmediği çok fark etmiyor açıkçası.

İkinci seçenek belirteceğimiz JSON dosyasında bir imports haritası oluşturmak:

{
"imports": {
"http/": "https://deno.land/std/http/"
}
}

Ve sonrasında şu şekilde import edebiliriz:

import { serve } from "http/server.ts";

Bu yöntemin çalışması için Deno’ya bu importları barındıran dosyayı --importmap flagiyle bildirmemiz gerekiyor:

deno run --importmap=import_map.json hello_server.ts

Paket versiyonlamadan ne haber?

Versiyon oluşturma paket sağlayıcıları tarafından desteklenmelidir. Fakat client tarafından URL’deki sürüm numarasını şu şekilde ayarlamamız mümkün: https://unpkg.com/liltest@0.0.5/dist/liltest.js

Tarayıcı Uyumluluğu

Deno tarayıcı-uyumunu hedefler. Teknik olarak konuşmak gerekirse ES modüllerini kullanırken uygulamamızı tarayıcıda kullanmaya hazır hale getirmek için webpack gibi herhangi bir build tool ihtiyacımız olmayacaktır.

Fakat Babel gibi araclar kodumuzu ES5 versiyonuna transpile edecektir ve neticede yeni özellikler desteklenmeyen tarayıcılar tarafından da kodumuz çalışır halde olacaktır. Fakat bu, son dosyaya gereksiz kod ekleme ve çıktı dosyasını şişirmeyi deberaberinde getiriyor.

Ana hedefimizin ne olduğuna karar vermek ve buna göre seçim yapmak bize bağlı.

TypeScript Desteği

Deno TypeScript kullanımını ekstra herhangi bir config dosyasına hiç ihtiyaç bırakmadan gayet kolay hale getiriyor. Bununla beraber bir problem yaşamadan Deno’da düz JavaScript ile programlar yazmak ve çalıştırmak da mümkün.

Özet

Deno, bir süredir sürekli büyüyen TypeScript ve JavaScript için yeni bir runtime olan ilginç bir projedir. Ancak yine de ürünlerde kullanımı için uzun bir yolu var.

Decentralized yaklaşımı JavaScript ekosisteminde ile npm ve centralized yaklaşıma dair büyük bir farkındalık oluşturur.

 

Bu çeviriyi ele aldığım gün Deno’nun 1.0.0 versiyonu yayınlanmış oldu. Eğer daha da detaylı Deno’nun gelişimini takip etmek istiyorsanız GitHub reposuna buradan ulaşabilirsiniz.

Orijinalinden çeviridir.

Yazar

Ahmet Buğra Çakıcı

Full Stack Developer

Bir Cevap Yazın