15

Backbone.JSを使用してサーバーコードとクライアントコード間の共有定数を処理するための最良の方法は何ですか?たとえば、次のユーザーロールのマップがあるとします。

user_roles = {
  1 => "member", 
  2 => "moderator", 
  3 => "admin"}

明らかに、クライアント側とサーバー側の両方でこれらの定義をコードで複製すると、拡張性が低くなり、エラーが発生しやすくなります。

私が思いついた解決策は、これらの定義をBackbone.CollectionまたはBackbone.Modelとして公開し、サーバーからフェッチすることですが、定数型が大量にある場合、これにより望ましくないオーバーヘッドが発生する可能性があり、よくわかりません。それらが実際にモデル内に属しているかどうか。

この問題を解決するためのさまざまなソリューションは何ですか?また、それらはどの程度適切に拡張できますか?

4

2 に答える 2

17

私はこの問題を処理するいくつかの異なる方法を試しました。どちらが最善の方法かはわかりませんが、どちらもうまくいったので、ここで説明し、お役に立てば幸いです。

コアコンセプトはどちらも同じです。定数はサーバー側言語(私の場合はC#とJava)で真の定数として定義され、クライアントの利益のためにJSONまたはjavascriptに変換されます。単一のJSON/YML / etcを共有するのではなく、これが進むべき道だと思います。構成ファイル。javascriptに真の定数がないからといって、サーバーにも定数がないはずではありません。

オプション1:Webサービス呼び出しを介して実行時に定数と列挙をロードします。

/enums基本的にすべてのサーバー側の列挙と定数を1つの大きなJSONの塊に収集するサービスエンドポイント(これを呼びましょう)を作成します。余分なサービス呼び出しを回避するために、サーバー側のテンプレートフレームワークも使用している場合は、これをにブートストラップできますindex.html

静的コンテンツに何もブートストラップしたくない場合は、他の最適化を行うことができます。定数が変更されることはめったにないため/enums、サーバーアプリケーションのビルドバージョンを含むラッパーオブジェクトに応答をラップできます。例えば:

{
  "version": "1.2.1.0",
  "enums": { ... }
}

ユーザーが初めてページにアクセスしたときに、リクエストを送信GET /enumsし、応答全体をブラウザのローカルストレージに保存します。以降の訪問では、ローカルストレージから定数を読み取り、。を使用して定数を要求しGET /enums?v=1.2.1.0ます。サーバーは、そのバージョンを渡されたバージョンと比較する必要があり、それらが同一である場合はHTTP 200 OK、列挙がまだ有効であることをクライアントに示すためだけに戻ります。

このオプションは、フロントエンド開発者とバックエンド開発者が異なるツールを使用している分散環境で作業している場合、または通常は緊密に連携していない場合に適しています。

オプション2:ビルドプロセスの一部として定数を共有する

テキスト変換テンプレート(T4など)を使用して、サーバー側の言語ソースからjavascriptコードを生成できます。私の場合、これはC#でした。

すべてのサーバー側の列挙を1つのディレクトリに保存し、ビルドタスクを実行して、そのディレクトリ内のすべてのC#ソースファイルをjavascriptオブジェクトに変換enums.jsし、クライアント側のソースツリーで1つのファイルに結合しました。

これが好ましいオプションであることがわかりましたが、クライアントとサーバーの開発が同期的に行われない場合(一緒に構築され、一緒にリリースされる)、依存関係の管理がかなり厄介になる可能性があります。私の場合、私は常にクライアントとサーバーの両方を一緒にデプロイしたので、これはうまくいきました。

于 2013-01-07T21:18:49.340 に答える
1

バックエンドがJavaScriptにない場合は、定数を使用してJavaScriptまたはJSONファイルを生成し、それをクライアント側のビルドに含めるか、最初のHTMLテンプレートに挿入します。これは、Djangoの構成設定を使用することもあれば、yamlファイルの設定(yaml-> python、yaml-> js、またはJSONのみ)を使用して行うこともあります。

定数用に追加のバックボーンモデルロジックをすべて用意することが理にかなっているのかどうかはわかりません。

別の注意点として、これが私がmeteor.jsが好きな理由です。サーバーとクライアント間で定数を簡単に共有できるため、この種のことを心配する必要はまったくありません。:)

于 2013-01-06T21:45:45.003 に答える