appcachingを使用したオフラインWebアプリケーションがあります。主にPNG画像ファイルで構成される(クライアント側で)保存する約10MB-20MBのデータを提供する必要があります。操作は次のとおりです。
- Webアプリケーションをダウンロードしてappcacheにインストール(マニフェストを使用)
- サーバーPNGデータファイルからのWebアプリリクエスト(方法?-以下の代替案を参照)
- 時々、Webアプリがサーバーと再同期し、PNGデータベースへの小さな部分的な更新/削除/追加を行います
- 参考:サーバーはJSON RESTサーバーであり、ピックアップのためにwwwrootにファイルを配置できます
これが、バイナリBLOBストレージを処理するクライアントベースの「データベース」の私の現在の分析です
下の更新を見る
- AppCache(マニフェストを介してすべてのPNGを追加し、オンデマンドで更新します)
- CON:PNGデータベースアイテムの変更は、マニフェスト内のすべてのアイテムの完全なダウンロードを意味します(本当に悪いニュースです!)
- WebStorage
- CON:JSONストレージ用に設計
- CON:base64エンコーディングを介してのみblobを格納できます(デエンコーディングのコストのため、おそらく致命的な欠陥)
- CON:webStorageの5MBのハード制限http://htmlui.com/blog/2011-08-23-5-obscure-facts-about-html5-localstorage.html
- PhoneGapとSQLLite
- CON:スポンサーは、認定を必要とするネイティブアプリとしてそれを拒否します
- ZIPファイル
- サーバーはzipファイルを作成してwwwrootに配置し、クライアントに通知します
- ユーザーは手動で解凍し(少なくともそれが私の見方です)、クライアントファイルシステムに保存する必要があります
- WebアプリはFileSystem APIを使用してファイルを参照します
- CON:ZIPが大きすぎる(zip64?)、作成に時間がかかる
- CON:FileSystem APIが常にサンドボックスから読み込めるかどうかわからない(そう思います)
- USBまたはSDカード(石器時代に戻る...)
- ユーザーはオフラインになる前にサーバーに対してローカルになります
- SDカードを挿入し、サーバーにPNGファイルを挿入させます。
- 次に、ユーザーはそれをラップトップ、タブレットに接続します
- WebアプリはFileSystem APIを使用してファイルを読み取ります
- CON:FileSystem APIが常にサンドボックスから読み込めるかどうかわからない(そう思います)
- WebSQL
- CON:w3cがそれを放棄した(かなり悪い)
- IndexedDBとWebSQLをフォールバックとして使用するJavaScriptラッパーを検討するかもしれません
- FileSystem API
- Chromeはblobの読み取り/書き込みをサポートします
- CON:IEとFireFoxについて明確でない(IE10、非標準のmsSaveがある)
- caniuse.comはIOSとAndroidのサポートを報告しています(ただし、これはJSONのr / wだけですか、それとも書き込み用の完全なblob APIが含まれていますか?
- CON:FireFoxの人々はFileSystem APIを嫌い、ブロブの保存をサポートしているかどうかは不明です:https : //hacks.mozilla.org/2012/07/why-no-filesystem-api-in-firefox/
- PRO:jsperf http://jsperf.com/indexeddb-vs-localstorage/15(ページ2)によると、BlobのIndexedDBよりはるかに高速
- IndexedDB
- IE10、FireFox(保存、ブロブの読み取り)での優れたサポート
- ファイルシステムよりも高速で管理が容易(削除、更新)
- PRO:速度テストを参照してください:http : //jsperf.com/indexeddb-vs-localstorage/15
- IndexedDBでの画像の保存と表示に関するこの記事を参照してください:https : //hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/
- CON:Chromeがblob書き込みをまだサポートしていないことを確認しました(現在のバグですが、いつ修正されるかは明確ではありません)。
- 更新:Chrome開発者は、デスクトップとAndroidの両方でこれに取り組んでいることを確認します!まだタイムラインはありません。
- LawnChair JavaScriptラッパーhttp://brian.io/lawnchair/
- PRO:IndexedDB、WebSQL、またはお持ちのあらゆるデータベースの非常にクリーンなラッパー(ポリフィルと考えてください)
- CON:バイナリblobを保存できません。data:uri(base64エンコーディング)のみを格納します(デエンコーディングのコストのため、おそらく致命的な欠陥です)
- IndexedDB JQUERY polyFill https://github.com/axemclion/jquery-indexeddb
- Parashuramは、生のIndexedDBインターフェース用の素晴らしいJQUERYラッパーを作成しました。
- PRO:IndexedDBを使用して大幅に簡素化しました。ChromeFileSystemAPIにシム/ポリフィルを追加したいと考えていました
- CON:blobを処理する必要がありますが、機能させることができませんでした
- idb.filesystem.js http://ericbidelman.tumblr.com/post/21649963613/idb-filesystem-js-bringing-the-html5-filesystem-api
- Eric Bidelman @ Googleは、フォールバックとしてIndexed DBを使用する十分にテストされたPolyFill FileSystem APIを作成しました
- PRO:FileSystem APIはblobの保存に適しています
- PRO:FireFoxとChromeでうまく機能します
- PRO:クラウドベースのCouchDBとの同期に最適
- CON:理由は明らかではありませんが、IE10では機能していません
- PouchDB JavaScriptライブラリhttp://pouchdb.com/
- CouchDBをローカルDBと同期するのに最適(WebSQLまたはIndexedDBを使用します(ただし、私の問題ではありません))
- 短所:短所なし、PouchDBは最近のすべてのブラウザー(IE、Chrome、Firefox、モバイルのChromeなど)だけでなく、多くの古いブラウザーのバイナリBLOBをサポートするようになりました。私がこの記事を最初に書いたときはそうではありませんでした。
注:PNGのdata:uriエンコーディングを確認するには、http://jsbin.com/ivefak/1/editで例を作成しました
望ましい/便利な/必要な機能
- クライアント(純粋なWebアプリケーション)にネイティブ(EXE、PhoneGap、ObjectiveCなど)アプリがない
- ラップトップ用の最新のChrome、FireFox、IE10でのみ実行する必要があります
- Androidタブレット用の同じソリューションが強く必要です(IOSもいいでしょう)が動作するために必要なブラウザーは1つだけ(FF、Chromeなど)
- 迅速な初期DBポピュレーション
- 要件:ストレージ(DB、ファイル)からのWebアプリケーションによる画像の非常に高速な取得
- 消費者向けではありません。ブラウザーを制限し、ユーザーに特別なセットアップとタスクを実行するよう依頼できますが、それを最小限にしましょう
IndexedDBの実装
- IE、FF、およびChromeがこれを内部でどのように実装するかについての優れた記事があります:http : //www.aaron-powell.com/web/indexeddb-storage
- 要するに:
- IEは、ExchangeおよびActive Directoryと同じデータベース形式をIndexedDBに使用します
- FirefoxはSQLiteを使用しているため、SQLデータベースにNoSQLデータベースを実装するようなものです
- Chrome(およびWebKit)は、BigTableに継承されているKey / Valueストアを使用しています
私の現在の結果
- 私はIndexedDBアプローチを使用することを選択しました(そして、ブロブサポートが出荷されるまでChromeのFileSystemAPIでポリフィルします)
- タイルを取得するために、JQUERYの人々がこれをAJAXに追加することについて熟慮しているので、私にはジレンマがありました
- Phil ParsonsによるXHR2-Libを使用しました。これは、JQUERY .ajax()と非常によく似ています。https://github.com/pmp/xhr2-lib
- 100MBダウンロードのパフォーマンス(IE10 4s、Chrome 6s、FireFox 7s)。
- IndexedDBラッパーをblob(lawnchair、PouchDB、jquery-indexeddbなど)で機能させることができませんでした。
- 私は自分のラッパーを転がし、パフォーマンスは(IE10 2s、Chrome 3s、FireFox 10s)です
- FFでは、非SQLストレージにリレーショナルDB(sqllite)を使用することでパフォーマンスの問題が発生していると思います
- 注:Chromeには、IndexedDBの状態を検査するための優れたデバッグツール(開発者タブ、リソース)があります。
回答として以下に掲載された最終結果
更新
PouchDBは、最近のすべてのブラウザー(IE、Chrome、Firefox、モバイルのChromeなど)および多くの古いブラウザーのバイナリBLOBをサポートするようになりました。私がこの記事を最初に書いたときはそうではありませんでした。