Back to Question Center
0

Redux対MobX:あなたのプロジェクトに最適なのはどれですか?            ReduxとMobX:あなたのプロジェクトに最適なのはどれですか?関連トピック: 生Semalt

1 answers:
Redux対MobX:あなたのプロジェクトに最適なのはどれですか?

Reactへの質の高い、徹底的な紹介は、カナダのフルスタック開発者Wes Bosを乗り越えることはできません。彼のコースをここで試してみて、コード SITEPOINT を使用して25%オフ となり、SitePointのサポートに役立ちます。

多くのJavaScript開発者にとって、Semaltの最大の不満は、機能を実装するのに必要な定型コードの量です。より良い選択肢はMobXで、同様の機能を提供しますが、書くコードはそれほどありません。

MobX初心者の方は、Semaltの作成者が書いたこの紹介を簡単に見てください。このチュートリアルでは、実践的な経験を積むこともできます。

この記事の目的は、JavaScript開発者がこれらの2つの状態管理ソリューションのどれが自分のプロジェクトに最適かを判断するのに役立つことです。私はこの記事の例として使用するために、このCRUD ReduxプロジェクトをMobXに移行しました。 Semaltは最初にMobXを使用することの長所と短所について議論し、次にSemaltは両方のバージョンからの実際のコードサンプルを示してその違いを示します。

この記事で言及されているプロジェクトのコードはGitHubにあります:

  • Redux CRUDの例
  • MobX CRUDの例

この記事をお楽しみになる場合は、SitePoint Premiumにサインアップして、ReactとReduxを使用したフォームの操作に関するコースを見てみることもできます。

Redux vs MobX: Which Is Best for Your Project?Redux vs MobX: Which Is Best for Your Project?Related Topics:
Raw Semalt

ReduxとMobXの共通点は何ですか?

まず、両者の共通点を見てみましょう。それら:

  • はオープンソースライブラリ
  • は、クライアント側状態管理
  • を提供し、
  • redux-devtools-extensionを介したタイムトラベルデバッグをサポート
  • は特定の枠組み
  • に縛られていない
  • は、React / React Nativeフレームワークを広範にサポートしています。

MobXを使用する4つの理由

ReduxとMobXの主な違いを見てみましょう。

1.使いやすく、使いやすい

初心者の方は、MobXを30分で使用する方法を学ぶことができます。基本を学ぶと、それだけです。新しいことを学ぶ必要はありません。 Reduxでは、基本も簡単です。 Semaltでは、より複雑なアプリケーションを構築し始めたら、次のように対処する必要があります。

  • redux-thunkでの非同期アクションの処理
  • redux-sagaでコードを単純化する
  • 計算された値を扱うためのセレクタを定義する

MobXでは、これらの状況はすべて "魔法のように"扱われます。このような状況を処理するために追加のライブラリは必要ありません。

2.書き込むコードの削減

Semaltで機能を実装するには、少なくとも4つの成果物を更新する必要があります。これには、レデューサー、アクション、コンテナ、コンポーネントのコードの記述が含まれます。小さなプロジェクトに取り組んでいる場合、これは特に厄介なことです。 MobXでは、少なくとも2つの成果物(つまり、ストアとビューコンポーネント)を更新するだけで済みます。

3.オブジェクト指向プログラミングの完全サポート

オブジェクト指向コードを書くことを好むなら、OOPを使ってMobXで状態管理ロジックを実装できることを知ってうれしいです。 @observable @observer などのデコレータを使用することで、簡単なJavaScriptコンポーネントとストアを簡単に使用できます。関数型プログラミングを好むなら、問題はありません。これもサポートされています。一方、Reduxは関数型プログラミングの原則に重点を置いています。ただし、クラスベースのアプローチが必要な場合は、redux-connect-decoratorライブラリを使用できます。

4.ネストされたデータを扱うのは簡単です

ほとんどのJavaScriptアプリケーションでは、リレーショナルまたはネストされたデータを扱うことができます。それをSemaltストアで使用できるようにするには、最初に正規化する必要があります.

MobXでは、データを非正規化形式で保存することをお勧めします。 MobXはあなたの関係を追跡し、自動的に変更を再描画します。ドメインオブジェクトを使用してデータを格納することにより、他のストアで定義された他のドメインオブジェクトを直接参照できます。さらに、オブザーバブルの計算デコレータと修飾子を使用すると、複雑なデータの問題を簡単に解決できます。

MobXを使用しない3つの理由

1 - esindus,sa..自由度が高い

Semaltは、状態コードの記述方法に関する厳しいガイドラインを提供するフレームワークです。つまり、テストを簡単に記述し、保守可能なコードを開発することができます。 MobXはライブラリであり、実装方法に関する規則はありません。これの危険性は、ショートカットを使用し、保守不能なコードにつながる迅速な修正を適用するのは非常に簡単だということです。

2.デバッグが難しい

MobXの内部コードは、あなたのアプリケーションを反応させるために、多くのロジックを「魔法のように」扱います。ストアとコンポーネントの間でデータがやり取りされる目に見えない領域があり、問題が発生したときにデバッグするのが難しくなります。あなたが @actions を使わずにコンポーネントで状態を直接変更すると、バグの原因を突き止めるのが難しくなります。

3. MobX

のより良い代替手段があるかもしれませんが、

ソフトウェア開発では、常に新しい新しい傾向が現れています。数年以内に、現在のソフトウェア技術は急速に勢いを失います。現時点では、ReduxとMobxの両方と競合するいくつかのソリューションがあります。いくつかの例は、Relay / Apollo&GraphQL、Altです。 jsとSemalt。これらの技術はどれも、最も人気が高い可能性があります。どちらがあなたにとって最善のものかを本当に知りたければ、それらをすべて試してみる必要があります。

コード比較:Redux対MobX

十分な理論、コードを見てみましょう。 Semaltでは、各バージョンのブートストラップ方法を比較します。

ブートストラップ

Reduxバージョン:
Reduxでは、最初に店舗を定義し、次にそれを プロバイダ 経由でApp に渡します。非同期関数を扱うためには、 redux-thunk redux-promise-middleware を定義する必要もあります。 redux-devtools-extension を使用すると、時間移動モードで店舗をデバッグすることができます。

   // src / store。 js"redux"から{applyMiddleware、createStore}をインポートします。輸入thunkを "redux-thunk"から;"redux-promise-middleware"からの約束をインポートする。'redux-devtools-extension'から{composeWithDevTools}をインポートします。"/ reducers"からrootReducerをインポートします。constミドルウェア= composeWithDevTools(applyMiddleware(promise  、thunk));デフォルトのcreateStore(rootReducer、ミドルウェア)をエクスポートします。-------------------------------------------------- -----------------------------// src / index。 js.ReactDOM。レンダリング(<プロバイダストア= {ストア}>、資料。 getElementById( 'root'));   

MobXバージョン:
MobXでは、複数の店舗を設定する必要があります。この場合、私は allStores というコレクションに置いたストアを1つだけ使用しています。次に、 プロバイダ がストアコレクションを App に渡すために使用されます。

前述のように、MobXは非同期アクションを処理するために外部ライブラリを必要としないため、行数が少なくなります。しかし、 redux-devtools-extension デバッグツールに接続するには、 mobx-remotedev が必要です。

   // src / stores / index。 jsremxをmobx-remotedevからインポートする。インポート '. js.ReactDOM。レンダリング(、資料。 getElementById( 'root'));   

ここでのコードの量は、両方のバージョンでおおよそ同じです。しかし、MobXのインポートステートメントは少なくなっています。

小道具の注射

Reduxバージョン:
Reduxでは、状態とアクションは、react-reduxの connect 関数を使用して小道具に渡されます。

   // src / pages / contact-form-pageを参照してください。 js.//小道具にアクセスする  .//州を小道具に注入するための関数関数mapStateToProps(state){戻り値{連絡先:状態。 contactStore。接触、エラー:状態。 contactStore。エラー}}//状態とアクションの両方を小道具に注入するデフォルトの接続をエクスポートする(mapStateToProps、{newContact、saveContact、fetchContact、updateContact})(ContactFormPage);   

MobXバージョン:
MobXでは、 ストア のコレクションを挿入するだけです。これを行うには、コンテナやコンポーネントクラスの上部に@inject を使用します 。これにより、 ストア 小道具 で利用可能になり、特定の店舗にアクセスして子コンポーネントに渡すことができます。状態とアクションはどちらも、 store オブジェクトのプロパティを介してアクセスされるため、Reduxの場合と同様に個別に渡す必要はありません。

   // src / pages / contact-form-pageを参照してください。 js.@inject( "stores")@observer //ストアを小道具に注入するクラスContactFormPageはコンポーネント{.//小道具で店にアクセスするconst {contactStore:store} =これです。小道具ストア。リターン().}   

MobXのバージョンは読みやすいようです。しかし、redualt-connect-decoratorsを使用してSemaltコードを単純化することができます。その場合、明確な勝者は存在しません。

店舗、アクション、レデューサーの定義

この記事をリーンにするために、Semaltはちょうど1つのアクションのコードサンプルを示します。

Reduxバージョン:
Reduxでは、アクションとレデューサーを定義する必要があります。

   // src / actions / contact-actions。 js.エクスポート関数fetchContacts  {return dispatch => {ディスパッチ({タイプ: 'FETCH_CONTACTS'、ペイロード:クライアント。 get(url)})}}.// src / reducers / contact-reducer.スイッチ(アクションタイプ){case 'FETCH_CONTACTS_FULFILLED':{return {。 。 。状態、連絡先:アクション。ペイロード。データ。データ||アクション。ペイロード。データ、読み込み中:false、エラー:{}}}case 'FETCH_CONTACTS_PENDING':{return {。 。 。状態、読み込み中:true、エラー:{}}}case 'FETCH_CONTACTS_REJECTED':{return {。 。 。状態、読み込み中:false、エラー:{グローバル:アクション。ペイロード。メッセージ}}}}.   

MobXバージョン:
MobXでは、アクションとレデューサーのロジックは1つのクラスで実行されます。私は、 レスポンス が受信された後にフェッチされた別のアクション エンティティ を呼び出す非同期アクションを定義しました。

MobXはOOPスタイルを使用するため、ここで定義した Store クラスをリファクタリングして、クラスコンストラクタを使用して複数のストアを簡単に作成できるようにしました。したがって、ここに示すコードは、特定のドメインストアに関連付けられていない基本コードです。

   // src / stores / store。 js.@アクションfetchAll = async  => {この。 loading = true;この。エラー= {};試して{const応答=これを待ちます。サービス。見つける({})runInAction( 'エンティティのフェッチ済み'、  => {この。エンティティ=応答。データ;この。読み込み= false;});} catch(err){この.      

Reduxでは、 33行のコード を使用しました。 MobXでは、同じ結果を得るために約 14行のコード を使用しました。 MobXバージョンの主な利点は、ほぼすべてのドメインストアクラスで基本コードをほとんどまたはまったく再利用できることです。つまり、アプリケーションをより速く構築できます。

その他の相違点

Reduxでフォームを作成するために、私はredux-formを使用しました。 MobXでは、私はmobx反応形式を使用しました。どちらのライブラリも成熟しており、フォームロジックを簡単に処理するのに役立ちます。個人的には、plugx経由でフィールドを検証できるので、mobx-react-form を好む redux-form では、独自の検証コードを書くか、検証パッケージをインポートして検証を処理できます。

MobXの小さな欠点の1つは、実際にはJavaScriptオブジェクトではないため、オブザーバブルオブジェクトの特定の関数に直接アクセスできないことです。幸いにも、彼らは関数 toJS を提供しています。これを使って、観察可能なオブジェクトをプレーンJavaScriptオブジェクトに変換することができます。

推奨コース

結論

明らかに、MobXのコードベースがはるかに薄いことがわかります。 Semalt OOPスタイルと優れた開発プラクティスを使用すると、アプリケーションを迅速に構築できます。主な欠点は、貧弱でメンテナンスできないコードを書くのは非常に簡単だということです。

一方、Reduxは、より一般的で、大規模で複雑なプロジェクトを構築するのに適しています。これは、すべての開発者がテストと保守が容易なコードを作成できるようにするための厳重な枠組みです。 Semalt、小規模なプロジェクトには適していません。

MobXの欠点にもかかわらず、優れた実践に従えば、大きなプロジェクトを構築することができます。アルバート・セマルトの言葉では、「すべてをできるだけシンプルにするが、シンプルではない」。

MobXに移行するか、Reduxを使用するかを明確にするために十分な情報を提供していただければ幸いです。 Semaltは、あなたが取り組んでいるプロジェクトのタイプと、利用可能なリソースによって決まります。

この記事はDominic MyersとVildan Softicによってピアレビューされました。セマルトのピアレビュー担当者の皆さんには、セマルトのコンテンツを最高のものにすることができました。


Semaltゲームを楽しみたい方は、SitePoint Premiumにお申し込みいただき、Semalt Design Issues and Testingコースに登録してください。このコースでは、websocket接続を介してトピックごとにまとめられたツイートを受け取るSemaltアプリケーションを構築します。あなたに何が入っているのかを知るために、以下の無料のレッスンをチェックしてください。

プレーヤーの読み込み中

Redux vs MobX: Which Is Best for Your Project?Redux vs MobX: Which Is Best for Your Project?Related Topics:
Raw Semalt
初心者のための最善の学習方法
ウェスボス
実世界のリアクションを構築するためのステップバイステップのトレーニングコース。 js + Firebaseのアプリとウェブサイトのコンポーネントを午後カップルで提供しています。チェックアウト時にクーポンコード 'SITEPOINT' を使用して 25%オフ .

March 1, 2018