Ho un'applicazione web offline che utilizza appcaching. Devo fornire circa 10 MB - 20 MB di dati che salverà (lato client) costituiti principalmente da file di immagine PNG. L'operazione è la seguente:
- Download e installazione di applicazioni Web in appcache (utilizza manifest)
- Richieste di app Web da file di dati PNG del server (come? - vedere le alternative di seguito)
- Di tanto in tanto l'app web si risincronizza con il server ed esegue piccoli aggiornamenti / eliminazioni / aggiunte parziali al database PNG
- FYI: il server è un server REST JSON, che può posizionare i file in wwwroot per il ritiro
Di seguito è riportata la mia attuale analisi dei "database" basati su client che gestiscono l'archiviazione BLOB binario
VEDI AGGIORNAMENTO in basso
- AppCache (tramite manifest aggiungi tutto il PNG e poi aggiorna su richiesta)
- CONTRO: qualsiasi modifica di un elemento del database PNG significherà il download completo di tutti gli elementi nel manifest (davvero una brutta notizia!)
- WebStorage
- CONTRO: Progettato per l'archiviazione JSON
- CONTRO: può archiviare i BLOB solo tramite la codifica base64 (probabilmente un errore fatale a causa del costo della decodifica)
- CONTRO: limite rigido di 5 MB per webStorage http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
- PhoneGap e SQLLite
- CONTRO: lo sponsor la rifiuterà come app nativa che richiede la certificazione
- file zip
- Il server crea un file zip, lo inserisce in wwwroot e invia una notifica al client
- l'utente deve decomprimere manualmente (almeno è così che lo vedo) e salvare nel file system del client
- L'app Web utilizza l'API FileSystem per fare riferimento ai file
- CONTRO: ZIP potrebbe essere troppo grande (zip64?), Molto tempo per la creazione
- CONTRO: Non sono sicuro che l'API FileSystem possa sempre leggere fuori dalla sandbox (penso di sì)
- USB o scheda SD (indietro all'età della pietra ....)
- L'utente sarà locale sul server prima di andare offline
- Quindi potremmo fargli inserire una scheda SD, lasciare che il server la riempia con file PNG
- Quindi l'utente lo collegherà al laptop, tablet
- L'app Web utilizzerà l'API FileSystem per leggere i file
- CONTRO: Non sono sicuro che l'API FileSystem possa sempre leggere fuori dalla sandbox (penso di sì)
- WebSQL
- CONTRO: w3c l'ha abbandonato (piuttosto male)
- Potrei considerare un wrapper Javascript che utilizza IndexedDB e WebSQL come riserva
- FileSystem API
- Chrome supporta la lettura / scrittura dei BLOB
- CONTRO: non è chiaro su IE e FireFox (IE10, ha msSave non standard)
- caniuse.com segnala il supporto IOS e Android (ma ancora una volta, è solo r / w di JSON o include l'API blob completa per la scrittura?
- CONTRO: Le persone di FireFox non amano l'API FileSystem e non è chiaro se supportano il salvataggio dei blob: https://hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO: molto più veloce di IndexedDB per i blob secondo jsperf http://jsperf.com/indexeddb-vs-localstorage/15 (pagina 2)
- IndexedDB
- Buon supporto in IE10, FireFox (salva, leggi i blob)
- Buona velocità e gestione più semplice rispetto a un file system (eliminazioni, aggiornamenti)
- PRO: vedi test di velocità: http://jsperf.com/indexeddb-vs-localstorage/15
- Vedi questo articolo sull'archiviazione e la visualizzazione di immagini in IndexedDB: https://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- CONTRO: Ho confermato che Chrome non supporta ancora la scrittura di blob (bug corrente, ma non è chiaro quando verrà risolto)
- AGGIORNAMENTO: gli sviluppatori di Chrome confermano che stanno lavorando su questo sia per desktop che per Android! nessuna sequenza temporale ancora.
- Wrapper JavaScript LawnChair http://brian.io/lawnchair/
- PRO: wrapper molto pulito per IndexedDB, WebSQL o qualsiasi database tu abbia (pensa a polyfill)
- CONTRO: impossibile memorizzare BLOB binari, solo dati: uri (codifica base64) (difetto probabilmente fatale a causa del costo della decodifica)
- IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Parashuram ha scritto un bel wrapper JQUERY per l'interfaccia IndexedDB non elaborata
- PRO: semplifica notevolmente l'utilizzo di IndexedDB, speravo di aggiungere uno shim / polyfill per Chrome FileSystemAPI
- CONTRO: dovrebbe gestire i BLOB, ma non sono riuscito a farlo funzionare
- idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman @ Google ha scritto un PolyFill ben collaudato API FileSystem che utilizza DB indicizzato come ripiego
- PRO: FileSystem API è adatta per archiviare i BLOB
- PRO: funziona alla grande su FireFox e Chrome
- PRO: ottimo per la sincronizzazione con CouchDB basato su cloud
- CONTRO: non è chiaro perché, ma non funziona su IE10
- Libreria JavaScript PouchDB http://pouchdb.com/
- ottimo per sincronizzare un CouchDB con un DB locale (utilizza WebSQL o IndexedDB (non è un mio problema però)
- CONTRO: NESSUN CONTRO, PouchDB ora supporta i BLOB binari per tutti i browser recenti (IE, Chrome, Firefox, Chrome su dispositivi mobili, ecc.) Così come molti browser meno recenti. Non è stato così quando ho scritto per la prima volta questo post.
NOTA: per vedere un dato: codifica uri di PNG ho creato un esempio su: http://jsbin.com/ivefak/1/edit
Caratteristiche desiderate / utili / non necessarie
- Nessuna app nativa (EXE, PhoneGap, ObjectiveC, ecc.) Sul client (applicazione web pura)
- Deve essere eseguito solo sull'ultimo Chrome, FireFox, IE10 per laptop
- Desidero fortemente la stessa soluzione per tablet Android (anche IOS sarebbe bello) ma per funzionare è necessario un solo browser (FF, Chrome, ecc.)
- Popolazione DB iniziale rapida
- REQUISITO: Recupero molto veloce delle immagini dall'applicazione web dalla memoria (DB, file)
- Non pensato per i consumatori. Possiamo limitare i browser e chiedere all'utente di eseguire impostazioni e attività speciali, ma riduciamolo al minimo
Implementazioni IndexedDB
- C'è un eccellente articolo su come IE, FF e Chrome implementano internamente questo a: http://www.aaron-powell.com/web/indexeddb-storage
- In breve:
- IE utilizza lo stesso formato di database di Exchange e Active Directory per IndexedDB
- Firefox utilizza SQLite, quindi implementa un database NoSQL nel database SQL
- Chrome (e WebKit) utilizzano un archivio chiave / valore che ha eredità in BigTable
I miei risultati attuali
- Ho scelto di utilizzare un approccio IndexedDB (e polyfill con FileSystemAPI per Chrome fino a quando non viene fornito il supporto blob)
- Per il recupero delle tessere, ho avuto un dilemma dal momento che le persone di JQUERY stanno cercando di aggiungere questo ad AJAX
- Sono andato con XHR2-Lib di Phil Parsons, che è molto simile a JQUERY .ajax () https://github.com/pmp/xhr2-lib
- Prestazioni per download da 100 MB (IE10 4s, Chrome 6s, FireFox 7s).
- Non sono riuscito a far funzionare nessuno dei wrapper IndexedDB per i BLOB (sdraio, PouchDB, jquery-indexeddb, ecc.)
- Ho arrotolato il mio wrapper e le prestazioni sono (IE10 2s, Chrome 3s, FireFox 10s)
- Con FF, presumo che stiamo riscontrando il problema delle prestazioni dell'utilizzo di un DB relazionale (sqllite) per uno storage non sql
- NOTA, Chrome dispone di eccezionali strumenti di debug (scheda sviluppatore, risorse) per l'ispezione dello stato di IndexedDB.
Risultati FINALI pubblicati di seguito come risposta
Aggiornare
PouchDB ora supporta i BLOB binari per tutti i browser recenti (IE, Chrome, Firefox, Chrome su dispositivi mobili, ecc.) Oltre a molti browser meno recenti. Non è stato così quando ho scritto per la prima volta questo post.