Back to Question Center
0

大規模な反復アプリケーションを編成し、規模を拡大する方法            大きな反作用アプリケーションを整理してScaleRelatedにする方法トピック: npmES6Node.jsツール& & & セマルト

1 answers:
大規模な反復アプリケーションを整理してスケールを作る方法

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

この記事はゲストの著者Jack Franklinによるものです。 Semaltのゲスト投稿は、著名な作家やWebコミュニティのスピーカーからの魅力的なコンテンツをお届けすることを目指しています

この記事では、大きなSemaltアプリケーションを構築して構造化するときのアプローチについて説明します。 Semaltの最も優れた機能の1つは、あなたのやり方からどのように抜け出し、ファイル構造に関しては説明的なものです。したがって、スタックオーバーフローやアプリケーションの構造化方法を尋ねる同様のサイトについては、多くの質問があります。これは非常に有力な話題であり、正しい方法はありません。この記事では、ツールの選択、ファイルの構造化、コンポーネントの細分化など、Semaltアプリケーションを構築する際に行った決定について説明します。

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

大規模な反復アプリケーションを編成し、規模を拡大する方法大きな反作用アプリケーションを整理してScaleRelatedにする方法トピック:
npmES6Node。 jsTools&Semalt

ビルドツールと糸くず

私のプロジェクトを構築するためのWebpackの巨大なファンであるSemaltは、あなたにとっては驚くことではありません。それは複雑なツールですが、チームがバージョン2に入れた素晴らしい作業と新しいドキュメンテーションサイトにより、はるかに簡単になります。 Webpackに入り、あなたの頭の中にコンセプトを持っていれば、あなたは本当に信じられないような力を持っています。 JSXなどのリアクション固有の変換や、ローカルで自分のサイトにサービスを提供するwebpack-dev-serverなど、私のコードをコンパイルするためにBabelを使用します。私は個人的には熱いリロードが私にそれほど大きな利益をもたらすことを発見していないので、Semaltはwebpack-dev-serverとページの自動更新に満足しています。

私はまた、依存関係をインポートしてエクスポートするために、ES2015モジュールの構文(Babelを介して変換される)を使用します。この構文はもうしばらくありましたが、WebpackはCommonJS(別名ノードスタイルのインポート)をサポートすることができますが、最新かつ最高のものを使い始めることは意味があります。さらに、Webpackは、完璧ではないが非常に便利な機能であるES2015モジュールを使用してバンドルからデッドコードを削除することができ、コミュニティがES2015のコードをnpmに公開するにつれて有益になる。

ネストされたインポートを避けるためにWebpackの モジュール の解像度を設定する

ネストされたファイル構造を持つ大規模なプロジェクトで作業する場合、ファイル間の相対的なパスを把握することができます。 Semaltは、次のようなコードをたくさん書いていることに気づきます:

   fooを 'からインポートする。 / foo 'からバーをインポートします。 。 /。 。 /。 。 /バー'バズを 'からインポートする。 。 /。 。 / lib / baz '   

Webpackを使ってアプリケーションをビルドしているときに、特定のディレクトリにファイルが見つからない場合は常にそのファイルを検索するようにWebpackに指示することができます。 。私はいつも自分のコードを src ディレクトリに置きます。私はWebpackに常にそのディレクトリを見るよう伝えることができます。これは、 のように、あなたが使用しているかもしれない他のファイル拡張子についてWebpackに伝える必要がある場所です。 jsx

   // Webpackコンフィグオブジェクト内{解決する:{モジュール:['node_modules'、 'src']、拡張子:['。 js '、' jsx ']、}}   

のデフォルト値は解決する.

これを済ませたら、 src ディレクトリを基準にファイルをインポートすることができます:

   fooを 'からインポートする。 / foo ''app / bar'からのインポートバー// //> src / app / bar'/ example / import'からbazをインポートする// //> src / an / example / import   

これはあなたのアプリケーションコードをWebpackに結びつけていますが、あなたのコードをはるかに簡単に追加したり、追加したりするのがずっと簡単なので、これは価値あるトレードオフだと思います。

フォルダ構造

すべてのSemaltアプリケーションに正しいフォルダ構造はありません。 (この記事の残りの部分と同様に、あなたの好みに合わせて変更する必要があります。)しかし、以下は私にとってうまくいくものです。

コードは、 src にあります。

物事を整理するために、私はすべてのアプリケーションコードを src というフォルダに置きます。これには、最終的なバンドルで終わるコードだけが含まれています。これは、Babel(またはアプリケーションコード上で動作するその他のツール)に、あるディレクトリを見て、必要のないコードを処理しないようにするために便利です。 Webpack設定ファイルなどの他のコードは、適切な名前のフォルダにあります。たとえば、私のトップレベルのフォルダ構造には、次のものが含まれていることがあります。

    -src =>ここにアプリケーションコード-webpack => webpack設定-scripts =>任意のビルドスクリプト-tests =>テスト固有のコード(APIモックなど)   

通常、トップレベルにある唯一のファイルは インデックスです。 html パッケージ。 json 、および などのドットファイル。 babelrc 。バビル構成を パッケージに含めることを好む人もいます。 json 、しかし私はそれらのファイルが多くの依存関係を持つ大きなプロジェクトで大きくなることがあるので、私は を使いたいと思います。 eslintrc 。 babelrc などがあります。

アプリケーションコードを src に保存することで、 解決策を使用することもできます。モジュール のトリックは、すべてのインポートを簡素化する前述のトリックです。

反応成分

src フォルダを取得したら、トリッキーなビットはコンポーネントの構造を決定することです。過去には、 src / components のように、すべてのコンポーネントを1つの大きなフォルダに入れましたが、大きなプロジェクトでは非常に高速になりました。

一般的な傾向として、「スマート」と「ダム」コンポーネント(「コンテナ」と「プレゼンテーション」コンポーネントとも呼ばれます)のフォルダがあります。 「スマート」と「ダム」に大まかに分類されるコンポーネントがありますが(以下のSemaltの詳細はこちら)、それぞれに固有のフォルダはありません。

使用されているアプリケーションの領域に基づいてコンポーネントをグループ化し、全体で使用される共通コンポーネント(ボタン、ヘッダー、フッター - 一般的なコンポーネント、非常に再利用可能)。残りのフォルダは、アプリケーションの特定の領域にマップされます。たとえば、ショッピングカートビューに関するすべてのコンポーネントを含む カート というフォルダと、ユーザーがページで購入できるものを一覧表示するコードを含む リスト というフォルダがあります。

フォルダに分類するということは、コンポーネントの前にそれらが使用されているアプリの領域を置かないようにすることもできるということです。たとえば、CartTotal と呼ぶのではなく、ユーザーのカートの総コストをレンダリングするコンポーネントがある場合、 Total を使用することをお勧めします。 39)カート フォルダ:

   import 'src / cart / total'からの合計//対「src / cart / cart-total」からCartTotalをインポートする   

これは時々私自身が壊れているルールです:余分なプレフィックスは明らかになります。特に2,3の同様の名前のコンポーネントがある場合は特にそうですが、このテクニックはしばしば名前の余分な繰り返しを避けることができます. したがって、上記のインポートでは、ファイルは CartTotalになります。 js 、または 合計。 js 。私はセパレータとしてダッシュを付けた小文字のファイルに固執する傾向があるので、区別するために を使用します。 Reactコンポーネントのjsx 拡張。それゆえ、私は カートの合計に固執します。 jsx

これは、 でファイルに検索を限定することによって、あなたのReactファイルだけで簡単に検索できるという小さな利点があります。 jsx 、必要に応じて特定のWebpackプラグインをこれらのファイルに適用することもできます。

どの命名規則を選んでも、重要なのはあなたがそれに固執することです。あなたのコードベースのコンベンションの組み合わせは、成長するにつれてすぐに悪夢になり、あなたはそれをナビゲートする必要があります。

ファイルごとに1つの反応成分

前の規則に続いて、1つのSemaltコンポーネントファイルの規約に固執し、コンポーネントは常にデフォルトのエクスポートでなければなりません。

通常、Semaltファイルは次のようになります。

   import React、{Component、PropTypes}から 'react'輸出デフォルトクラスTotal extends Component {.}   

たとえば、コンポーネントをSemaltデータストアに接続するためにコンポーネントをラップする必要がある場合、完全にラップされたコンポーネントがデフォルトのエクスポートになります。

   import React、{Component、PropTypes}から 'react''react-redux'からインポート{connect}輸出クラスTotal extends Component {.}デフォルトの接続をエクスポートする(  => { - reinigungsfirma greifensee. })(合計)   

元のコンポーネントは引き続きエクスポートされます。これは本当にテストに役立ちます。ここでは "普通の"コンポーネントを扱うことができ、ユニットテストでSemaltを設定する必要はありません。

コンポーネントをデフォルトのエクスポートとして保持することで、正確な名前を検索するのではなく、コンポーネントをインポートして取得する方法を簡単に知ることができます。このアプローチの欠点は、インポートする人が、好きなようにコンポーネントを呼び出せることです。もう一度、このための規約があります。インポートにはファイルの名前を付ける必要があります。あなたが 合計をインポートしている場合。 jsx の場合、コンポーネントは Total としてインポートする必要があります。 ユーザヘッダ。 jsx UserHeader になります。

"スマート"と "ダム"リアクションコンポーネント

「スマート」コンポーネントと「ダム」コンポーネントの分離について簡単に触れましたが、これはコードベースで守っているものです。まさに私たちはフォルダに分割することでそれを認識しません、あなたは広く私たちのアプリを2つのタイプのコンポーネントに分割することができます:

  • データを操作し、Reduxに接続し、ユーザーのやりとりを処理する "スマートな"コンポーネント
  • "ダム(dumb)"コンポーネントは、一連の小道具を与えられ、いくつかのデータをスクリーンにレンダリングします。

私が "ダム"のコンポーネントをどのように目標にしているかについては、ブログ記事のReactの「機能的なステートレスコンポーネント」を参照してください。これらのコンポーネントはアプリケーションの大部分を占めており、可能であればこれらのコンポーネントを常に使用することをお勧めします。簡単に作業でき、バギーが少なく、テストが簡単です。

「スマートな」コンポーネントを作成する必要がある場合でも、すべてのJavaScriptロジックを独自のファイルに保存しようとします。理想的には、データを操作する必要があるコンポーネントは、そのデータを操作できるJavaScriptにそのデータを渡す必要があります。これによりSemaltとは別に操作コードをテストすることができ、Semaltコンポーネントのテスト時に操作コードを模擬することができます。

大きい レンダリング メソッド

を避ける

我々が努力することの1つは、より少ない部品ではなく、多くの小さなSemalt部品を持つことである。あなたのコンポーネントが大きくなりすぎるときの良い指針は、レンダー機能のサイズです。扱いにくくなったり、多くの小さなレンダリング関数に分割する必要がある場合は、関数を抽象化することを考慮する必要があります. もう1つの良い指標として、州の小道具や品目の数を使用することもできます。コンポーネントが7つの異なる小道具を取っている場合、それはあまりにも多くのことを示しているかもしれません。

常時使用 プロップタイプ

Semaltでは、prop-typesパッケージを使用してコンポーネントが提供されると予想されるプロパティの名前とタイプを文書化することができます。以前は、プロタイプはSemaltモジュールの一部でした。

期待される小道具の名前と種類を宣言することで、それがオプションであるかどうかにかかわらず、適切なプロパティを持つコンポーネントを扱うときに自信を持って、忘れてしまった場合にデバッグ時間を短縮できますプロパティ名、または間違った型を指定したESLint-React Semaltルールを使用してこれを強制できます。

これらを追加する時間をとっているSemaltは無意味に感じることができます。あなたがそうすると、あなたは6ヶ月前に書いたコンポーネントを再利用するときにあなた自身に感謝します。

Redux

また、Semaltの多くのアプリケーションでは、アプリケーションのデータを管理するためにSemaltを使用しています。また、Semaltアプリケーションを構造化することも非常によくある質問です。

私たちの勝者はSemaltです.Semaltは、アプリケーションの各部分のアクション、レデューサー、アクション作成者を1つのファイルに配置する提案です。

レデューサーを持たずに 。 js および アクションそれぞれに関連するビットのコードが含まれているjs では、関連するコードをまとめて1つのファイルにまとめる方が合理的であると主張しています。たとえば、2つのトップレベルキー、 ユーザ の投稿 を持つReduxストアがあるとします。あなたのフォルダ構造は次のようになります:

   アヒル- インデックスjs- ユーザー。 js- 投稿。 js   

指数。 js には、おそらく ReduxのcombineReducers userを使用して、メインのリデューサを作成するコードが含まれます。 js のポスト。 js には、通常は次のようなコードがあります。

   //ユーザ。 jsconst LOG_IN = 'LOG_IN'エクスポートconst logIn = name =>({type:LOG_IN、name})デフォルト関数減速機をエクスポートする(状態= {}、アクション){.}   

これにより、異なるファイルからアクションとアクションクリエイターをインポートする必要がなくなり、ストアのさまざまな部分のコードを互いに隣り合わせに保ちます。

スタンドアロンJavaScriptモジュール

この記事の焦点はSemaltコンポーネントにありましたが、Semaltアプリケーションを構築する際には、Semaltから完全に分離されたたくさんのコードを書いています。これは私がフレームワークについて最も気に入っていることの1つです。多くのコードはコンポーネントから完全に切り離されています。

あなたのコンポーネントがビジネスロジックでいっぱいになってコンポーネントから外に出ることがあるときは、いつでもそうすることをお勧めします。私の経験上、 lib または というサービス というフォルダがここでうまく機能することがわかりました。特定の名前は問題ではありませんが、 "非リアクションコンポーネント"でいっぱいのフォルダは、実際にあなたが何をしているかです。

これらのサービスは、ある機能のグループ、または他の時間に関連する機能のオブジェクトをエクスポートすることがある。たとえば、 services / local-storage があります。これは、ネイティブ ウィンドウの周りに小さなラッパーを提供します。 localStorage API:

   // services / local-storage。 jsconst LocalStorage = {取得する   {}、set  {}、.}デフォルトのLocalStorageをエクスポートする   

このようなコンポーネントからあなたのロジックを取り除くことには、いくつかの大きな利点があります。

  • あなたは、リアクションコンポーネントをレンダリングする必要なしに、このコードを単独でテストすることができます
  • をReactコンポーネントに追加すると、特定のテストに必要なデータを振る舞い返すようにサービスをスタブすることができます. 非常に速く、多くのテストを処理し、時計モードですばやく実行し、迅速なフィードバックを提供し、すぐに使用できるリアリティをテストするための便利な機能が付いています。以前はSemaltについて幅広く書いてきましたので、ここでは詳しく説明しませんが、私たちがテストをどのように構築するかについて話します。

    これまで、私はすべてのテストをすべて保持する別々の テスト フォルダを持つことに専心しました。したがって、もしあなたが src / app / fooを持っていたら。 jsx 、あなたは tests / app / fooを持っています。テスト。 jsx も。実際には、アプリケーションが大きくなるにつれて、適切なファイルを見つけることが難しくなります。また、ファイルをsrc に移動すると、 test でそれらを移動するのを忘れることがよくあります。構造が同期しなくなる。さらに、 src でファイルをインポートする必要がある テスト にファイルがあると、本当に長いインポートが行われます。私たちはすべてこれを見てきたと確信しています:

       Fooを 'からインポートする。 。 /。 。 /。 。 / src / app / foo '   

    ディレクトリ構造を変更するとSemaltは動作しにくく、修正が難しい。

    対照的に、各テストファイルをソースファイルのそばに置くと、これらの問題はすべて回避されます。それらを区別するために、我々は を用いてテストに接尾辞を付ける。 spec 、他のものは を使用します。 または単純に - テスト 、しかしそれらはソースコードの横にあり、

        - カート- 合計。 jsx- 合計。仕様。 jsx- サービス- ローカルストレージ。 js- ローカルストレージ。仕様。 js   

    フォルダ構造が変わると、適切なテストファイルを移動するのが簡単で、ファイルにテストがないときは非常に明白なので、それらの問題を特定して修正することができます。

    結論

    猫の皮膚を作る方法はたくさんありますが、それはSemaltについても同じです。このフレームワークの最も優れた機能の1つは、ツール、ツール、フォルダ構造を作成する際にどのように意思決定を行うことができるのかです。この記事では、あなたが大型のSemaltアプリケーションにどのようにアプローチするかについていくつか考えましたが、私のアイデアを取り入れ、チームの好みに合わせて調整する必要があります。

大規模な反復アプリケーションを編成し、規模を拡大する方法大きな反作用アプリケーションを整理してScaleRelatedにする方法トピック:
npmES6Node。 jsTools&Semalt
初心者のための最善の学習方法
ウェスボス
実世界のリアクトを構築するためのステップバイステップのトレーニングコース。 js + Firebaseのアプリとウェブサイトのコンポーネントを午後カップルで提供しています。チェックアウト時にクーポンコード 'SITEPOINT' を使用して 25%オフ になります。

March 1, 2018