1

この質問は、純粋に仮定に基づいています。有効な問題である場合とそうでない場合があります。とにかく、ここに行きます

いくつかのUIコンポーネント/ウィジェットを備えた重いJavaScriptクライアントアプリがあるとしましょう。これらのウィジェットのそれぞれには、データをクエリするためのエンドポイントがあります

ページの読み込み時に、これらのコンポーネントは http リクエストを行います。それらの複数; 複数の異なるエンドポイントに。

UI がサーバー側から生成される従来の Web と比較して、クライアント側のアーキテクチャが重いと、明らかに http 要求の数が増加することがわかります。

サンプルケース:

  • ウィジェット A がリソース A を要求する
  • ウィジェット B がリソース B を要求する

もちろん、次のようにすることで http リクエストを最小限に抑えることができます。

  • 親ウィジェットは { リソース A, リソース B } を返すエンドポイントを要求します
  • 親ウィジェットはウィジェット A にデータを配布します
  • 親ウィジェットはウィジェット B にデータを配布します

これは、ビジネス ロジックに基づいて関連するウィジェットをグループ化することで実行できます。

すべてがこのように組み立てられるわけではありません。できたとしても、コードのモジュール性を維持するにはどうすればよいでしょうか? 大規模な JavaScript アプリ wrt のよく知られたデザイン パターンはありますか。パフォーマンス?ここに数字がないのは確かなので、考えすぎているのかもしれません。考えた人はいますか?

4

3 に答える 3

1

手始めに、データのフェッチ/送信を処理し、すべてのウィジェットがこの API を使用するようにするクライアント JavaScript ライブラリを作成することを検討します。

このようにして、すべてのウィジェットとの間のデータの流れを 1 か所で最適化/グループ化できます。

于 2012-12-08T20:00:33.563 に答える
0

あなたが望むのは、すべてのデータ要求の中央キューであるように思えます。独自の各ウィジェットは、特定のリクエストをキューに入れることでリクエストを作成できます。次に、キュー内のすべてのリクエストを調べて、少し最適化できるかどうかを判断する共通のコードを用意します (同じエンドポイントからの 1 つのリクエストで複数のデータをリクエストする)。

このタイプの設計パターンを使用すると、すべてのウィジェットがモジュール化されたままになりますが、リクエストの最適化を処理するコードの小さなライブラリが 1 つあります。

技術的には、これがどのように機能するかは、リクエストをキューに追加するためのライブラリ関数を作成することです。その関数には、エンドポイント、データの準備ができたときのコールバック関数、および要求の説明が必要です。各ウィジェットは、データ要求を作成するためにこの共通関数を呼び出します。

この一般的な関数は、各リクエストをキューに入れ、setTimeout()0ms (まだ設定されていない場合) を実行します。これsetTimeout()は、現在の実行スレッドが完了したときに呼び出されます。これは、この現在の初期化スレッドに対するすべての要求がキューに入っているときです。その後、キューを調べて、同じエンドポイントへのすべての要求を 1 つの要求に結合し、要求を送信できます。データが到着すると、個別のデータが分割され、適切なウィジェットのコールバックが呼び出されます。

データのキャッシュが役立つ場合 (時間の経過とともにまったく同じデータに対する複数の要求が発生する場合)、このレイヤーにキャッシュを実装することもできます。

于 2012-12-08T20:16:16.253 に答える
0

頭に浮かぶ 1 つのアイデア (転送されるデータの量は減らないが、HTTP 要求の数は減る) は、クライアント側ですべての AJAX 要求を、制御する一般的な Javascript インターフェースを介してルーティングすることです。

次に、UI リクエストごとに 1 つの HTTP リクエストを送信する代わりに、数ミリ秒待ってから、その間隔内に発生するすべてのリクエストをバッチ処理し、バッチ全体に対して 1 つの HTTP リクエストのみを送信します (サーバーに送信されるリクエストに対してこれを行います)。

サーバー上では、バッチ化されたすべてのリクエストを内部的に(できれば並行して)処理し、バッチ化されたレスポンスで結果を返す、特別な汎用「バッチ化」エンドポイントを持つことができます。

次に、クライアント側は、バッチ処理された結果を元のリクエスターに配布します。

これは、すべてのリクエストがサービスを提供するのにほぼ同じ時間がかかる場合にのみ機能することに注意してください。他のすべてのサブリクエストがすでに完了しているときに、1 つのサブリクエストが完了するまで 30 秒待機するバッチ応答は望ましくありません。ブラックリストか何かでこれに対処できるかもしれません。

また、どのリクエストを最初に処理する必要があるかを特定し、優先度を割り当ててください。

于 2012-12-08T20:05:57.277 に答える