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