58

現在、オフライン サポート用のすべての html5 グッズを使用して、オフライン Web アプリケーションを作成中です。ただし、オフライン データがサーバーに送信され、サーバー データがクライアントに返されるようにする同期モジュールの作成について考え始めています。これは以前にも行われたことがあると思いますが、これはかなり古典的な設計上の問題であり、モバイル デバイスやその他の多くのものに影響を与えるものです。では、この種の優れた設計リソースを教えてくれる人がいるのだろうか?

これについては、あまり洗練されている必要はありません。つまり、同じデータにアクセスする複数のユーザーを処理していないということです。また、競合をマージしないこと (最新のものを取得するだけ) は問題ありませんが、それでも、次のような設計が必要です。将来、それらのオプションを許可してください。

また、この種のものを実装するオープンソース プロジェクトはありますか? 私は他人のコードを (ライセンスが許せば) 盗むことはしませんし、喜んで移植します。

4

9 に答える 9

13

同様の問題がありました。私は純粋に JSON の入出力アプローチを使用することにしました。私がフォーム送信で取っている解決策は次のとおりです。

  1. フォーム送信イベントをキャッチ
  2. ユーザーがオンラインかどうかを確認する
  3. ユーザーがオンラインの場合は、通常のフォーム POST としてフォームを送信します
  4. ユーザーがオフラインの場合は、JSON 要求を文字列化してローカルに保存します (Web SQL データベースを使用することにしました)。キュー テーブルは、単に Uri とペイロードです。

次に、オンライン/オフライン イベント用のグローバル イベント フックがあります。ユーザーがオンラインに戻ると、キューをチェックし、キューにアイテムが含まれている場合は、それらを JSON POST リクエストとして送信します。

主にJSON データを取得してオフラインで使用するためにキャッシュすることに関心がある場合は、 jquery.offlineをご覧ください。

双方向の同期の課題は、ローカルにキャッシュされたリストを、キューに入れている CRUD 作業で更新する必要があることです。

これを行うためのより一般的な方法を見つけたいと思います。

于 2011-01-27T06:11:25.357 に答える
10

同様の設計 (まだ試していません) の私の計画は、PouchDBのようなものを使用してデータをローカルに保存し、それをリモートのソファ インスタンスと同期することです。

于 2012-02-13T19:37:13.847 に答える
7

かなり優れた同期機能と競合解決機能を備えたノードMVCフレームワークであるDerbyをチェックしてください。http://derbyjs.com/

于 2012-04-01T10:02:39.053 に答える
4

私たちのチームでは、すでにオフライン/オンライン モードでアプリを開発しています。

次の次のライブラリを使用しています。

Rack-offline を使用して、ページにコンテンツをレンダリングするためのすべてのリソース ファイルと jst テンプレートをキャッシュしています。backbonejs と backbonejs-localStorage は、クライアントで MVC アプリを作成するのに役立ちます。それはかなり素晴らしいです、あなたはそれを試してみてください。データの保存には常に localstorage を使用しています。モデル オブジェクトのポストを作成して localStorage に保存すると、同期のためのキューがトリガーされます (同期プロセスを自動実行するためのタイマー バックグラウンド ワーカーもあります)。モデルごとに、キュー同期トリガーによって実行される個別の同期クラスがあります。navigator.onLine => true の場合、更新用のデータを含むリクエストをサーバーに送信しています。ブラウザを閉じても、localStorage にキューがあるため、データが失われることはありません。次回、クライアントは最初のロード時に navigator.onLine => true でデータを同期します。

Rack-offline の使用方法は、github で私の小さなプロジェクトを確認できます。

ポモドーロアプリ

幸運を!

于 2012-02-23T12:43:37.813 に答える
2

私は同じ問題に直面し、接続が利用可能になるとすぐに、ストレージと git に XML ファイルを使用して変更を追跡し、それらを自動的にコミットすることになりました。同期は、シェル スクリプト内の通常の git commit / push / pull コマンドと、スクリプトを開始する cronjob で行われます。これは、JSON をテキストファイルに保存する場合にも機能します。

于 2011-12-21T12:14:13.377 に答える
1

個人的には、indexedDB APIの上に、オンラインかオフラインかをチェックするラッパーを作成することをお勧めします。

  • オフラインの場合は、indexedDBに保存し、すべてのドキュメントでpersistedフラグをfalseに設定します
  • オンラインの場合、persistedがfalseであるすべてのドキュメントを取得し、それらをmongodbまたはバックエンドの同等のものに保存してから、新しいドキュメントを、persistedフラグをtrueに設定してindexedDBとサーバーの両方に保存します。

私は小さなものを書きました

永続化フラグを自動的に設定し、これらのドキュメントの同期をバックエンドにトンネリングするには、トンネルを拡張する必要があります。

于 2012-04-08T12:56:02.913 に答える
1

DerbyJSがおそらく最良の解決策でした。ただし、Derbyはまだ開発中であり、オフラインサポートは計画中のみであり、まだ実装されていません。Googleグループ(http://groups.google.com/group/derbyjs/browse_thread/thread/7e7f4d6d005c219c)では、将来の計画に関する追加情報を見つけることができます。

于 2012-04-08T12:50:15.883 に答える
1

私は現在、同様の webapp に取り組んでいます。私はそのようなワークフローを作ることにしました:

  1. フォームは実際には送信されません - 「送信」ボタンは、実際にはシリアル化されたフォーム データを localStorage に (いくつかのキューで) 保存します。これにより、送信のキャプチャに関する問題や、フォームの送信中に切断を処理するための追加のエラー処理コードを記述する必要がなくなります。
  2. トランスポート スクリプトは、データの保存後にトリガーされます。オンライン/オフラインの状態をチェックします。
  3. オンラインの場合、最新のデータをキューからサーバーに送信しようとし (AJAX 要求)、成功するとキューから削除します (短いタイムアウトの後、キューから次のデータを送信し続けます)。
  4. 一定時間後(setTimeout())に再チェックをスケジュールします。
于 2012-03-14T10:50:56.143 に答える
1

重くなる可能性のある Ext JS / Sencha フレームワークを使用する準備ができている場合は、オフライン (localStorage など) をサポートする優れたデータ API と、ローカル サーバーへのライトスルー用のプロキシ アプローチがあります。Sencha Touch (モバイル専用) を使用しています。

Web ストレージのデバッグについては、Weinre を調べてください。

于 2012-03-16T18:08:38.550 に答える