0

私は Dart での作業に慣れています。Dart では、関連するパッケージをプロジェクトにインポートするのと同じくらい簡単に、サーバーとクライアントの間でタイプを共有できます。

Yesod/Haskell で同様のことを実現できますか? クライアントに GHCJS を使用する必要がありますか? もしかしてエルム?目標は、サーバーとクライアント間の転送中にデータが破損することを心配する必要がなく、JS を 1 行も記述する必要がないことです。:o)

Haskell を使用してこの課題に最もうまく取り組む方法について、初心者向けの適切なドキュメントを見つけることができませんでした。適切な場所を調べていないだけだと思います。どんな助けでも大歓迎です。

4

1 に答える 1

1

これを実現するには、GHCJS次の方法で 3 つのコア パッケージからプロジェクトを構築するだけです。

  • フロントエンド - ghcjs-dom に基づくもの、私はReflex-domが好きです
  • バックエンド - お気に入りのフレームワークを使用してください。私はSnapが好きです。Yesod も同じように動作するはずです。
  • shared - フロントエンドとバックエンドの間で共有されるコード

もちろん、フロントエンドとバックエンドの両方が共有に依存している場合。フロントエンドは でコンパイルされGHCJS、バックエンドは でコンパイルされGHCます。

完全な例を見たい場合は、hsnippetを勉強することを強くお勧めします。WsApi.hs一連のアップ メッセージとダウンストリーム メッセージが定義されている場所を見てください。すべての JSON インスタンスは 1 か所で派生され、フロントエンドとバックエンドの両方にインポートされます。

Hsnippet は WebSocket を使用します。もちろん、これは要件ではありません。独自のアプリで通常の XHR を使用できます。原則は変わりません。共有パッケージで API とシリアル化インスタンス (通常は JSON) を定義し、関連するモジュールをフロントエンドとバックエンドの両方にインポートします。

個人的には、検証コード、永続的に生成されたデータベース エンティティ定義なども共有しています。設定したら、追加のものを共有するのは、ほとんどの場合、共有モジュールの 1 つにコピー ペーストして、どこにでもインポートするだけです。

于 2016-07-31T16:54:52.947 に答える