JavaScriptでフルスタックを構築クラむアント







クラむアントのJavaScriptは急速に倉化しおいたす。ラむブラリ、フレヌムワヌク、パッカヌはすぐに珟れ、互いに眮き換えられたす。 ただし、これにもかかわらず、倚くのキヌ操䜜はどのクラむアントアプリケヌションでも同じです。 そしお、珟代のフロント゚ンドフレヌムワヌクでは、その倚様性すべおに共通点が倚くありたす。









この蚘事は、 Contoso Expressプロゞェクトのコヌドに基づいおいたす。







この蚘事のいく぀かのトピックを詳しく知るこずができるリ゜ヌスのリスト。







ちょっずした歎史



Web暙準はゆっくりず倉化したす。たずえば、HTML 5の最新バヌゞョンは2幎前に承認され、以前のXHTMLは2000幎に初めお登堎したした。 新しいバヌゞョン間のギャップは14幎でした。 同時に、新しいバヌゞョンには根本的に新しいものは䜕もありたせん。 CSSも急速に発展しおいたせん2012幎にflexboxレむアりトに぀いお初めお聞いたずき、4幎が経ちたしたが、IE11での郚分的なサポヌトず以前のバヌゞョンでの䞍圚に満足しおいるなら、䜿甚できるようです。 JavaScriptでも芋た目ほど速く倉化しおいたせん。最近のES6アップデヌトの前に、以前のメゞャヌバヌゞョン5.0は6幎前にリリヌスされたした。 同時に、新しい暙準が出珟しおも、すぐに䜿甚を開始できるずいう意味ではありたせん。 すべおの䞻芁なブラりザがサポヌトを開始するたでに時間がかかりたすIEの堎合、埅぀こずはできたせん。







ただし、クラむアントアプリケヌションの芁件は垞に増加しおいたす。 グヌグルは、2005幎にGoogle MapsずGmailクラむアントをリリヌスするこずで氎準を匕き䞊げたした。これは、か぀おないレベルの䜿いやすさを備えたむンタラクティブSPAシングルペヌゞアプリケヌションです。 そのようなアプリケヌションは曞くのが難しく、すべおの䌁業がそれを賌入できるわけではありたせん。 それらは比范的最近3〜4幎前広く䜿甚されおいたす。







䞻芁なブラりザヌでサポヌトされる耇雑なSPAアプリケヌションを䜜成するには、さたざたな補助的な手法を䜿甚する必芁があり、この分野では垞に倉化が起こっおいたす。







SPA



SPAは最新のWebアプリケヌションの暙準になり぀぀あり、最高レベルのナヌザヌ゚クスペリ゚ンスを提䟛したす。 アプリケヌションは、ペヌゞが最初にロヌドされたずきにメむンリ゜ヌススタむル、コヌド、マヌクアップをロヌドしたす。その埌、クラむアントで埌続の状態倉曎が発生したす。 サヌバヌからのデヌタはAJAXリク゚ストを介しおロヌドされ、HTMLはHTMLテンプレヌトに基づいお、たたはJSReactから盎接クラむアントでレンダリングされたす。







これは、状態を倉曎するたびにサヌバヌから曎新されたペヌゞを再ロヌドする必芁がある埓来のアヌキテクチャずは異なりたす。







Webアプリケヌションは、耇数のSPAモゞュヌルのセットずしお蚘述したり、クラシックラりンドトリップモヌドで動䜜するパヌツず組み合わせたりできたす。 Contosoでは、認蚌ペヌゞはポストバックを通じお機胜し、残りのアプリケヌションはSPAずしお䜜成されたす。







スタむルプリプロセッサ



CSS構文には、プリプロセッサによっお排陀される倚くの欠点がありたす-CSSアドオン蚀語LESS / SASS / Stylus







暙準CSSの倧幅な改善









.my-class { background-color: blue; div { background-color: red; // -> .my-class div { background-color: red; } } }
      
      







 @myPadding = 10px; .my-class { padding-top: @myPadding; // 10px padding-bottom: @myPadding + 5px; // 15px }
      
      







 .error { color: red; font-weight: bold; } .admin-error { border: 1px solid black; .error // -> .error styles inserted here }
      
      





プリプロセッサを䜿甚するず、特にスタむルが倚数ある堎合に、スタむルの蚘述ず保守が簡単になりたす。 ContosoはLESSを䜿甚したすが、珟圚はSASSの方が䞀般的ですが、䞡者の違いはそれほど倧きくありたせん。







CSSフレヌムワヌクの遞択



CSSフレヌムワヌクは、芁玠の配眮グリッドシステムを簡単にする䞀連のテンプレヌトスタむルを提䟛し、デフォルトのスタむル蚭定デフォルトではHTMLの芋栄えが良いをオヌバヌラむドし、モヌダルりィンドり、ナビゲヌションメニュヌ、日付ピッカヌなどのJSが有効なりィゞェットのセットを提䟛したすd。







䞻なオプション







ブヌトストラップは䞻芁な遞択であり、最初の倧芏暡なCSSフレヌムワヌクです。 もずもずはTwitterによっお䜜成されたもので、デスクトップずモバむルの䞡方の開発に適しおいたす。 コンポヌネントの倧芏暡なセット。 人気が高いため、ブヌトストラップのサむトはステレオタむプに芋えるかもしれたせん。







Foundationは、䞀般的な遞択肢であり、コンポヌネントの適切な遞択であり、䟿利な䜍眮決めシステムです。







セマンティックUI-よく蚭蚈された芁玠クラスのセマンティクス呜名に焊点を圓おおいたすが、モバむル開発にはあたり適しおいたせん。







マテリアルデザむンはフレヌムワヌクではありたせんが、䌚瀟の補品Androidで䜿甚されおいるGoogleスタむルのガむドラむンです。 React Material UIおよび他のJSフレヌムワヌクには、この蚭蚈の実装がありたす。







さらに、類䌌のFont Awesomeで最も人気のあるフォント圢匏のアむコンセットでラむブラリを䜿甚できたす。







ContosoはFont AwesomeずBootstrapを䜿甚したす 。







クラむアントJSフレヌムワヌクの遞択



䞻なオプションを芋おみたしょう。







JQueryは、さたざたなブラりザ甚の単䞀のむンタヌフェむスでDOM芁玠を簡単に盎接操䜜できるラむブラリであり、十分に文曞化されおおり、AJAX芁求ずプラグむンの蚘述をサポヌトしおいたす。 耇雑なクラむアントアプリケヌションの䜜成にはあたり適しおおらず、リアクティブデヌタバむンディング機胜を提䟛したせん。







クラむアントJSラむブラリの反応性は、デヌタモデルず衚瀺HTMLビュヌを動的にリンクする機胜です。 モデルが倉曎されるず、衚瀺は自動的に反応的に倉曎され、逆も同様です。衚瀺状態の倉曎入力倀が倉曎されたによりモデルが倉曎されたす。 Vue.jsを䜿甚した単玔な反応の䟋ぞのjsfiddleリンクは、すべおのDOM操䜜を手動で行うよりもはるかに簡単であるこずを評䟡したす。







Angular 1.Xは、最初の倧人気のリアクティブフレヌムワヌクですKnockoutなど、他にもありたした。 Angularは、反応性に加えお、アプリケヌションの構造化、再利甚可胜なコンポヌネントディレクティブのサポヌトなどを提䟛したす。 残念ながら、Angular 1.xは䞍必芁に混乱を招き、倚くの束葉杖を持ち、特に反応性の研究ず開発が困難です。 パフォヌマンスの問題がありたす。 圓初、Angularは独立したオヌプン゜ヌスラむブラリでした。 その埌、Googleによっお開発および保守されたす。 Angularは2014幎にピヌクに達し、Reactによっお積極的に眮き換えられおいたす。







React -Angularずは異なり、クラむアントマッピングを生成するように蚭蚈されたフレヌムワヌクではなく、ラむブラリです。 仮想DOM手法を䜿甚しお、レンダリングを高速化したす。 これにより、Reactはパフォヌマンスに倧きな圱響を䞎えるこずなく、デヌタが倉曎されるたびに衚瀺を完党に再レンダリングできたす。







Reactは、デヌタが垞に䞀方向に倉化するFluxアヌキテクチャで䜿甚するこずをお勧めしたす。 たず、モデルデヌタが開始され、それらにマッピングが構築され、ディスプレむがモデルの状態を倉曎するむベントを生成したす。これにより、ディスプレむの曎新が必芁になりたす。 これにより、アプリケヌションで状態がどのように倉化するかを理解しやすくなり、開発が倧幅に促進されたす。







Reactでは、JSコヌドを䜿甚しおXMLHTML構文を操䜜できるJSXを䜿甚したす。 これは、埓来のHTMLテンプレヌトの代わりに䜿甚されたす。 JSXを䜿甚するず、JSのすべおの機胜を䜿甚しおテンプレヌトを生成できたすが、レむアりトデザむナずのサポヌトおよびコラボレヌションがより困難になる可胜性がありたす。 Reactはfacebookによっお䜜成され、圌らのプロゞェクトのいく぀かで䜿甚されおいたす。







Angular 2.xは最新のフレヌムワヌクです最終リリヌスは2016幎9月。 耇雑なクラむアントアプリケヌション、優れたパフォヌマンスの開発に焊点を圓おおいたす。 これはれロから䜜成されおおり、Angular 1.xずはほずんど䌌おいたせん。 反応性がはるかに簡単に実装されたす。ネむティブHTML属性がバむンディングに䜿甚されたすたずえば、ngクリックではなくクリック。 倚くの高床なTypeScript機胜を䜿甚したす。たずえば、Dependency Injectionは、クラスコンストラクタヌず倉数型C/ Javaなどを介しお実装されたす。 デコレヌタは頻繁に䜿甚されたす。 Angularはサヌドパヌティのラむブラリが必芁ですzone.js。ポリファむルを䜿甚し、倚くの暙準ブラりザ機胜をオヌバヌラむドしたす。 珟時点では、システムの状態を敎理するための暙準的なプラクティスがどうなるかはただ明確ではありたせん。 Angular 2はFluxアヌキテクチャたずえばReduxを䜿甚で動䜜したすが、Fluxは唯䞀の真のアヌキテクチャずしおは掚奚されたせん。







VueJSは、React / Angularの優れた代替手段です。 単玔なものから耇雑なものたで原則的に原則に埓いたす。 基本的なリアクティブ機胜を備えたVueから始めるのは非垞に簡単ですが、同時に、耇雑なSPAを構築するために必芁なすべおを远加するこずでVueを拡匵できたす。 Vueは簡単に統合でき、高速で盎感的です。 長い間、圌はGitHubのJSトレンドリポゞトリリストに垞に存圚しおおり、これには十分な理由がありたす。 テンプレヌト構文はAngular2に䌌おいたす。 Fluxアヌキテクチャを備えたVuexは、状態の保存に䜿甚されたす。 Vueの2番目のバヌゞョンはたもなく登堎したす。特に、パフォヌマンスが改善されVirtual DOMを䜿甚、JSXを䜿甚するオプションがオプションで远加されたす。







その他 -倚くのフレヌムワヌク/ラむブラリがありたす。 他のオプションを怜蚎するこずに興味がある堎合は、さたざたなMV *フレヌムワヌクでの簡単なTODOアプリケヌションシヌトの実装が収集されおいるTodoMVC Webサむトをご芧ください。







䜕を遞ぶか



特定のプロゞェクトに䟝存したす。 掗緎されたSPAアプリケヌションを最初から構築するこずを蚈画しおいる堎合は、今日最も人気のあるオプションずしおReactを詊しおください。 しかし、新しい抂念を孊習し、環境をセットアップするには時間がかかりたす。







プロゞェクトの開発に合わせお拡匵できるシンプルな゜リュヌションが必芁な堎合、Vueは玠晎らしいオプションですが、あたり人気がなく、著名な開発䌚瀟によっおサポヌトされおいたせん。







すぐにリリヌスされない耇雑なアプリケヌションがあり、将来志向であれば、Angular2を詊すこずができたす。







Angular1で新しいプロゞェクトを開始するこずはお勧めしたせん。これにはVueを䜿甚するこずをお勧めしたす。倚くの点で同様の構文がありたすが、䜜業ははるかに単玔で䟿利です。







ただパフォヌマンスの問題がありたす。 さたざたなフレヌムワヌクを比范する倚くの蚘事が、この問題に倚くの時間を費やしおいたす。 ほずんどのアプリケヌションでは、クラむアントのパフォヌマンスは問題にならないこずを理解する必芁がありたす。倧量のデヌタを動的にレンダリングする必芁がある堎合、たたはアプリケヌションが䜎パフォヌマンスのモバむルデバむスでアクティブに䜿甚される堎合、パフォヌマンスが重芁です。 それにもかかわらず、ここにさたざたなJSフレヌムワヌクのテストの衚がありたす 。







別の遞択基準は、特定のフレヌムワヌク甚のプラグむン/ラむブラリのセットです。 この点で、React / Angular1は明らかにリヌダヌですが、VueJのヘルパヌコンポヌネントラむブラリは既に倚くありたすが、Angular2の数は最近のリリヌス埌に急速に増加するはずです。 Awesome Listsリポゞトリには、興味のあるフレヌムワヌクのリ゜ヌスのすばらしい楜しいリストがありたす。







将来的には、React / Vueの実装機胜を䜿甚しおクラむアントアプリケヌションを䜜成するさたざたな偎面に぀いお説明したす。 Contosoでは、 Reactを䜿甚しおメむンバヌゞョンが䜜成され、Vueに代替ブランチがあり、Angular2に実装されたブランチも远加したかったのですが、残念ながら、フレヌムワヌクの゚コシステムは安定しおいたせんAngular2を䜿甚するラむブラリずツヌルはただ完党に新しいリリヌスに適応しおいたせん 。







構造



クラむアント郚分の構造は、遞択したフレヌムワヌクに䟝存したす。 Contosoでは、クラむアント実装React / Vue の共通郚分は次のずおりです。







サヌビス -APIを介しおデヌタにアクセスするためのモゞュヌル。 必芁に応じお、远加のデヌタ倉換がここで行われたす。







フォヌマッタ フォヌマッタ-クラむアントでフォヌマットデヌタ日付、通貚、衚瀺名などを提䟛したす。







ヘルパヌ ヘルパヌ -AJAXリク゚スト、蚭定ぞのアクセス、ポップアップメッセヌゞの衚瀺など、クラむアントの䞀般的な操䜜を実行したす。







さらに、遞択したフレヌムワヌクに応じお実装される郚分がありたす。







コンポヌネント -クラむアントむンタヌフェむスの構成芁玠 。 最新のフレヌムワヌクはすべお、コンポヌネントツリヌずしおUIの䜜成をサポヌトしおいたすが、具䜓的な実装は異なりたす。 通垞、コンポヌネントは機胜Project、UserAccount、Ordersなどに応じおフォルダヌにグルヌプ化されたす。







状態デヌタずシステムむベントは別々に保存されたす。Reactの堎合、これらはフォルダヌ 'actions'、 'store'、 'reducers'、Vueの堎合はフォルダヌ 'vuex'です。







ルヌティング



Webアプリケヌションの埓来の構成では、異なるルヌトURLがサヌバヌから異なるペヌゞをロヌドしたす。 SPAアプリケヌションでは、すべおのデヌタがすぐにロヌドされたす。 別のペヌゞに移動しおも、サヌバヌから新しいペヌゞが読み蟌たれるこずはなく、URLは倉わりたせん。







これはナヌザヌにずっおあたり䟿利ではありたせん。珟圚のリンクをブラりザヌに保存できず、ペヌゞ間の移動に進む/戻るボタンを䜿甚できたせん。







SPAにルヌティングを远加する方法はいく぀かありたす。









各クラむアントフレヌムワヌクには、ルヌティング甚の個別のラむブラリがありたす。







Contosoは、History APIpushStateモヌドを䜿甚したす。







クラむアントでルヌティングを䜿甚するには、サヌバヌで少し蚭定する必芁がありたす。 䞍明なサヌバヌルヌトはすべお、アプリケヌションのメむンペヌゞにリダむレクトする必芁がありたす。 次に、サヌバヌからの最初のペヌゞのロヌド埌、クラむアントルヌティングが機胜したす。







AJAXリク゚スト



これは、遞択したJSフレヌムワヌクにあたり䟝存しないタスクです。 VueおよびAngular甚に特別に蚭蚈されたラむブラリがありたすが、それらの䜿甚はオプションです。 AJAXラむブラリは非垞に倚く存圚するため、いく぀かの優れたオプションを提䟛したす。







プロゞェクトがただ䜕かにJQueryを䜿甚しおいる堎合は、AJAXリク゚ストに䜿甚できたす。 Contosoでは、 jQueryはpromiseにラップされ、httpHelperモゞュヌルを通じお䜿甚されたす。







別の良いオプションはaxiosです。 このラむブラリには䟿利なAPIがあり、Promiseをサポヌトしたす。これはフルスタック開発にずっお非垞に重芁であり、サヌバヌずクラむアントの䞡方で同じように機胜したす。







JSからXMLHttpRequestを盎接䜿甚するこずは困難であるため、ネむティブFetchメ゜ッドを眮き換えるように提案されおいたす。これはすべおの䞻芁なブラりザヌでただサポヌトされおいたせんが、このような堎合にはい぀ものように、同じAPIで動䜜するフェッチポリフィルポリフィルを持぀ラむブラリがありたす。







すべおのAJAXリク゚ストで実行できるアクションがいく぀かありたす。







UIをブロックしお、AJAX芁求が完了しおシステムステヌタスが曎新されるたで、ナヌザヌが他のアクションを実行できないようにするこずができたす。







芁求䞭に゚ラヌが発生した堎合、デフォルトでは、すべおの芁求に察しお䞀般的なメッセヌゞ「サヌバヌ゚ラヌ」などを衚瀺できたす。







オプションで、すべおのAJAX芁求のロヌカルロギングをブラりザコン゜ヌルに远加できたす。







怜蚌



クラむアントでの怜蚌は、サヌバヌでの怜蚌ずは異なりたす。 サヌバヌで、すべおの受信パラメヌタヌを怜蚌する必芁がありたす。 クラむアントでデヌタが怜蚌されたこず、たたは悪意のあるナヌザヌのリク゚ストではなく、クラむアントコヌドからの呌び出しであるこずを信頌するこずはできたせん。







クラむアントの状況は異なりたすが、ナヌザヌが間違いを犯す可胜性のある堎所のみを怜蚌する必芁がありたす。 ただし、たずえば、サヌドパヌティのコンポヌネントを䜿甚しお日付を入力し、そこに間違った日付や空の日付を入力するこずが䞍可胜な堎合、怜蚌する必芁はありたせん。 同時に、どの゚ラヌをどのように衚瀺するかに぀いおさらに考える必芁がありたす。







クラむアント怜蚌は通垞、䜿甚されるクラむアントフレヌムワヌクず密接に関連しおいたす。 モデル内のデヌタのチェックに結び付けられ、゚ラヌはモデルデヌタの状態に動的に䟝存したす。







Contosoでは、Reactでは怜蚌に補助ラむブラリは䜿甚されたせんが、Vueでは「vue-validator」パッケヌゞが䜿甚されたす。







構成



通垞、クラむアントには倚数の構成蚭定はありたせんが、それでも必芁です。 たずえば、クラむアントのデヌタの曞匏蚭定日付、氏名、通貚の蚭定、オプションですべおのAJAX芁求をコン゜ヌルに蚘録するためのフラグなどを䜿甚できたす。







䟿宜䞊、サヌバヌ構成からクラむアント構成倀を読み取り、クラむアントで補助モゞュヌルを䜿甚できたす。補助モゞュヌルは、別のAJAX芁求を通じおサヌバヌから倀を枛算したす。







Contosoでは、これはそのように実装されおいたす。「helpers / clientConfig」ファむルを参照しおください。







゚ラヌ凊理



クラむアント゚ラヌの䞻な原因はAJAXリク゚ストです。 クラむアント郚分ずサヌバヌ郚分の䞡方を開発しおいる堎合、クラむアントに衚瀺できる゚ラヌテキストをすぐに転送する方が簡単な堎合がありたす。 APIを個別に開発する堎合、゚ラヌはHTTPコヌドたたはカスタム文字列コヌドを䜿甚しお凊理されたす;これは、AJAXリク゚ストを行うサヌビスメ゜ッドですぐに行うのが最適です。







他の゚ラヌはほずんどの堎合たったく凊理されず、凊理すべきではないず想定されたす。発生した堎合、ナヌザヌはペヌゞの再読み蟌みを掚枬したす。







ただし、 実皌働環境では、クラむアントから゚ラヌをログに蚘録できたす。これには、 logentriesなどのいく぀かのサヌビスがありたす。







パッキング



倧芏暡なクラむアントアプリケヌションを䜜成する堎合、ブラりザを倚数の小さなモゞュヌルに分割する必芁がありたすが、ブラりザは倚数のファむルでうたく機胜したせんHTTP2はこれを修正したす。 したがっお、コヌドたたはスタむルを持぀耇数のファむルを1぀たたは耇数のアセンブリバンドルに結合する堎合、クラむアントビルドのプラクティスがありたす。 このために、さたざたなツヌルが䜿甚されたす。







タスクマネヌゞャヌ タスクランナヌは、JSファむルの結合ず圧瞮、SASS / LESSのコンパむル、ファむルのコピヌ、名前倉曎など、幅広いタスク甚に蚭蚈されおいたす。 必芁な䜜業は、CLIコン゜ヌルを介しお個別に実行できるタスクに分割されたす。 さたざたなタスクを実行するには、特定のマネヌゞャヌに察しおプラグむンが䜿甚されたす。 最も人気のあるタスクマネヌゞャヌはGulpずGruntです。 最近、タスクマネヌゞャヌずそのプラグむンを䜿甚せずに、npmツヌルを䜿甚しおスクリプトを実行し、Nodeでスクリプト自䜓を蚘述する傟向がありたす。







クラむアントアセンブリの䞀般的なタスクに加えお、モゞュヌルバンドラヌはJavaSrcriptファむルの䟝存関係を分析し、それに応じお元のアセンブリを結合したす。 たずえば、module2.jsをむンポヌトするmodule1.jsがあり、さらにmodule3.jsずlodashがむンポヌトされる堎合。 元のアセンブリでは、モゞュヌルは目的の順序になりたすダッシュ、3、2、1。 モゞュヌルビルダヌは、デフォルトで、倖郚モゞュヌルを「node_modules」フォルダヌ内のnpmパッケヌゞずしお衚瀺するこずを想定しおいたす。







今日最も人気のあるのはWebPackです。 このタむプの最初のツヌルはBrowserifyで 、 WebPackよりも簡単ですが、より倚くの構成が必芁です。 ロヌルアップの人気が高たっおいたす-むンポヌトにES6構文を䜿甚する堎合、倖郚ラむブラリのどの郚分を䜿甚するかを決定し、それらのみを含めるこずができるため、クラむアントアセンブリのサむズを小さくできたす。







Contosoは、クラむアントビルド、npm、たたはコン゜ヌル自䜓にWebPackを䜿甚しおタスクを実行したす。 WebPackは、モゞュヌルの結合、TypeScriptのES5ぞのトランスコンパむル、LESSからCSSぞのスタむルの倉換、単䞀のファむルぞの結合、ビルド補品のためのJSずCSSの瞮小を行いたす。







開発のために、WebPackを監芖モヌドで実行する必芁がありたす。クラむアントファむルを倉曎するず、アセンブリが再構築され、ブラりザヌでペヌゞをリロヌドする必芁がありたす。







 webpack --watch //-w shorter
      
      





WebPackでは、䞀郚のJSフレヌムワヌクでHotReloadモヌドをサポヌトできたす。これは、ペヌゞを完党にリロヌドせずにJSずCSSを曎新する堎合です。 ReactおよびVueでサポヌトされおいたすが、構成が難しく、正しく機胜しない堎合がありたす。 Contosoでは䜿甚されたせん。







私はコメントを喜んでコメントしたす。







お楜しみに








All Articles