Uygulama önbelleği kullanan bir çevrimdışı web uygulamam var. Temel olarak PNG resim dosyalarından oluşan, kaydedeceği (istemci tarafı) yaklaşık 10MB - 20MB veri sağlamam gerekiyor. İşlem şu şekildedir:
- Appcache'de web uygulaması indirmeleri ve yüklemeleri (bildirim kullanır)
- Sunucu PNG veri dosyalarından web uygulaması istekleri (nasıl? - aşağıdaki alternatiflere bakın)
- Zaman zaman web uygulaması sunucuyla yeniden senkronize olur ve PNG veritabanına küçük kısmi güncellemeler / siler / eklemeler yapar
- Bilginize: Sunucu, dosyaları almak için wwwroot'a yerleştirebilen bir JSON REST sunucusudur
İkili blob depolamasını işleyen istemci tabanlı "veritabanları" ile ilgili mevcut analizim burada
Altta GÜNCELLEMEYE BAKIN
- AppCache (manifest aracılığıyla tüm PNG'yi ekleyin ve ardından talep üzerine güncelleyin)
- CON: PNG veritabanı öğesindeki herhangi bir değişiklik, bildirimdeki tüm öğelerin tam indirilmesi anlamına gelir (Gerçekten kötü haber!)
- Web depolama
- CON: JSON depolaması için tasarlandı
- CON: blob'ları yalnızca base64 kodlama yoluyla depolayabilir (muhtemelen kod çözme maliyeti nedeniyle ölümcül kusur)
- CON: webStorage için 5MB'lık sabit sınır http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
- PhoneGap ve SQLLite
- CON: Sponsor, sertifikasyon gerektiren yerel bir uygulama olarak reddedecek
- sıkıştırılmış dosya
- Sunucu bir zip dosyası oluşturur, onu wwwroot'a yerleştirir ve istemciyi bilgilendirir
- kullanıcı manuel olarak açmalı (En azından ben böyle görüyorum) ve istemci dosya sistemine kaydetmeli
- Web uygulaması dosyalara başvurmak için FileSystem API kullanır
- CON: ZIP çok büyük olabilir (zip64?), Oluşturmak için uzun süre
- CON: FileSystem API'nin her zaman korumalı alandan okuyup okuyamayacağından emin değilim (öyle düşünüyorum)
- USB veya SD kart (taş devrine dönüş ...)
- Çevrimdışı olmadan önce kullanıcı sunucuda yerel olacaktır
- Böylece ona bir SD kart taktırabilirdik, sunucunun kartı PNG dosyalarıyla doldurmasına izin verdik.
- Ardından kullanıcı dizüstü bilgisayara, tablete bağlayacak
- Web uygulaması dosyaları okumak için FileSystem API'yi kullanacak
- CON: FileSystem API'nin her zaman korumalı alandan okuyup okuyamayacağından emin değilim (öyle düşünüyorum)
- WebSQL
- CON: w3c onu terk etti (oldukça kötü)
- Geri dönüş olarak IndexedDB ve WebSQL kullanan bir Javascript sarmalayıcısını düşünebilirim
- FileSystem API
- Chrome, blobların okunmasını / yazılmasını destekler
- CON: IE ve FireFox hakkında net değil (IE10, standart olmayan msSave'e sahiptir)
- caniuse.com, IOS ve Android desteğini bildiriyor (ancak yine, bu yalnızca JSON'un r / w'si mi yoksa yazmak için tam blob API'si mi içeriyor?
- CON: FireFox üyeleri FileSystem API'den hoşlanmaz ve blobları kurtarmayı destekliyorlarsa net değil: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO: jsperf http://jsperf.com/indexeddb-vs-localstorage/15'e göre bloblar için IndexedDB'den çok daha hızlı (sayfa 2)
- IndexedDB
- IE10, FireFox'ta iyi destek (kaydedin, blobları okuyun)
- Bir dosya sisteminden daha iyi hız ve daha kolay yönetim (siler, güncellemeler)
- PRO: hız testlerine bakın: http://jsperf.com/indexeddb-vs-localstorage/15
- IndexedDB'de görüntülerin depolanması ve görüntülenmesi hakkındaki bu makaleye bakın: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- CON: Chrome'un henüz blob yazmayı desteklemediğini doğruladım (mevcut hata, ancak ne zaman düzeltileceği net değil)
- GÜNCELLEME: Chrome geliştiricileri, hem masaüstü hem de android için bunun üzerinde çalıştıklarını onayladı! henüz zaman çizelgesi yok.
- LawnChair JavaScript sarmalayıcı http://brian.io/lawnchair/
- PRO: IndexedDB, WebSQL veya sahip olduğunuz her türlü veritabanı için çok temiz bir paketleyici (polyfill'i düşünün)
- CON: ikili blobları saklayamaz, yalnızca veri: uri (base64 kodlama) (kod çözme maliyetinden dolayı muhtemelen ölümcül kusur)
- IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Parashuram, ham IndexedDB arayüzü için güzel bir JQUERY sarmalayıcı yazdı
- PRO: IndexedDB kullanımını büyük ölçüde basitleştirir, Chrome FileSystemAPI için bir dolgu / polyfill eklemeyi umuyordum
- CON: Blobları işlemeli, ancak çalışmasını sağlayamadım
- idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman @ Google, geri dönüş olarak Indexed DB kullanan, iyi test edilmiş bir PolyFill the FileSystem API yazdı.
- PRO: FileSystem API, blob'ları depolamak için çok uygundur
- PRO: FireFox ve Chrome'da harika çalışıyor
- PRO: bulut tabanlı CouchDB ile senkronize etmek için harika
- CON: Nedeni net değil, ancak IE10 üzerinde çalışmıyor
- PouchDB JavaScript Kitaplığı http://pouchdb.com/
- bir CouchDB'yi yerel bir DB ile senkronize etmek için harika (WebSQL veya IndexedDB kullanıyor (benim sorunum değil)
- CON: EKSİKSİZLİK YOK, PouchDB artık tüm yeni tarayıcılar (IE, Chrome, Firefox, mobil cihazda Chrome, vb.) Ve birçok eski tarayıcı için ikili blobları destekliyor. Bu yazıyı ilk yaptığımda durum böyle değildi.
NOT: bir veriyi görmek için: uri PNG kodlaması Bir örnek oluşturdum: http://jsbin.com/ivefak/1/edit
İstenen / Yararlı / Gereksiz Özellikler
- İstemcide yerel (EXE, PhoneGap, ObjectiveC, vb.) Uygulama yok (saf web uygulaması)
- Yalnızca dizüstü bilgisayarlar için en son Chrome, FireFox, IE10'da çalıştırılması gerekir
- Android Tablet için kesinlikle aynı çözümü istiyorum (IOS de iyi olurdu), ancak çalışmak için yalnızca bir tarayıcıya (FF, Chrome, vb.)
- Hızlı başlangıç DB popülasyonu
- GEREKSİNİM: Web uygulaması ile depolamadan (DB, dosya) görüntülerin çok hızlı alınması
- Tüketiciler için tasarlanmamıştır. Tarayıcıları kısıtlayabilir ve kullanıcıdan özel kurulum ve görevler yapmasını isteyebiliriz, ancak bunu en aza indirelim
IndexedDB Uygulamaları
- IE, FF ve Chrome'un bunu dahili olarak nasıl uyguladığına dair harika bir makale var: http://www.aaron-powell.com/web/indexeddb-storage
- Kısacası:
- IE, IndexedDB için Exchange ve Active Directory ile aynı veritabanı biçimini kullanır
- Firefox SQLite kullanıyor, bu yüzden SQL veritabanına bir tür NoSQL veritabanı uyguluyor
- Chrome (ve WebKit), BigTable'da mirası olan bir Anahtar / Değer deposu kullanıyor
Mevcut Sonuçlarım
- Bir IndexedDB yaklaşımı kullanmayı seçtim (ve blob desteği gönderene kadar Chrome için FileSystemAPI ile çoklu doldurma)
- Döşemeleri almak için bir ikilem yaşadım çünkü JQUERY çalışanları bunu AJAX'a eklemekle uğraşıyorlar
- JQUERY .ajax () https://github.com/pmp/xhr2-lib'e çok benzeyen Phil Parsons tarafından XHR2-Lib ile gittim
- 100 MB indirmeler için performans (IE10 4s, Chrome 6s, FireFox 7s).
- IndexedDB sarmalayıcılarından hiçbirinin bloblar için çalışmasını sağlayamadım (çim sandalye, PouchDB, jquery-indexeddb, vb.)
- Kendi sarıcımı yuvarladım ve performans (IE10 2s, Chrome 3s, FireFox 10s)
- FF ile, sql olmayan bir depolama için ilişkisel bir DB (sqllite) kullanmanın performans sorununu gördüğümüzü varsayıyorum
- NOT, Chrome'da IndexedDB'nin durumunu incelemek için olağanüstü hata ayıklama araçları (geliştirici sekmesi, kaynaklar) vardır.
NİHAİ Sonuçlar aşağıda yanıt olarak yayınlanmıştır
Güncelleme
PouchDB artık tüm yeni tarayıcılar (IE, Chrome, Firefox, mobil cihazlarda Chrome, vb.) Ve birçok eski tarayıcı için ikili blobları destekliyor. Bu yazıyı ilk yaptığımda durum böyle değildi.