エルムの後の人生


私が書いてから2年以上経ちました.どこから、我々はそこから行きました、そして、それはどのように比較しましたか?

エルミッシュとF
我々の最新のプロジェクトのために、我々はエルミッシュとFチェンを選びました.ElmishはF - CHENRACKのためのELMのような抽象化を提供します.フェイブルはF .そして、それは反応を使用してレンダリングを表示します.Elmishは他のUIコンテキストでも動作するように一般的です.デスクトップとモバイルアプリケーションに適応するライブラリがあります.
Fは、私たちのために滑らかに移行した.言語はELMと同じMLファミリーにありますので、構文の違いはかなりマイナーです.最大のハングアップはおそらく資本化の違いだった.私たちは既にバックエンドでF - SUNHIを使用していたので、フロントエンドのDEVSからは少なくとも少しの知識がありました.(今ではバックエンドのDEVSもあります)

不必要な心配
我々が転移について持っていた大きな心配のいくらかは、実際より理論的になりました.ここでは、我々は多分スイッチングの前にあまりに焦点を当てたものです.

オートフォーマット
我々の通常のコーディングワークフローは公式ELMオートフォーマットにかなり依存していた.我々はしばしばちょうどどこで、それを適切な場所にスナップを見て保存をヒットエディタ(特にUI)のコードを吐くだろう.だから、私たちは、これがF - CHERUNIでこれをする公式または明白な経路がなかった時から、これが大きな欠点であると思いました.
現在、2年ほど前にF・セ・エルミッシュで製品を開発しているので、大したことはないと言うことができます.主要な要因の1つは、ニューラインがf .すべてのそれらのセパレータを正しく取得することは、エルムオートフォーマットの主な利点の一つであり、F .第二に、我々の使用に便利な方法でコードを表現する自由がありました.我々は実験し、最終的には、このフォームを選択しました.
let view model dispatch =
  div [] [
    div [] [
      str "blah"
    ]
  ]
子のコンテンツの主要なシンボル(リストブラケット、カンマ/セミコロン)なしで、これは任意のレベルでコードをより友好的に移動することになります.Ctrl - Sをオートフォーマットにする代わりに、インデントまたはアウトデントキーを複数回ヒットさせます.
そして最後に、エルムオートフォーマットはいくつかの一般的なケースで余分な垂直空白のトンを作成しました.特にlet and case 時々、間隔をあけられているブロック.我々は避けて自分自身をキャッチしますlet スペース爆発を避けるために.( case あなたはただそれを受け入れるだけです.)それで、これはもうものでありません.そして実際にはFlet 構文は、我々はそれをはるかに使用します.
これはエルムの自動フォーマットと全く同じではありませんが、全体的に私はそれが同等かより良い生活の質であると言います.

ディスパッチ機能
ELMでは、DOMイベントからMSGをトリガーしたいときは、どのメッセージを送信したいのかわかります.例:onClick Clicked . しかし、Elmishはあなたにディスパッチ機能を与えます、そして、ViewのDOMイベントでは、副作用であるそれを送るために、あなたのメッセージでディスパッチを呼び出しなければなりません.f . chenではこれは以下のようになります.OnClick (fun _ -> dispatch Clicked) .
私は、このアプローチに関する主な懸念は奇妙な側の効果的なことをして、見解をより保守的にしているDEVSでした.しかし、その懸念はこれまで具体化されていない.もう一つのマイナーな問題はDOMイベントハンドラがタイプにより長いということです.
私はエルミッシュの管理者にこれについて尋ねました.elmが何をするかにマッチするために反応します.しかし、それはちょうど必要と思われませんでした.そして、ディスパッチ機能アプローチを維持することによって、それはelmishを変更なしでより多くのUI目標に移植しました.
同様に、我々はエルムの方法をelm方法に翻訳するために、我々自身の図書館を書くことができました、しかし、それはちょうどそれの価値がないようでした.それで、結局、DOMイベントハンドラがわずかにより長く書くことを受け入れるだけです.我々は、特に退屈なもののヘルパー機能を記述します.そして、それが読むのがよりエレガントでないけれども、我々の源材料(DOM)からのより少ない分離のマイナーな上側が、あります.ELMでは、カスタムイベント動作のためにDOMデコーダを記述しなければなりません.しかしFではない.

I never found much benefit in decoding DOM values for DOM events anyway. If there was an error, it was silently ignored (I assume in order to have no runtime exceptions) and I usually wanted to see it to know I wired up something wrong.



副作用
Fは、角の効果を実用的な言語のデザインの選択としてどこにでもできます.つまり、副作用を実行することができますupdate そして、f - chenは文句を言わない.そうすることはMVUパターンの価値をアンダーカットします、そして、明らかにものは通り抜けます.これは私たちにとって問題にならなかった.しかし、私が設計し、副作用が発生する特定の領域を指定する時間を投資したため.
これを行うには、MVUパターンに関数とデータ型を追加しました.機能はperform とデータ型はEffect . それをelm視点から見ることEffectCmd . And perform は、ports経由で起動したJSコードと大略同じです.しかし、いくつかの主要な品質の生活の違い.

Adding in perform and Effect was done purely in user space. It only took a couple of tiny adapter functions to make it work with Elmish.


まず、効果はあなたによって定義され、値を等しくすることができます.つまり、モデルが正しく更新されたことをテストできます.しかし、正しい副作用が正しいオプションで呼び出されたことをテストすることもできます.同等のチェックを使用するだけで-いいえモッキング.🤯 あなたはelmでそれをすることさえできません.効果は、CMDとは異なり、制御するため、それはあなたが必要などんな副作用を行うために拡張可能です.

Slight downside, that also means you need to create effects for common scenarios that would already be built into Elm like HTTP requests. On the plus side, there are plenty of libraries that provide F# idioms on top of common JS APIs. For example, we use Fable.SimpleHttp to make HTTP requests.


第二にperform 関数はf≠で書かれる.重要な理由は、エルムがあなたがJSに副作用を書くことを強制するからです.そして、データは、JSとELMの間を通過する符号化/復号化プロセスを通過しなければなりません.もうperform . そして、あなたがあなたの副作用の一部としてJS機能を呼び出す必要がある場合は、F .名前空間を開き、それがf - ChorzであったかのようにJS関数を直接呼び出す.同期、非同期、try/catch -それはすべてあなたに利用可能です.

You can also export F# code so that it can be called as a JS module. Or import JS modules into F#.


すべてのTolled,副作用はどこでもエルムからf .までの切り替えで最大の恐怖であった.しかし、F - CHERUNIから副作用を呼ぶことができることによって提供される柔軟性は、生命改善の一つの最大の品質をもたらしました.

下方

初心者体験
エルムは言語ではない.また、プラットフォームとツールのセットです.したがって、そのドキュメントは、エンドツーエンドのアプローチを取ることができ、初心者にとって非常に良いです.そして私達の会社は初心者を雇って、プログラムするためにそれらを教える.
一方、私たちのfけんかのソリューションは、さまざまなTechs(寓話、エルミッシュ、反応、F)は、それぞれ独自のさまざまなレベルのドキュメントのミックスです.そして、ほとんどは完全な初心者を対象としていません、また、彼らは常に粘着性があります.もFは、一般的にあなたがOOの言語から来ていると仮定します.
私は彼らのためにいくつかのものを設定しますが、必ず彼らはエルムよりもはるかに多くのJS生態系恐怖にさらされる必要があります.(ほとんどのフロントエンド技術のように)圧倒的であり、新しいポスターとして発起する症候群である.

Q & A
私はあなたが質問をして、それに答えるふりをします.

エルムアプリをF .
それ自体にゴールとしてでなく.我々はまだ角度1を持っている.Xのアプリはここに、そこにので、我々はまだそれらを書き直さなかった.0.18のツールチェーンが動作し続ける限り、我々はそれを維持し続けることができます.

あなたは、fに対するスイッチングを残念に思います?
いいえ、それは私の視点からの改善です.

あなたは、エルムについて不満を掲示することを後悔しますか?
全体的には、期待されていなかったVitriolは楽しみではなかったが、他の人が感じていた方法にも声をかけるようだった.そして、彼らはそう言いました.

誰があなたに従っていたのですか?
OK、これはどこに行くのか.しかし、私はあなたの質問に答えます.誰も責任がなかった.私は、それがちょうど状況の不運な組合せと認めます.

あなたは、ちょうどあなたがメンバーであるどんなコミュニティにでも欠点を見つけると思いませんか?

I refuse to join any club that would have me as a member.

  • Groucho Marx

ジョークを脇に、コミュニティに参加する理由は、コミュニティがやっていることを事前に支援することです.“支援”の一環として、常に現在の方向に反対したり、“悪い”機能をしたい一部のメンバーがあります.しかし、ほとんどのコミュニティ私はこれらの状況を扱ってきた.異なる.

エルムは、それからあなたによると、「改善されました」?
そうでしょう私はそれに全く関係していない.我々は、まだこの質問の行をしていますか?

あなたがelmishのために推薦するテンプレートがありますか?
私は、私が直接の経験をする1つがないように、我々のものをまとめました.しかし、安全なスタック2.0テンプレートは良い出発点のようです.私は、最小限のテンプレートの追加を見てうれしかったです.