web_platform_apis
Deno, web ve bulut geliştirmeyi standart Web Platform API'leri (örneğin, fetch
, WebSockets ve daha fazlası) kullanarak özel API'ler yerine basitleştirir. Bu, eğer daha önce tarayıcı için bir şeyler geliştirdiyseniz, muhtemelen Deno'yu zaten tanıdığınız anlamına gelir ve eğer Deno öğreniyorsanız, web bilgilerinize de yatırım yapıyorsunuz demektir.
Desteklenen Web API'lerini keşfedin
Aşağıda Deno'nun desteklediği bazı standart Web API'leri vurgulanacaktır.
Deno'da bir Web Platform API'sinin mevcut olup olmadığını kontrol etmek için MDN'deki arabirime tıklayabilir ve Tarayıcı Uyumluluğu tablosuna bakabilirsiniz.
fetch
fetch
API'si HTTP istekleri yapmak için kullanılabilir. Bu, WHATWG fetch
spesifikasyonuna uygun şekilde uygulanmıştır.
Spec sapmaları
Deno'da bazı önemli sapmalar mevcuttur. Bunlara dikkat edilmesi önerilmektedir.
- Deno kullanıcı aracında bir çerez kavanozu bulunmamaktadır. Bu nedenle, bir yanıt üzerindeki
set-cookie
başlığı işlenmez veya görünür yanıt başlıklarından filtrelenmez. - Deno aynı köken politikasını takip etmez, çünkü Deno kullanıcı aracı şu anda köken kavramına sahip değildir ve bir çerez kavanozu yoktur. Bu, Deno'nun kimlik doğrulama verilerini kökenler arası sızdırmalara karşı koruması gerekmediği anlamına gelir. Bu nedenle Deno, WHATWG
fetch
spesifikasyonunun aşağıdaki bölümlerini uygulamamaktadır:- Bölüm
3.1. 'Origin' başlığı
. - Bölüm
3.2. CORS protokolü
. - Bölüm
3.5. CORB
. - Bölüm
3.6. 'Cross-Origin-Resource-Policy' başlığı
. Atomic HTTP yönlendirme işlemleri
.opaqueredirect
yanıt türü.
- Bölüm
redirect
modumanual
olan birfetch
,opaqueredirect
yanıtı yerinebasic
yanıtı döndürecektir.- Spesifikasyon,
file:
URL'lerinin nasıl işleneceği konusunda belirsizdir. Firefox,file:
URL'lerini alabilen tek ana akım tarayıcıdır ve bu durumda bile varsayılan olarak çalışmaz. Deno 1.16 itibarıyla, Deno yerel dosyaları almayı desteklemektedir. Detaylar için bir sonraki bölüme bakın. request
veresponse
başlık korumaları uygulanmıştır, ancak tarayıcılara kıyasla hangi başlık adlarının izin verildiği konusunda herhangi bir kısıtlama yoktur.
Yerel dosyaların alınması
Deno, file:
URL'lerini almayı destekler. Bu, sunucuda ve yerelde aynı kod yolunu kullanan kod yazmayı kolaylaştırır ve hem Deno CLI hem de Deno Deploy ile çalışan kod yazmayı da kolaylaştırır.
Yerel dosyaların alınması işlemi için özen gösterilmelidir.
Deno yalnızca mutlak dosya URL'lerini destekler, yani fetch("./some.json")
çalışmayacaktır. Ancak, --location
belirtilirse, göreceli URL'ler --location
'ı temel alır, ancak bir file:
URL'si --location
olarak geçilemez.
Mevcut modüle referansla bir kaynağı almak için, hangi modül yerel veya uzaktıysa, import.meta.url
'yi temel alarak kullanmalısınız. Örneğin:
const response = await fetch(new URL("./config.json", import.meta.url));
const config = await response.json();
Yerel dosyaların alınmasıyla ilgili notlar:
- Kaynakları okumaya izin verilir, bu nedenle uygun bir
--allow-read
izni gereklidir. - Yerel alımlar yalnızca
GET
yöntemini destekler ve başka bir yöntem kullanıldığında sözleşmeyi reddeder. - Mevcut olmayan bir dosya, belirsiz bir
TypeError
ile sözleşmeyi reddeder. Bu, parmak izi saldırılarını önlemek içindir.
CustomEvent ve EventTarget
DOM Etkinlik API'si
, bir uygulamada meydana gelen olayları iletmek ve dinlemek için kullanılabilir. Bu, WHATWG DOM spesifikasyonuna uygun şekilde uygulanmıştır.
Spec sapmaları
Deno'daki EventTarget uygulaması bazı farklılıklar barındırmaktadır.
- Olaylar kabarmaz, çünkü Deno'nun bir DOM hiyerarşisi yoktur, yani olayların kabarması/yakalaması için bir ağaç yoktur.
timeStamp
özelliği her zaman0
olarak ayarlıdır.
Yazım
Uygulanan web API'leri için TypeScript tanımları lib.deno.shared_globals.d.ts
ve lib.deno.window.d.ts
dosyalarında bulunabilir.
İşçilere özgü tanımlar lib.deno.worker.d.ts
dosyasında bulunabilir.
Location
Deno, webden location
globalini destekler.
Konum bayrağı
Deno sürecinde kullanılacak bir konum için URL'sini kullanabileceğimiz bir "web sayfası" yoktur. Bunun yerine, kullanıcıların CLI üzerinde --location
bayrağını kullanarak bir belge konumunu taklit etmelerine izin verilir. Bu, bir http
veya https
URL'si olabilir.
// deno run --location https://example.com/path main.ts
console.log(location.href);
// "https://example.com/path"
Eğer --location
geçmezseniz, location
globaline her erişim hatası verecektir.
// deno run main.ts
console.log(location.href);
// hata: Uncaught ReferenceError: Access to "location", run again with --location <href>.
location
veya herhangi bir alanını ayarlamak, normalde tarayıcılarda yönlendirmelere neden olur. Bu Deno'da geçerli değildir; bu nedenle, bu durumda hata verecektir.
// deno run --location https://example.com/path main.ts
location.pathname = "./foo";
// hata: Uncaught NotSupportedError: Cannot set "location.pathname".
Genişletilmiş kullanım
Web'de, kaynak çözümü (modüller hariç) genellikle location.href
değerini kullanarak herhangi bir göreceli URL'yi temel alır. Bu, Deno'nun benimsemiş olduğu bazı web API'lerini etkiler.
Fetch API
// deno run --location https://api.github.com/ --allow-net main.ts
const response = await fetch("./orgs/denoland");
// "https://api.github.com/orgs/denoland" adresine alım yapar.
Yukarıdaki fetch()
çağrısı, --location
bayrağı geçirilmediyse hata verir, çünkü temel alacak bir web-analogu konumu yoktur.
Web Storage
Web Storage API'si
, dize anahtar ve değerlerini depolamak için bir API sağlar. Verilerin saklanması bir tarayıcıya benzer şekilde çalışır ve 10MB depolama limiti vardır. Global sessionStorage
nesnesi yalnızca mevcut yürütme bağlamı için veriyi saklarken, localStorage
verileri yürütmeden yürütmeye saklar.
Deno'da veri saklama alanları ile ilgili yeni kurallar mevcut.
Bir tarayıcıda localStorage
, verileri kök başına özgü saklar (etkili biçimde protokol artı ana makine adı artı port). Deno 1.16 itibarıyla, Deno'nun veri saklamak için benzersiz bir saklama alanı belirleme kuralları vardır:
--location
bayrağını kullanırken, konumun kökeni veriyi benzersiz bir şekilde saklamak için kullanılır. Bu,http://example.com/a.ts
,http://example.com/b.ts
vehttp://example.com:80/
konumlarının aynı depolamayı paylaşacağı, ancakhttps://example.com/
'un farklı olacağı anlamına gelir.- Eğer bir konum belirleyici yoksa, ancak bir
--config
yapılandırma dosyası belirtilmişse, o yapılandırma dosyasının mutlak yolu kullanılır. Yanideno run --config deno.jsonc a.ts
vedeno run --config deno.jsonc b.ts
aynı depolamayı paylaşırken,deno run --config tsconfig.json a.ts
farklı olacaktır.
localStorage
'dan öğeleri ayarlamak, almak ve kaldırmak için aşağıdakileri kullanabilirsiniz:
// localStorage'da bir öğe ayarlamak
localStorage.setItem("myDemo", "Deno Uygulaması");
// localStorage'dan bir öğe okumak
const cat = localStorage.getItem("myDemo");
// localStorage'dan bir öğeyi kaldırmak
localStorage.removeItem("myDemo");
// localStorage'daki tüm öğeleri kaldırmak
localStorage.clear();
Web Workers
Deno, Web Worker API'sini
destekler.
İşçiler, kodu birden fazla iş parçacığında çalıştırmak için kullanılabilir. Her Worker
örneği ayrı bir iş parçacığında çalıştırılır ve yalnızca o işçi için ayrılmıştır.
Yeni bir işçi oluştururken type: "module"
seçeneğini vermek önemlidir.
Ana işçi içerisindeki göreceli modül belirtimleri yalnızca CLI'de --location
geçildiğinde desteklenmektedir. Bu taşınabilirlik için önerilmez. Bunun yerine, bir belirteç oluşturmak için URL
yapıcısını ve import.meta.url
'yi kullanarak kolayca bir belirtici oluşturabilirsiniz. Ancak, özel işçilerin bir konumu vardır ve bu yetenek varsayılan olarak mevcuttur.
// İyi
new Worker(import.meta.resolve("./worker.js"), { type: "module" });
// Kötü
new Worker(import.meta.resolve("./worker.js"));
new Worker(import.meta.resolve("./worker.js"), { type: "classic" });
new Worker("./worker.js", { type: "module" });
Normal modüllerde olduğu gibi, işçi modüllerinde de üst düzey await
kullanabilirsiniz. Ancak, mesajların kaybolabileceği için, ilk await
işleminden önce mesaj işleyicisini kaydetmeyi unutmayın. Bu, Deno'da bir hata değildir, sadece özelliklerin talihsiz bir etkileşimidir ve bu durum modül işçilerini destekleyen tüm tarayıcılarda da gerçekleşir.
import { delay } from "jsr:@std/async@1/delay";
// İlk await: bir saniye bekler, ardından modülü çalıştırmaya devam eder.
await delay(1000);
// Mesaj işleyici, o 1 saniyeden sonra ayarlanır, böylece o süre içinde işçiye ulaşan bazı mesajlar kaydedilmemiş olabilir.
self.onmessage = (evt) => {
console.log(evt.data);
};
Oluşturma izinleri
Yeni bir Worker
örneği oluşturmak, dinamik bir import ile benzerdir; bu nedenle Deno, bu eylem için uygun izin gerektirir.
Yerel modülleri kullanan işçiler için; --allow-read
izni gereklidir:
new Worker(import.meta.resolve("./worker.ts"), { type: "module" });
console.log("merhaba dünya");
self.close();
$ deno run main.ts
hata: Uncaught PermissionDenied: read access to "./worker.ts", run again with the --allow-read flag
$ deno run --allow-read main.ts
merhaba dünya
Uzak modülleri kullanan işçiler için; --allow-net
izni gereklidir:
new Worker("https://example.com/worker.ts", { type: "module" });
// Bu dosya https://example.com/worker.ts adresinde barındırılmaktadır
console.log("merhaba dünya");
self.close();
$ deno run main.ts
hata: Uncaught PermissionDenied: net access to "https://example.com/worker.ts", run again with the --allow-net flag
$ deno run --allow-net main.ts
merhaba dünya
Deno'yu bir işçide kullanma
const worker = new Worker(import.meta.resolve("./worker.js"), {
type: "module",
});
worker.postMessage({ filename: "./log.txt" });
self.onmessage = async (e) => {
const { filename } = e.data;
const text = await Deno.readTextFile(filename);
console.log(text);
self.close();
};
merhaba dünya
$ deno run --allow-read main.js
merhaba dünya
İşçi izinlerini belirtme
Bu istikrarsız bir Deno özelliğidir. Daha fazla bilgi için istikrarsız özellikler sayfasına göz atın.
İşçi için mevcut olan izinler, CLI izin bayraklarına benzer; bu, orada etkinleştirilen her izin düzeyinin İşçi API'si düzeyinde devre dışı bırakılabileceği anlamına gelir. Her bir izin seçeneği ile ilgili daha ayrıntılı bir açıklama burada bulunabilir.
Varsayılan olarak bir işçi, oluşturulduğu iş parçacığından izinlerini devralır. Ancak, kullanıcıların bu işçinin erişimini sınırlamasına olanak tanımak için işçi API'sinde deno.permissions
seçeneğini sağlıyoruz.
Ayrıntılı erişim destekleyen izinler için, işçinin erişebileceği kaynakların bir listesini geçebilir ve yalnızca açma/kapama seçeneği olanlar için sırasıyla true/false
geçebilirsiniz:
const worker = new Worker(import.meta.resolve("./worker.js"), {
type: "module",
deno: {
permissions: {
net: [
"deno.land",
],
read: [
new URL("./file_1.txt", import.meta.url),
new URL("./file_2.txt", import.meta.url),
],
write: false,
},
},
});
Detaylı erişim izinleri, hem mutlak hem de göreceli yolları argüman olarak alır, ancak göreceli yolların işçi örneğinin oluşturulduğu dosyaya göre çözüldüğünü göz önünde bulundurun, işçi dosyasının bulunduğu yere göre değil:
const worker = new Worker(
new URL("./worker/worker.js", import.meta.url).href,
{
type: "module",
deno: {
permissions: {
read: [
"/home/user/Documents/deno/worker/file_1.txt",
"./worker/file_2.txt",
],
},
},
},
);
Diğer API'lerin spesifikasyondan sapmaları
Cache API
Yalnızca aşağıdaki API'ler uygulanmıştır:
- CacheStorage::open()
- CacheStorage::has()
- CacheStorage::delete()
- Cache::match()
- Cache::put()
- Cache::delete()
Tarayıcılara kıyasla birkaç farklılık vardır:
- API'lere göreceli yollar geçemezsiniz. İstek, bir Request veya URL örneği ya da bir URL dizesi olabilir.
match()
&delete()
henüz sorgu seçeneklerini desteklememektedir.