Cmd.mapはElmSPAをモジュールに分割する正しい方法ですか?

Aug 23 2020

Elmでシングルページアプリケーションを構築していて、コードをファイルに分割する方法を決めるのに苦労していました。

私はそれがページごとに1つのモジュールを使用して持っている分割終わっMain.elm変換Htmlし、Cmd使用して、各ページから放出されたCmd.mapとしますHtml.map

私の問題は、Cmd.mapとHtml.mapの両方のドキュメントに次のように書かれていることです。

これが適切に構造化されたElmコードで役立つことはめったにないので、これに到達する前に、ガイドの構造に関するセクションを必ず読んでください。

私が知っている2つの大きなアプリだけをチェックしました:

  1. elm-spa-exampleはCmd.mapを使用します(https://github.com/rtfeldman/elm-spa-example/blob/cb32acd73c3d346d0064e7923049867d8ce67193/src/Main.elm#L279)
  2. 私はどのように理解することができませんでした https://github.com/elm/elm-lang.org 問題を扱います。

また、このスタックオーバーフローの質問に対する両方の回答は、考え直さCmd.mapずに使用することを示唆しています。

Cmd.mapは、単一ページのアプリケーションをモジュールに分割する「正しい」方法ですか?

回答

3 JackLeow Aug 23 2020 at 11:12

私は時々あなたはあなたのために正しいことをしなければならないと思います。私は、使用Cmd.map/ Sub.map/Html.map初期化、編集および報告- 3「ページ」を持っていた私が書いたアプリケーションのためのアプローチを。

これらの各ページは比較的複雑で、各ページにのみ関連するかなりの数のメッセージがあり、各ページを独自のコンテキストで個別に推論する方が簡単なので、これらの各ページを独自のモジュールにしたいと思いました。

欠点は、コンパイラが特定のページに対して間違ったメッセージを受信することを妨げず、ランタイムエラーが発生することです(たとえば、アプリケーションEditing.SaveReportingページ内にあるときにを受信した場合、正しい動作は何ですか?実装、私はそれをコンソールに記録して先に進みます-これは私にとって十分でした(そしてそれはとにかく起こりませんでした);私が考えた他のオプションには、何か恐ろしいことが起こったことを示す厄介なエラーページを表示することが含まれます-BSODの場合または、アプリケーション全体をリセット/再初期化するだけです)。

2 olivieradam666 Aug 24 2020 at 14:03

別の方法は、この談話の投稿で詳細に説明されている効果パターンを使用することです。

このアプローチの中核は次のとおりです。

このアプリケーションで使用される拡張Effectパターンは、initおよびupdate関数が生成するすべての効果を表すことができるEffectカスタムタイプを定義することで構成されます。

そして主な利点:

  1. すべてのエフェクトは単一のエフェクトモジュールで定義されます。このモジュールは、アプリケーション全体の内部APIとして機能し、考えられるすべてのエフェクトを一覧表示することが保証されています。
  2. Cmd値とは異なり、効果を検査およびテストできます。これにより、シミュレートされたHTTPリクエストを含む、すべてのアプリケーション効果をテストできます。
  3. エフェクトは、ログイン3時のセッション3や、サブページ更新機能によってURLの変更が必要な場合の現在のページなど、トップレベルのモデルデータの変更を表すことができます。
  4. すべての更新機能は、クリーンで簡潔なMsg-> Model->(Model、Effect Msg)2シグネチャを保持します。
  5. エフェクト値には必要最小限の情報が含まれているため、Browser.Navigation.keyなどの一部のパラメーターは、エフェクトが3つの関数を実行する場合にのみ必要です。これにより、開発者はそれらをアプリケーション全体の関数に渡す必要がなくなります。
  6. 単一のNoOpまたは無視された文字列25をアプリケーション全体に使用できます。