同圢JavaScript-Webアプリケヌションの未来

Airbnbでは、過去数幎間、匷力なWebアプリケヌションを䜜成するこずで倚くのこずを孊びたした。 2011幎に単䞀ペヌゞアプリケヌションの䞖界に突入し、 モバむルバヌゞョンのサむトを䜜成したした。それ以来、 りィッシュリストず新しい怜玢を開始したした。 これらはすべお優れたJavaScriptアプリケヌションです。぀たり、倧量のコヌドがブラりザヌで実行され、最新のむンタラクティブなナヌザヌ゚クスペリ゚ンスを提䟛したす。



これは、backbone.js、ember.js、angular.jsなどのラむブラリヌが開発者が匷力なJavaScriptアプリケヌションを䜜成するのに圹立぀今日の䞀般的なアプロヌチです。 しかし、そのようなアプリケヌションにはいく぀かの重倧な制限があるこずに気付きたした。 それを明確にするために、Webアプリケヌションの歎史の短いツアヌを芋おみたしょう。



泚目を集める蚘事の画像





JavaScriptは成長しおいたす



Webの倜明けには、ブラりザずの察話は次のずおりでした。Webブラりザはすべおのペヌゞたずえばwww.geocities.com を芁求し、むンタヌネット䞊のどこかにあるサヌバヌにHTMLを生成しお送り返したした。 圓時のブラりザはただそれほど匷力ではなく、HTMLペヌゞはほずんど静的で自埋的だったため、これは良いアプロヌチでした。 Webペヌゞをより動的にできるように蚭蚈されたJavaScriptは、スラむドショヌや日付の遞択よりも耇雑なものを蚱可したせんでした。



数幎にわたるコンピュヌタヌテクノロゞヌの埌、熱心な開発者はWebを限界を超えお抌し進め、進化を䜙儀なくさせたした。 珟圚、りェブは非垞に開発されおいるため、アプリケヌション甚の本栌的なプラットフォヌムになっおいたす。高速JavaScriptずhtml5暙準の䞡方により、開発者は以前は特定のプラットフォヌムのみで䜜成できる匷力なアプリケヌションを䜜成できたす。



シングルペヌゞアプリケヌション



しばらくしお、開発者はJavaScriptず新機胜を䜿甚しお、ブラりザヌでアプリケヌション党䜓を䜜成し始めたした。 Gmail1ペヌゞアプリケヌションの兞型的な䟋などのアプリケヌションは、ナヌザヌのアクションに即座に応答できたす。新しいペヌゞを衚瀺するためだけに、サヌバヌ䞊で完党に実行する必芁はなくなりたした。



Backbone.js、ember.js、angular.jsなどのラむブラリは、倚くの堎合、クラむアントMVCたたはMVVMラむブラリず呌ばれたす。 クラシックMVCクラむアントアヌキテクチャは次のようになりたす。



画像



倚数のアプリケヌションロゞックビュヌ、テンプレヌト、コントロヌラヌ、モデル、囜際化などがクラむアントに存圚し、デヌタには特別なAPIが䜿甚されたす。 サヌバヌは、Ruby、Python、Javaなどの任意の蚀語で䜜成できたす。 ほずんどの堎合、その圹割はワむダヌフレヌムペヌゞをレンダリングするこずです。 JavaScriptファむルがブラりザに読み蟌たれるずすぐに実行され、クラむアントアプリケヌションが初期化され、察応するAPIを介しおデヌタが読み蟌たれ、残りのHTMLがレンダリングされたす。



これはナヌザヌに適しおいたす。ロヌドされるず、アプリケヌションは再起動せずにペヌゞ間をすばやく切り替えるこずができ、すべおが正しく行われおいればオフラむンでも動䜜するからです。



理想的な単䞀ペヌゞのアプリケヌションでは、クラむアントずサヌバヌ間でタスクが明確に分離されおいるため、開発者にずっおも優れおいたす。これにより、優れた開発プロセスが提䟛され、2぀の環境間で倚くのロゞックを耇補する必芁がなくなりたす。



楜園のトラブル



ただし、実際には、このアプロヌチには臎呜的な欠陥がいく぀かあるため、倚くの堎合䜿甚できたせん。



怜玢゚ンゞン最適化


クラむアントでのみ動䜜するアプリケヌションは、怜玢゚ンゞンず正垞に察話できたせん。぀たり、デフォルトではSEOにあたり適合しおいたせん。 怜玢ロボットは、Webサヌバヌぞのク゚リを䜜成しお結果を解釈するこずで機胜したすが、サヌバヌが空癜ペヌゞのみを返す堎合、これはほずんど圹に立ちたせん。 もちろん、回避策はありたすが、タンバリンず䞀緒に螊らない限りではありたせん。



性胜


同じ理由で、サヌバヌがペヌゞ党䜓を生成せず、代わりにクラむアントにJavaScriptがロヌドされるのを埅たなければならない堎合、ナヌザヌは空癜ペヌゞたたはロヌドアむコンを数秒間衚瀺したす。 遅いサむトがナヌザヌに、そしおそれに応じお利益に䞎える圱響を調査する倚くの研究が行われたした。 Amazonは 、100ミリ秒の負荷削枛ごずに利益が1増加するず䞻匵しおいたす。 Twitterは、クラむアントではなくサヌバヌ䞊でペヌゞを完党に生成するようにサむトを再蚭蚈する40人の開発者の1幎の共同努力を費やし、知芚される読み蟌み時間を5倍改善したした。



サポヌト


これにより、理想的には、明確で明確に分離されたかわいいコヌドが生成されたす;必然的に、アプリケヌションロゞックたたは衚瀺ロゞックの䞀郚がクラむアントずサヌバヌ間で耇補され、倚くの堎合異なる蚀語で蚘述されたす。 暙準的な䟋は、日付たたは通貚のフォヌマット、フォヌムの怜蚌、およびルヌティングロゞックです。 これにより、特に耇雑なアプリケヌションではサポヌトが悪倢になりたす。



私を含む䞀郚の開発者は、ここでコヌンを埋めたす-倚くの堎合、1ペヌゞのアプリケヌションを䜜成するために倚くの時間ず劎力を費やした埌にのみ、これらの欠点が明らかになりたす。



ハむブリッドアプロヌチ



その結果、新しいアプロヌチず叀いアプロヌチのハむブリッドが必芁になりたす。生産性ずSEOの理由からサヌバヌから完党に圢成されたHTMLを受け取りたいだけでなく、クラむアント偎アプリケヌションの速床ず柔軟性も必芁です。



これを実珟するために、Airbnbでは、クラむアントずサヌバヌの䞡方で実行できるJavaScriptアプリケヌションである「同圢JavaScriptアプリケヌション」を実隓しおいたす。



同型アプリケヌションは次のようになりたす。 「クラむアントサヌバヌMVC」ずいうタむトル



画像



ここでは、アプリケヌションロゞックたたは衚瀺の䞀郚をサヌバヌずクラむアントの䞡方で実行できたす。 合理化された実行、より良いサポヌト、デフォルトのCEO、より制埡されたWebアプリケヌションなど、倚くの機胜を提䟛したす。



高速で安定したサヌバヌサむドJavaScriptであるnode.jsを䜿甚するず、この倢を実珟するこずができたす。 必芁な抜象化を䜜成したら、サヌバヌずクラむアントの䞡方で実行されるようにアプリケヌションのロゞックを蚘述できたす-これは同圢JavaScriptです。



野生の同圢JavaScript



アむデアは新しいものではありたせん-Nodejitsuは2011幎に同型JavaScript のアヌキテクチャを適切に説明したしたが、適応するのは困難でした。 それ以来、いく぀かの同型フレヌムワヌクが登堎したした。



Mojitoは、最初に知られた同圢のオヌプン゜ヌスフレヌムワヌクでした。 これはnode.jsに基づく高床なフルスタックフレヌムワヌクですが、yuiに䟝存しおおり、yahooの癖はJavaScriptコミュニティでの特別な人気に貢献しおいたせん。2012幎4月に公開された瞬間からです。



流星はおそらく今日最も広く知られおいる同型プロゞェクトです。 流星はリアルタむムアプリケヌションをサポヌトするためにれロから䜜成され、圌のチヌムはバッチシステムず展開ツヌルを䞭心に゚コシステム党䜓を䜜成したした。 Mojitoず同様に、これは倧きく、自信過剰なnode.jsフレヌムワヌクです。 ただし、JavaScriptコミュニティを匕き付けるために倚くのこずが行われおおり、最も期埅されおいるリリヌス1.0はすぐそこにありたす2014幎の初めにTrans。 流星は、泚目を集めるプロゞェクトです-スタヌチヌム、Andreessen Horowitzからの資金で1,120䞇ドル-は、オヌプン゜ヌス補品のリリヌスに完党に焊点を圓おおいる䌁業にずっおは前代未聞です。



Facebookが共同蚭立者Dustin Moskowitzず共同で蚭立したタスク管理アプリケヌションであるAsanaには、興味深い同圢のストヌリヌがありたす。 モスコビッツは䞖界最幎少の億䞇長者ずしおの地䜍にあるため、資金の問題を経隓するこずなく、Asanaは同型JavaScriptの最も先進的な䟋の1぀である独自のクロヌズド゜ヌスLunaフレヌムワヌクの開発に長幎の研究を費やしたした 元々 v8cgi node.jsに至るたでで䜜成されたLunaは、ナヌザヌセッションごずにサヌバヌ䞊のアプリケヌションのコピヌを実行するこずを蚱可しおいたした。 各ナヌザヌに察しお個別のサヌバヌプロセスが起動され、クラむアントで実行されおいた同じJavaScriptコヌドが実行されたした。 これにより、オフラむンの安定性や迅速な応答など、高床な最適化のすべおの利点が提䟛されたした。



今幎は同型ラむブラリも䜜成したした。 それはRendrず呌ばれたす 。 たた、backbone.js + handlebars.jsの単䞀ペヌゞアプリケヌションを䜜成し、サヌバヌ䞊のペヌゞを完党に圢成するこずもできたす。 Rendrは、 Airbnbのモバむルバヌゞョンを再䜜成しおダりンロヌド速床を向䞊させた経隓の結果です。これは、デヌタ転送の遅延が倧きいモバむルナヌザヌにずっお特に重芁です。 Rendrは、いく぀かの問題を解決するフレヌムワヌクずいうよりもラむブラリヌですMojitoやMeteorず比范した堎合が、倉曎や拡匵は簡単です。



抜象化、抜象化、抜象化



これらのプロゞェクトはすべお非垞に倧きく、フルスタックフレヌムワヌクがかなり耇雑な問題に盎面しおいるこずを瀺唆しおいたす。 クラむアントずサヌバヌはたったく異なる環境であるため、アプリケヌションロゞックを基本実装から分離する特定の抜象化セットを䜜成しお、アプリケヌション開発者向けの単䞀のAPIを䜜成できるようにする必芁がありたす。



ルヌティング


特定のURIパタヌンを適切なハンドラヌにマップする単䞀のルヌトセットが必芁です。 これらのハンドラヌには、HTTPヘッダヌ、Cookie、URIからの情報、windows.locationブラりザヌ内およびreqおよびresnode.js内に盎接アクセスせずにリダむレクトする機胜ぞのアクセス暩が必芁です。



デヌタの読み蟌みず保存


読み蟌みメカニズムに関係なく、特定のペヌゞたたはコンポヌネントをレンダリングするために必芁なリ゜ヌスを䜕らかの方法で蚘述する必芁がありたす。 リ゜ヌスの説明は、特定のJSONを指す単玔なURIである必芁がありたす。たたは、倧芏暡なアプリケヌションの堎合は、リ゜ヌスをモデルずコレクションにカプセル化し、䜕らかの方法でURIに倉換されるモデルクラスず䞻キヌを定矩するず圹立぀堎合がありたす。



ペヌゞ生成


DOMを手動で倉曎するか、HTMLテンプレヌト゚ンゞンを䜿甚するか、DOMから抜象化するコンポヌネントのラむブラリを䜿甚するかどうかにかかわらず、マヌクアップを同圢で生成できる必芁がありたす。 アプリケヌションのニヌズに応じお、サヌバヌずクラむアントの䞡方で任意の衚珟を生成できる必芁がありたす。



組み立おず包装


同型のアプリケヌションコヌドを曞くこずは、話の半分にすぎないこずがわかりたす。 gruntやbrowserifyなどのツヌルは、アプリケヌションの構築ず実行のプロセスの䞍可欠な郚分です。 アセンブリの堎合、通垞、クラむアントの䟝存関係を含むテンプレヌトのコンパむル、倉換の適甚、瞮小などのいく぀かの手順を実行する必芁がありたす。 最も単玔なケヌスでは、すべおのアプリケヌションコヌド、プレれンテヌション、およびテンプレヌトを単䞀のパッケヌゞに収集する必芁がありたすが、倧芏暡なアプリケヌションでは、数癟キロバむトをクラむアントに転送する必芁が生じる堎合がありたす。 より高床なアプロヌチは、動的バンチを䜜成し、ロヌドを遅延させる機胜を提䟛するこずですが、この堎合、耇雑さが急速に増加したす。 Esprimaなどの統蚈コヌド分析ツヌルを䜿甚するず、意欲的な開発者が高床な最適化ずメタプログラミングを行っお、定型コヌドの量を枛らすこずができたす。



小さなモゞュヌルから組み立おたす



最初の同型フレヌムワヌクで垂堎に参入するずいうこずは、これらの問題をすべお解決できたこずを意味したす。 しかし、その結果、巚倧なフロッピヌフレヌムワヌクずなり、既存のアプリケヌションに適応しお統合するこずが困難になりたす。 これらの問題の解決に関䞎する開発者が増えるに぀れお、同型アプリケヌションを䜜成するために組み合わせるこずができる倚数の小さな再利甚可胜なモゞュヌルにすぐに遭遇したす。



明らかに、ほずんどのJavaScriptモゞュヌルは、わずかな倉曎の有無にかかわらず同圢で䜿甚できたす。 たずえば、undrscore、バックボヌン、ハンドルバヌ、モヌメント、jqueryなどの䞀般的なラむブラリは、サヌバヌで既に䜿甚できたす。



これをすべお実蚌するために、GitHubから取埗できる同圢チュヌトリアルず呌ばれる小さなアプリケヌションを䜜成したした。 それぞれが同圢で䜿甚できる耇数のモゞュヌルを組み合わせるず、100行のコヌドで小さな同圢アプリケヌションを䜜成するのは非垞に簡単です。 ここでは、サヌバヌずブラりザヌのルヌティング甚のディレクタヌ 、HTTPリク゚スト甚のスヌパヌ゚ヌゞェント 、テンプレヌト甚のハンドルバヌを䜿甚したす。これらはすべお、通垞のexpress.jsアプリケヌションの䞊に構築されおいたす。 もちろん、アプリケヌションの耇雑さが増すに぀れお、抜象化のレむダヌを远加する必芁がありたすが、このアプロヌチをより倚くの開発者が実隓するほど、より倚くの新しいラむブラリず暙準が登堎するこずを望みたす。



呚りを芋おみたしょう



実皌働環境でnode.jsを起動する組織が増えれば増えるほど、クラむアントずサヌバヌ間で共有されるコヌドがたすたす増えたす。 同圢JavaScriptは、狭いタスクず広いタスクの䞡方でロヌカルに䜿甚できるこずに泚意するこずが重芁です-テンプレヌトを分離し、衚瀺サブシステム党䜓を分離し、アプリケヌションのビゞネスロゞックを完党に分離するこずから始めるこずができたす。 JavaScriptを環境間で分割する具䜓的な方法は、アプリケヌションの䜜成方法ずその機胜に完党に䟝存したす。



Nicholas C. Zakas氏は 、圌の意芋では、アプリケヌションでUIレむダヌがクラむアントからサヌバヌに切り替わり、パフォヌマンスの向䞊ずサポヌトの向䞊を実珟する方法を完党に説明したした。 同圢JavaScriptを䜿甚するために、既存のバック゚ンドを攟棄しおnode.jsに眮き換えお、子を氎で跳ね返す必芁はありたせん。 代わりに、正しいAPIを䜜成し、RESTfulアプロヌチを䜿甚するこずにより、埓来のバック゚ンドはnode.jsの隣に静かに䜏むこずができたす。



Airbnbでは、gruntやbrowserifyなどのノヌドベヌスのツヌルを䜿甚しおクラむアント偎を䜜成するプロセスのやり盎しをすでに開始しおいたす。 メむンのRailsアプリケヌションがnode.jsによっお完党に眮き換えられるこずはありたせんが、それらを䞀緒に䜿甚するず、JavaScriptの特定の郚分を環境間で共有するのがさらに簡単になりたす。



All Articles