Tarayıcıda yerel dosya işleme nasıl çalışır
Hiçbir şey yüklenmiyorsa işi gerçekte ne yapıyor ve nerede yapıyor?
Burada “yerel” ne demek
Alışılmış bir çevrimiçi dönüştürücü, yükleme uç noktası olan bir web sitesidir. Dosyanız denetiminizde olmayan bir makineye iletilir, orada işlenir, bir süre saklanır ve size indirme olarak geri sunulur. Yerel işleme, bu cümlenin ortasını kaldırır: dosyanızı okuyan kod, zaten açık olan tarayıcı sekmenizin içinde, sizin işlemcinizde çalışır ve sonuç yine sizin diskinize yazılır.
Site yine de ağ üzerinden alınır — HTML, stil sayfaları, betikler ve WebAssembly modüllerinin hepsi, her web sayfasında olduğu gibi bir sunucudan gelir. Ayrım yöndedir. Program kodu aşağı iner; dosyanız yukarı çıkmaz.
Parçalar tarayıcının içinde zaten var
| Özellik | Neyi sağlar |
|---|---|
| File ve Blob API'leri | Kullanıcının seçtiği ya da sürükleyip bıraktığı bir dosyanın baytlarını, form göndermeden okumak |
| Web Workers | Ağır işleri arka plandaki bir iş parçacığında çalıştırmak, böylece arayüz yanıt vermeyi sürdürür |
| WebAssembly | Derlenmiş C, C++ veya Rust codec kitaplıklarını yerel hıza yakın çalıştırmak |
| Canvas ve OffscreenCanvas | Görüntülerin kodunu çözmek, çizmek, yeniden boyutlandırmak ve yeniden kodlamak |
| WebCodecs | Tarayıcının kendi donanım hızlandırmalı video kodlayıcılarına ve kod çözücülerine ulaşmak |
| WebGPU | Model çıkarımını ve paralel piksel işlerini grafik işlemcisinde çalıştırmak |
| File System Access | Desteklendiği yerde sonucu doğrudan kullanıcının seçtiği konuma yazmak |
Bunların hiçbiri egzotik değil. Bu, bir sekmede hesap tablolarını, tasarım araçlarını ve oyunları çalıştıran platformun aynısı. Alışılmadık olan tek karar, buna bir sunucu eklemeyi reddetmek.
Bir dosyanın izlediği yol
- Bir dosya seçersiniz. Tarayıcı sayfaya ona bir tutamaç verir — kopya değil, bir başvuru.
- Sayfa, uzantıya güvenmek yerine gerçek dosya türünü imzasından belirlemek için ilk baytları okur.
- İşin ne kadar bellek gerektirdiğini tahmin eder ve bu, cihazın güvenle sağlayabileceğini aşıyorsa işi reddeder ya da kuyruğa alır.
- Baytlar bir Web Worker'a aktarılır. Bir ArrayBuffer'ı aktarmak onu kopyalamaz, sahipliğini taşır; böylece büyük bir dosya bellekte iki kez bulunmaz.
- Worker'ın içinde, asıl kod çözme ve kodlama işini bir WebAssembly codec'i ya da bir platform API'si yapar.
- Sonuç bayt olarak geri döner, bir Blob'a sarılır ve size indirme olarak sunulur ya da seçtiğiniz bir konuma yazılır.
- O Blob'a ait geçici URL iptal edilir ve arabellekler serbest bırakılır.
Değişen kısım neden WebAssembly
Görüntü ve video codec'leri, onlarca yıllık, özenle iyileştirilmiş C kodudur. Bunları JavaScript'te yeniden yazmak hiçbir zaman gerçekçi olmadı. WebAssembly, tarayıcıların bir kum havuzunda, yerel koda yakın hızda çalıştırdığı taşınabilir bir ikili komut biçimidir; bu da mevcut kitaplıkların olduğu gibi derlenip tarayıcıya gönderilebilmesi anlamına gelir.
Kum havuzu en az hız kadar önemlidir. Bir WebAssembly modülünün dosya sisteminize, ağınıza ya da diğer sekmelerinize kendiliğinden erişimi yoktur. Yalnızca sayfanın ona verdiği belleği görür, başka hiçbir şeyi değil. Kötü niyetli ya da yalnızca hatalı bir codec, başıboş dolaşıp kendisine verilmemiş bir şeyi okuyamaz.
Ağa hâlâ ne dokunuyor ve bu neden sizin dosyanız değil
Ağ üzerinden üç şey gelir: sayfanın kendisi, açtığınız aracın motoru ve — arka plan kaldırma için — model ağırlıkları. Üçü de FileSlimmer'ın kendi statik dosyalarıdır ve sizin baytlarınızdan biri bile okunmadan önce FileSlimmer'ın kendi kökeninden alınır. Bunlar birer indirmedir, önbelleğe alınabilirler ve ilk kullanımdan sonra hiç ağ olmadan tarayıcının kendi önbelleğinden sunulabilirler.
O noktadan sonrası tümüyle yereldir. Motorlar dosya baytlarını yalnızca sayfadan postMessage ile alır; onlara bir şey gönderebilecekleri bir URL hiçbir zaman verilmez ve bir içerik güvenlik politikası, bir kod denese bile sayfanın nereye bağlanabileceğini kısıtlar.
Ödünleşimler, açıkça
| Değerlendirme | Tarayıcınızda | Sunucuda |
|---|---|---|
| Dosyanız nereye gider | Hiçbir yere | Denetiminizde olmayan bir makineye |
| Hız | Cihazınız ne yapabiliyorsa o kadar | İşletmeci ne kadarına para ödediyse o kadar |
| Çok büyük dosyalar | Tarayıcı belleğiyle sınırlı | İşletmecinin sınırlarıyla sınırlı |
| Çevrimdışı çalışır mı | Motor önbelleğe alındıktan sonra evet | Hayır |
| Sıra dışı biçimler | Yalnızca WebAssembly'ye derlenebilenler | İşletmeci ne kurarsa |
| Bin dosyalık toplu iş | Cihazla kısıtlı | Genellikle daha uygun |
Yerel işleme her koşulda daha iyi değildir. Dosya özelse, cihaz yeterliyse ve iş belleğe sığıyorsa daha iyidir. Tek bir makinenin taşıyabileceğinden çok fazlasını işlemeniz gerektiğinde ise sunucu daha iyidir. Hangi durumda olduğunuz konusunda net olmak, bir yaklaşımın her yerde kazandığında ısrar etmekten daha yararlıdır.
Bunun iddia etmedikleri
Bu, yalnızca bu uygulamanın ne yaptığına ilişkin bir açıklamadır. Açtığınız herhangi bir sayfanın içeriğini okuyabilen tarayıcı eklentileriniz hakkında, dokunduğunuz her dosyayı inceleyebilen işletim sisteminiz hakkında ya da bir siteyi ziyaret ettiğinizi görebilen ağ operatörünüz hakkında bir iddia değildir. Bunlar hiçbir web sitesinin erişebileceği alanda değildir ve size aksini söyleyen bir araç iddiasını abartıyordur.
İddia dar ve denetlenebilir: seçtiğiniz dosyalar bu tarayıcıda yerel olarak işlenir ve FileSlimmer tarafından yüklenmez. Bir sonraki rehber, buna inanmak yerine bunu kendinizin nasıl doğrulayacağını anlatıyor.
Bunun için araçlar
Kaynaklar
- W3C — File API
- W3C — WebAssembly Core Specification
- WHATWG — HTML Standard, Web Workers
- W3C — WebCodecs