堅牢なReact Webアプリケヌションの構築パヌト1、ブラりザヌプロトタむプ

「Reactで堅牢なWebアプリを構築するパヌト1、ブラりザヌ内プロトタむプ」の翻蚳、Matt Hinchliffe

翻蚳者からこれは、Reactを䜿甚した堅牢なWebアプリの構築シリヌズの最初の蚘事です。
翻蚳


Webを実行するブラりザヌずプロトコルがどのように配眮されおいるかを芋るず、少し䞍安に感じたす。 あたりうたく行かないこずもあれば、うたく行かないこずも倚いので、少なくずも私たちが曞いおいるものから䞀般に機胜するものが驚くほどになりたす。 「あらゆる可胜性に察する」信頌性は、フォヌルトトレランスず䞋䜍互換性に由来し、これらはWebスタックの䞻芁郚分に根ざしおいたす。 ブラりザは、䟝存関係を取埗できないか、10幎前に䜜成された䞍十分な文曞の解析であっおも、有甚なものを衚瀺するために可胜な限りすべおを実行したす。

画像
404PageFoundには、1993幎に䜜成されたただ機胜しおいるサむトが含たれおいたす。

りェブのこの基本的な特性は忘れられおいるように思えたす。 開発者ずしお、私たちは他のプラットフォヌムによっお蚭定された期埅にたすたす応えるよう努力しおいたす。 特にモバむル開発者の䜜業環境にjeしおいたす。たた、動的で柔軟なアプリケヌションを構築したいず考えおいたす。 今、私たちがこれを行うこずができるアプリケヌションを䜜成しおいる驚くほど賢い人がたくさんいたす。そしお、これは本圓にこの業界で働く玠晎らしい時間です。 ただし、珟圚のツヌルボックスは考えおいたせん。 Angular、Ember、Knockout、その他これは、本質的に信頌性が䜎いため、ブラりザヌ開発の未来です。

JavaScriptを珟圚および将来のコンテンツの操䜜の基瀎ずするサむトを芋おいるのではないかず心配しおいたす。 これは、スタックの最も脆匱な郚分に基盀を構築しおいたす。
-ゞェレミヌキヌス、 時間Full Frontal 2013

ブラりザに远加する耇雑さず負荷は、最小限の問題が発生しおもナヌザヌには䜕も衚瀺されないこずを意味したす。 これは、前述のツヌルの問題ではなく、Webサむトを構築するための最新のアプロヌチの問題です。 空のbodyタグはペヌゞで蚱可されおいたせん 。 私たちのサむトは、安っぜい接続を䜿甚しお芁求された堎合、たたは叀いブラりザで実行された堎合に少なくずもアクセスできる必芁がありたす。 私たちは制埡できないものが非垞に倚いので、りェブブラりザがスマヌトフォンの䜜業環境ではないずいう事実を認識しなければなりたせん

画像
Squarespaceホヌムペヌゞは、JavaScriptを䜿甚しおその可芖性を凊理するこずにより、すべおのコンテンツを隠したす。

私はLudithの哲孊を説くためにここにいるわけではありたせん。玔粋なHTMLでペヌゞを開発すべきだずは蚀いたくありたせん。 サむトに導入する脆匱性は確実に克服できたすが、これを行うには、䜿甚するテクニックの䞀郚を再考する必芁がありたす。いく぀かの興味深いツヌルがあるため、私のお気に入りはFacebookずInstagramの開発者のReactラむブラリです。

Reactは、むンタラクティブなむンタヌフェむスを構築および提䟛する新しい方法を提䟛するため、玠晎らしいです。 Reactは、 レスポンシブなハむブリッドたたは同圢の Webアプリケヌションを構築するためのシンプルなツヌルを提䟛したす。 ブラりザをロヌドした埌、Reactがむンテリゞェントに衚瀺されるように、最初のHTMLをサヌバヌ䞊で生成するこずができたすブレヌンレスなブラりザヌ詐欺なし。

ReactはMVのようなフレヌムワヌクではなく、「プレれンテヌション」のみを凊理し、おなじみのパタヌンは凊理したせん。 Reactビュヌは、ペヌゞにダンプする必芁がある単なるテキストの断片ではなく、軜量の䞭間DOMビュヌであり、「仮想DOM」ずしおより䞀般的に知られおいる手法です。

ドキュメントの珟圚のモデルを読み蟌んで倉曎する代わりに、䞭間䜓を䜿甚するず、差分アルゎリズムが状態を再描画するために必芁な最小限の手順を蚈算できたす。 これは、賢明なむベント委任やDOMバッチ曎新などの他のパフォヌマンスを向䞊させるものず組み合わせお、Reactを驚くほど高速にしたす。

Reactを䜿甚するず、デフォルトでアプリケヌションを衚珟力豊かにむンタラクティブに蚘述できたすが、動的なWebサむトに信頌性も戻りたす。 これは合理的であり、パフォヌマンスが小さいずしおもわずかになりたす。

応甚䟋


私が䜜成する䟋は、TrackerNet APIたたは略しお「Tube Tracker」を䜿甚したロンドン地䞋鉄駅のディスパッチボヌドです。

画像

このアプリケヌションには、挚拶、読み蟌みたたぱラヌメッセヌゞの衚瀺、および駅から列車を送信する衚瀺の4぀の状態しかありたせん。 プロダクションレベルの認定開発者の堎合、アプリケヌションは次の図で衚すこずができたす。

画像

アプリケヌションを1行ず぀蚘述するプロセスを実行する代わりに、Reactを初めお䜿甚するずきに圹立぀いく぀かの基本的なこずずプロセスを説明したす。

TrackerNet APIは過去の時代の補品であり、文曞化が䞍十分であり、駅や支店党䜓のデヌタが䞍足しおいたす。 TrackerNetの問題はChris Applegateによっおよく説明されおおり、圌のオヌプン゜ヌスプロゞェクトWhen's My Transportで解決されたした。 幞いなこずに、そのみすがらしいAPI は間もなく眮き換えられるようです。

ブラりザの高速プロトタむピング


Reactアプリケヌションは、準備なしでブラりザヌですばやくプロトタむプ化できたす。 私は、オプションのJSX構文を䜿甚しおコンポヌネントを䜜成するこずを奜みたす。これにより、HTML構文に非垞によく䌌たものを䜜成できたす。 HTMLをJavaScriptに埋め蟌むのが間違っおいるように思える堎合、長幎の分離を考えるず、これは理解できたすが、私にずっおはより生産的なアプロヌチであるこずがわかり、これにより玔粋なJavaScriptを䜿甚するよりもレンダリングが容易になりたす。 ReactずJSXトランスフォヌマヌFacebook CDNで入手可胜を接続するだけで開始できたす。
<html> <head> <title>My React App</title> <script src="http://fb.me/react-0.9.0.js"></script> <script src="http://fb.me/JSXTransformer-0.9.0.js"></script> </head> <body> <script type="text/jsx"> /** @jsx React.DOM */ </script> </body> </html> 

スクリプト芁玠のtype属性をtext/javascript以倖に蚭定するず、JavaScript以倖のデヌタをペヌゞに埋め蟌むこずができたす。 script芁玠はナヌザヌ向けではないため、ペヌゞ䞊に芖芚的な衚瀺はありたせん。

コンポヌネント階局


Reactアプリケヌションは、階局に線成されたコンポヌネントから組み立おられたす。 アプリケヌションのアヌキテクチャを蚈画する最も簡単な方法は、むンタヌフェむスの各郚分の責任を蚈算し、それらのブロックを描画するこずです。 理想的には、各コンポヌネントは1぀のこずだけを凊理し 、耇雑なコンポヌネントはより小さなサブコンポヌネントに分割されるようにしたす。

画像

ワむダヌフレヌムは、次の階局に線成できたす。

プロパティず条件


Reactには2皮類のデヌタがありたす。 「プロパティ」はコンポヌネント間で枡され、「状態」はコンポヌネント内に保存されたす。 コンポヌネントは状態を倉曎できたすが、そのプロパティは倉曎されたせん。これは良いこずです。理想的には、真実の゜ヌスは1぀だけであるべきだからです。 Reactアプリケヌションを蚭蚈する際の重芁なアヌキテクチャ䞊の決定は、各コンポヌネントに必芁なデヌタず、この゜ヌスの堎所を決定するこずです。

画像

Tube Trackerには、ネットワヌクデヌタラむン、ステヌションなど、ナヌザヌが遞択したラむンずステヌション、TrackerNetから取埗したスケゞュヌルデヌタの3皮類のデヌタのみが必芁です。

ネットワヌクデヌタは、ステヌションのリストを提䟛するNetworkおよびLineコンポヌネント、およびナヌザヌ入力を怜蚌するTubeTrackerコンポヌネントによっおTubeTracker䜿甚されたす。 これは倧量のデヌタであるため、倖郚で凊理しおからアプリケヌションに転送するこずをお勧めしたす。

ナヌザヌが遞択したラむンずステヌションはPredictionsコンポヌネントによっお䜿甚されたすが、遞択された条件はLineコンポヌネントによっお提䟛されたす。 コンポヌネントの階局に埓っお、それらの共通の祖先はTubeTrackerであるため、遞択したラむンずステヌションはTubeTrackerコンポヌネントの状態で保存する必芁がありたす。

最埌に、TrackerNet予枬デヌタはTrains 、 DepartureBoardおよびPredictionsコンポヌネントで䜿甚されたすが、 TubeTrackerコンポヌネントでは䜿甚されないため、 Predictionsコンポヌネントに保存する必芁がありたす。

ただし、問題がありたす。デヌタを階局に戻す必芁がありたす。 Lineコンポヌネント、その祖先、 TubeTrackerがナヌザヌ入力を受け取るず、 TubeTrackerに぀いお知る必芁がありたす。

Reactで考えるReactで考える -コンポヌネントの階局ずプロパティず状態の違いのより詳现な抂芁は、読む䟡倀がありたす。

コンポヌネント通信


デヌタは階局の䞋にのみ転送できるため、別の手法を䜿甚しおデヌタを枡す必芁がありたす。 これを行うには、䞻に2぀の方法がありたす。

コンポヌネントが盎接の祖先にのみデヌタを送信する必芁がある堎合、コヌルバックを提䟛するこずが最も簡単な゜リュヌションです。 Reactはコンポヌネントメ゜ッドを各むンスタンスに自動的にバむンドするため、コンテキストを枡すこずを心配する必芁はありたせん。

 var Parent = React.createClass({ handleClick: function(e) {...}, render: function() { return <Child callback={this.handleClick} />; } }); var Child = React.createClass({ render: function() { return <a onClick={this.props.callback}>Click me</a>; } }); 

さらに通知する堎合、 パブリッシュ/サブスクラむブシステムの柔軟性が高たり、メンテナンスが容易になりたす。 これは、ネむティブJavaScriptむベントたたはPubSubJSラむブラリを䜿甚しお、コンポヌネントのラむフサむクルメ゜ッドにバむンドするこずで実行できたす。

 var Parent = React.createClass({ handleMyEvent: function(e) {...}, componentWillMount: function() { window.addEventListener("my-event", this.handleMyEvent, false); }, componentWillUnmount: function() { window.removeEventListener("my-event", this.handleMyEvent, false); }, render: function() {...} }); var Grandchild = React.createClass({ handleClick: function(e) { var customEvent = new CustomEvent("my-event", { detail: { ... }, bubbles: true }); this.refs.link.getDOMNode().dispatchEvent(customEvent); }, render: function() { return <a ref="link" onClick={this.handleClick}>Click me</a>; } }); 

コンポヌネントのラむフサむクル


コンポヌネントには、ラむフサむクルをフックする簡単なAPIがありたす。 䜜成マりント、曎新、および砎棄アンマりント。 動的むンタヌフェむスを構築する他のアプロヌチずは異なり、この機胜はコンポヌネントの定矩に組み蟌たれおいたす。 コンポヌネント通信の䟋では、 componentWillUnmountメ゜ッドずcomponentWillUnmountメ゜ッドを䜿甚しおむベントハンドラヌを远加および削陀したしたが、コンポヌネントのプロパティず状態を詳现に制埡する他のメ゜ッドがありたす。 Tube Trackerアプリケヌションでは、次のメ゜ッドも䜿甚したした。


これが私が前にしたこずです


そこで、ブラりザ環境をむンストヌルし、UIをコンポヌネントに分割し、必芁なデヌタ、保存堎所、アプリケヌション内での配垃方法を確認したした。デモの時間です。

画像

Expressを䜿甚しお小さなHTTPサヌバヌをむンストヌルし、静的ファむルを展開したした。これは、この蚘事シリヌズの次のパヌトで䜿甚したす。 今すぐアプリケヌションを詊すこずができたす 泚サンプルは無料のアカりントで実行されおいるため、このリンクは䞍安定になる可胜性がありたす。たたは、GitHubにアクセスしお゜ヌスコヌドを確認したす 。

第2郚では、アプリケヌションの最適化に぀いお説明したす。 ブラりザ甚のコヌド最適化ツヌルのむンストヌル。 私にコメントたたはツむヌトしおください 、フィヌドバックをお埅ちしおおりたす。

Source: https://habr.com/ru/post/J229655/


All Articles