- Web tarayıcısının verimli biçimde gecikmeli yükleme (lazy-loading) yapabildiği tek HTML arşiv dosyası biçimi; tüm varlıkları içerirken aynı anda statiklik, tek dosya yapısı ve verimlilik sağlıyor
- HTML ve JavaScript başlığının arkasına tarball biçimindeki özgün HTML ve varlıkları birleştiren; JS'nin HTTP Range istekleriyle yalnızca gereken bölümleri yüklediği bir yapı
- Mevcut SingleFile veya MHTML gibi çözümler statiklik ve tek dosya özelliğine sahip olsa da verimlilikten yoksundu; Gwtar bunu çözüyor
- Sunucu tarafında ek yapılandırma olmadan yalnızca standart tarayıcı özellikleriyle çalışıyor; Cloudflare gibi bazı ortamlarda MIME türü
x-gwtar kullanılıyor
- Büyük HTML sayfalarında korunabilirlik ve erişilebilirliği aynı anda sağlayarak, uzun vadeli web arşivleme ve yeniden üretilebilir araştırma materyali saklama için faydalı oluyor
Gwtar genel bakış
- Gwtar, tek bir HTML dosyasından oluşan yeni bir polyglot arşiv biçimi; tarayıcı HTTP Range istekleriyle yalnızca gereken kısımları yüklüyor
- Gwern.net'in büyük HTML arşivlerini sunmak için kullanılıyor
- HTML başlığındaki JS, dosyanın tamamının indirilmesini durduruyor ve gerekli varlıkları kısmi istekler (range request) ile yüklüyor
- Sonuçta sunucu yalnızca tek bir HTML dosyası sunuyor, ancak kullanıcı sadece ihtiyaç duyduğu varlıkları indiriyor
- Tüm işlevler standart tarayıcı özellikleriyle gerçekleştirildiğinden geleceğe dönük uyumluluk sağlanıyor
HTML arşivlerinin üçlü ikilemi
- HTML arşivlerinde statiklik, tek dosya olma, verimlilik özelliklerinden yalnızca ikisini karşılayabilen mevcut bir sınırlama var
- Örnek: SingleFile statik ve tek dosyalı ama verimsiz; WARC statik ve verimli ama tek dosya değil
- SingleFile ile oluşturulan anlık görüntüler eksiksiz statik sayfa sunuyor, ancak tüm varlıkları Base64 olarak satır içi eklediği için dosya boyutu yüzlerce MB'a çıkıyor
- Kullanıcı sayfanın yalnızca bir kısmına baksa bile tüm dosyayı indirmek zorunda kalıyor; bu da verimsizlik yaratıyor
- Gwern.net bunu çözmek için deconstruct_singlefile.php ile varlıkları ayırdı, ancak tek dosya olma özelliği kayboldu
Gwtar'ın teknik yaklaşımı
- HTTP Range istekleri kullanılarak dosyanın yalnızca bir bölümünü seçerek indirmek mümkün oluyor
- HTML + JS başlığının arkasına tarball ekleyen ardışık (concatenated) arşiv yapısı benimseniyor
- JS'nin
window.stop() komutuyla başlıktan sonraki indirme durduruluyor ve sadece gerekli varlıklar isteniyor
- Tarayıcı bunu normal HTML gibi render ediyor; JS de varlık isteklerini yakalayıp Range isteklerine dönüştürüyor
Üretim ve uygulama
- PHP betiği deconstruct_singlefile.php ile SingleFile HTML, Gwtar'a dönüştürülebiliyor
- JPG/PNG/GIF yeniden sıkıştırması ve PAR2 FEC (ileri hata düzeltme) verisi ekleme desteği var
- Tarayıcı, JS çalıştıktan sonra gereken varlıkları yalnızca Range istekleriyle yüklüyor; JS devre dışıysa tam dosya indirme yedek seçenek oluyor
- Standartlara dayandığı için sunucu yapılandırması veya ek yazılım gerektirmiyor; tek dosyadan yeniden çok dosyalı HTML'ye geri dönüştürülebiliyor
Performans ve uyumluluk
- Range istekleri desteklenmiyorsa tüm dosya indiriliyor, ancak gzip/Brotli sıkıştırması hız konusunda kısmen telafi sağlayabiliyor
- Cloudflare,
text/html yanıtlarındaki Range üstbilgisini kaldırdığı için Gwern.net bunu MIME türünü x-gwtar yaparak aşıyor
- Yerelde dosyayı görüntülemek mümkün değil :
- Bu durum SingleFileZ için de geçerli; çünkü tarayıcı güvenlik politikaları (CORS vb.) JS isteklerini engelliyor
- Talihsiz olsa da bunun kabul edilebilir bir ödünleşim olduğu düşünülüyor; yerel gezinme ise JS'ye bağımlı olmayan bir dosyaya dönüştürülerek çözülebilir
Genişletme özellikleri
- Gwtar dosyasının sonuna ek ikili veri (ör. FEC, imza, meta veri) eklenebiliyor
- PAR2 kullanılarak dosyanın bir kısmı bozulduğunda kurtarma yapılabiliyor
- GPG imzası HTML yorum biçiminde eklenerek bütünlük doğrulaması yapılabiliyor
- Gelecek sürümlerde varlık hash doğrulaması, otomatik prefetch, yerleşik sıkıştırma, çoklu sayfa desteği gibi planlar bulunuyor
Olası kullanım alanları
- Büyük HTML sayfaları veya araştırma veri kümeleri (ör. SQLite3) içeren yeniden üretilebilir bilimsel çalışmalar için uygun
- Veritabanı, tarayıcıda doğrudan Range istekleriyle yüklenip analiz edilebiliyor
- Uzun vadeli korunabilirlik ve erişilebilirliği aynı anda sağlayan bir web arşivleme biçimi olarak öneriliyor
Lisans ve gelecekteki geliştirmeler
- Gwtar belgeleri ve kodu CC-0 public domain olarak yayımlanmış
- Gelecek sürümde (v2) FEC'in zorunlu hale gelmesi, yerleşik sıkıştırma, çoklu belge desteği, yinelenen verilerin kaldırılmasının iyileştirilmesi gibi başlıklar değerlendiriliyor
1 yorum
Hacker News yorumları
Bugün ilk kez window.stop() diye bir şey öğrendim
Bu işlev, tarayıcının artık kaynak yüklemeyi durdurmasını sağlar
Başlıca tarayıcılar bunu zaten 10 yıldan uzun süredir destekliyor (MDN belgesi, Can I Use)
Kullanım örneği bu ekran görüntüsünde görülebilir
Daha fazla ayrıntıyı blog yazımda toparladım
Yine de sunucu merkezli mantıkta indirme ya da lazy-loading işini doğrudan uygulamaya çalışıyorsanız ilginç bir yaklaşım olabilir
Başlatma ya da yönlendirme scriptleri gibi özel durumlar dışında önermek zor
Ben kendi bundler'ım üzerinden dosyaları sıkıştırılmış base64 parçaları halinde yayımlıyorum; buna benzer bir yaklaşım
Eğer böyle tek dosyalı paylaşım ortamlarında çalışırsa, platformun bunu engelleyebileceğini düşünüyorum
PHP'de de benzer bir __halt_compiler() özelliği var; dosyanın sonuna yorum kullanmadan belge veya veri eklemek gerektiğinde kullanmıştım
Başta ilginç gelmişti ama bu biçimin yerel dosya olarak doğrudan açılamadığını görünce tereddüt ettim
Arşivleme formatıysa yerel erişim temel kullanım senaryolarından biri olmalı
Ama yerelde doğrudan açılamıyorsa bu avantajın büyük kısmı kayboluyor (backdoor pilot kavramına bakın)
Görseller, CSS ve JS'nin hepsi data-uri ile gömülebilir; fontlar da aynı şekilde
Hatta kelime işlemci belge formatları HTML kullansaydı daha esnek olurdu diye düşünüyorum
python -m http.servergibi bir komutla yerel sunucu açıp kolayca çözülebilirClaude komutuyla da yapılabilir
Yazar bunu görürse, arşiv formatına bir BASE64 ekran görüntüsü alanı, bir açıklama alanı ve bir ISO zaman damgası eklemesini isterdim
Hatta aynı URL'nin birden fazla sürümünü saklayabilse ve yinelenen varlık kaldırma özelliği olsa ideal olurdu
Yazarın WARC'a neden olumsuz baktığını anlamadım
Bana kalırsa Gwtar daha karmaşık ve daha az esnek görünüyor
SingleFile'in ZIP/HTML polyglot formatı için neden “statik ve tek dosyalı ama verimsiz” dendiğini merak ediyorum
Gwtar'a kıyasla hangi açıdan daha verimsiz olduğunu öğrenmek isterdim
Asıl mesele, tarayıcının tüm dosyayı indirmeden ihtiyaç duyduğu parçaları range request ile alabilmesi
Gerçekten harika bir fikir
Ben tek dosyalı HTML web uygulamalarının en uzun ömürlü yazılım biçimi olduğunu düşünüyorum
Benim yaptığım örnekler arasında FuzzyGraph ve HyperVault var
Ben de benzer bir şeyi Service Worker düzeyinde uygulamayı düşünmüştüm
Sayfayı olduğu gibi bırakıp tüm HTTP isteklerini yakalama fikriydi
window.stop() gibi, HTML'nin bir kısmını alıp geri kalanını varlık blob'ları olarak işleyen bir yapı
Service Worker'ın kendisini dataURI olarak gömersiniz, böylece tamamen tek dosya olur
İlginç ama yerel dosyada lazy load neden gerekli, tam anlayamadım
Dosyanın bu kadar büyük olması mı bekleniyor? Yoksa zaten uygulanmış işlevselliği olduğu gibi korumak mı amaçlanıyor?
Ağ üzerinden tamamını almadan sadece gereken parçaları istemek için range request gerekiyor
Elbette bunu birden fazla dosyaya bölmek daha yaygın, ama bazen tek dosya yönetimi daha pratik olabiliyor
Muhtemelen Gwern'in MediaWiki tabanlı sitesi yapısıyla da ilgilidir
Ben de yıllar önce benzer bir şey yapmıştım — Zundler adlı bir projeydi ve oldukça hacky bir yaklaşımdı
Yerelde de çalışıyor ama başta tüm arşivin açılması gerekiyor
Yalnız güvenlik kısıtlamalarını nasıl aştığını merak ediyorum
Açıklamada yalnızca tek kaynaklılık (single-origin) ile ilgili bir şeyler yazıyor, o yüzden tam kavrayamadım