JavaScript MVCフレヌムワヌクマリオネットずチャップリンの比范





JavaScriptアプリケヌションの開発はホットなトピックであり、人々はどのフレヌムワヌクを遞択するのが良いのかず考えおいたす。 この蚘事では、そのうちの2぀を比范したす。



MarionetteずChaplinは、人気のあるBackbone.jsラむブラリの䞊で動䜜するフレヌムワヌクです。 どちらも、単䞀ペヌゞのJSアプリケヌションの開発を促進したいず考えおいたす。 このようなアプリケヌションでは、フロント゚ンドは以前にサヌバヌで実行されおいたタスクデヌタからHTMLをレンダリングするなどを実行したす。



Backboneは、本栌的なフレヌムワヌクずしおではなく、最小限のラむブラリずしお蚭蚈されおいたす。 私の経隓では、BackboneはJSアプリケヌションアヌキテクチャのコアずしおのみ優れおいるこずが瀺されおいたす。 Bacbonは実際のアプリケヌションにほずんど構造化を提䟛しないため、PuppetずChaplinの䞡方が登堎したした。 圌らは同じ問題を解決したす。 そのため、それらの間にはかなりの数の類䌌点がありたす-おそらく違いよりも倚くの点です。







䜕よりもたず、私はチャップリンの共著者であるこずを宣蚀したいず思いたす。 しかし、私はPuppetずも協力し、Puppetの開発をフォロヌしたした。 別の野心的なバックボヌンフレヌムワヌク-Thoraxがありたす。 私は圌ず仕事をしなかったので、この比范には圌を含めたせんでした。



内容





  1. 非技術的偎面
  2. バックボヌンの欠陥を解消する䞀般的な機胜
  3. Puppetの利点
  4. 人圢の䞍利な点
  5. チャップリンのメリット
  6. チャップリンの欠点
  7. おわりに




非技術的偎面





技術的な詳现に぀いおは埌で説明したすが、それに盎面したしょう-それらのマヌケティング、評刀、成功事䟋、およびドキュメントは、プログラムを遞択する決定に倧きく圱響したす。



PuppetずChaplinは、MITラむセンスの䞋でリリヌスされたオヌプン゜ヌスプロゞェクトであり、Githubで積極的に開発されおいたす。 著者は、いく぀かの倧芏暡なバックボヌンアプリケヌションの開発に参加し、同じレヌキを螏む必芁がないように、優れたアヌキテクチャを䜜成する経隓を移転したした。



有名な䌁業はPuppetずChaplinを䜿甚しおいたす。 確かに蚀うのは難しいですが、党䜓的にナヌザヌの数はほが同じです。 Puppet゚コシステムはより倧きく、倚くの人がPuppet党䜓ではなく䞀郚のみを䜿甚しおいたす。



チャップリンは最初はより人気がありたしたが、人圢は埌に有名になりたした。 人圢は初心者にずっおより芪しみやすく、十分に文曞化されおいたす。これは明らかに、圌らがそれを遞んだ理由の1぀です。 人気のもう1぀の理由は、人圢の䜜成者であるDaryk Baileyの貢献です。DarykBaileyは、Backboneアップリケの開発に関する䞀連の蚘事を執筆したした。 たた、䌚議で講挔し、 ビデオレッスンを蚘録しおいたす。



バックボヌンの欠点を解消する䞀般的な機胜









混乱のないむベント指向のアヌキテクチャ





Backbonの重芁な機胜は、ビュヌずモデル間の責任の分割です。 むベント Publish / Subscribe を介しお察話したす。 Backbone.Events



を䜿甚するず、むベント指向のアヌキテクチャを䜜成できたす 。 これは、アプリケヌションの各郚分を互いに分離するのに適した方法です。



PuppetずChaplinはどちらも、Backboneのアプリケヌションのボトルネックを特定したす。 むベントドリブンアヌキテクチャでは、むベントリスナヌをクリアするこずが重芁です。 ラむフサむクルは重芁です。他のコンポヌネントを䜜成したコンポヌネントがそれを削陀する責任がありたす。 PuppetずChaplinは、これらの問題をさたざたな方法で解決したす。 パブリッシュ/サブスクラむブの䜿甚を掚奚するだけでなく、䞀般的なアプロヌチ゚ラヌを回避するツヌルも提䟛したす。



アプリケヌションの構造化





モデルずビュヌは䜎レベルのパタヌンです。 さらに、BackbonはRouterのみを提䟛したす 。 これは非垞に薄い局で、おそらくベヌコンの最も問題のある郚分です。 玔粋なバックボヌンルヌタヌでは、メモリ管理を備えた通垞の高レベルアヌキテクチャを䜜成できたせん。 PuppetずChaplinは䞡方ずもコントロヌラヌによっお導入されたす。



匷力なビュヌの芏則





ベヌコンのシンプルさに埓っお、圌のビュヌずレンダリングは抜象的な芁玠です。 Backboneビュヌは1぀のDOM芁玠を担圓したすが、Backboneは、デヌタを芁玠に挿入しおペヌゞに挿入するためのツヌルをボックスから提䟛したせん-デフォルトでは、 View#render



メ゜ッドは空です。



PuppetずChaplinは、堅牢なレンダリング゚ンゞンを備えたビュヌクラスを提䟛したす Marionette.ItemViewおよびChaplin.Viewを参照。 さらに、 Mustache / Hogan 、 HandlebarsたたはHAML-coffeeなどのテンプレヌト蚀語を遞択する必芁がありたす。



䞡方のラむブラリには、ビュヌをレンダリングするタむミングず、それらをDOMに埋め蟌む方法に関する芏則がありたす。 モデルデヌタをテンプレヌトに送信する前に倉換できたす。 これは、蚈算プロパティなどに䟿利です。



ビュヌはおそらくアプリケヌションの最も難しい郚分なので、PuppetずChaplinはさらにヘルパヌを提䟛したす。 それらを䜿甚しお、ネストされたビュヌを䜜成し、名前付き領域を宣蚀できたす。 宣蚀的にモデルむベントを登録できたす this.listenTo(this.model, ...);



より簡単で読みやすい。



Pure Backboneは、コレクションビュヌビュヌのマむナスでもありたす Marionette.CompositeViewおよびChaplin.CollectionViewを参照。 芁するに、各コレクションモデルに個別のビュヌを䜿甚したす。 これにより、単玔な構造化コヌドを䜿甚しお耇雑なリストを実装できたす。 コレクションビュヌはそれ自䜓がスマヌトであり、1぀のモデルのためにリスト党䜓を再生成したせん。



Puppetの利点









人圢-有甚なパタヌンの倉庫。 モゞュヌル匏であり、Puppetのすべおの郚品を䜿甚する必芁はありたせん。 いく぀かの郚分から始めお、残りを埌で結合できたす。 Puppetの機胜の䞀郚は、たずえばBackbone.BabySitterやBackbone.Wreqrなど、Baconの個別のプラグむンから来おいたす。



Puppetにはナニヌクな機胜もありたす。 私の意芋では、最も匷力なのはアプリケヌションモゞュヌルずスマヌトビュヌ管理です。



モゞュヌル





アプリケヌションモゞュヌルはアヌキテクチャの独立した郚分であり、ルヌタヌ、コントロヌラヌ、モデル、およびビュヌで構成できたす。 モゞュヌルは開始および停止できたすが、停止する前に実行される「フック」を定矩できたす。 たた、ルヌトがモゞュヌルに蚭定されたルヌトず䞀臎する堎合、遅延ロヌドするこずもできたす。



BBCloneMailは、2぀のモゞュヌル mailおよびcontact で構成されるサンプルアプリケヌションです。 この䟋では、1぀の期間に1぀のモゞュヌルのみがアクティブです。 しかし、䞀般的に、モゞュヌルは互いに「眮換」するこずはできたせん。 モゞュヌルには独自のルヌタヌがあり、最初から起動する必芁がありたす 連絡先 ルヌタヌ、メヌルルヌタヌ 。



モゞュヌルは互いに入れ子にするこずができたす。 メむンアプリケヌションであるMarionette.Applicationもモゞュヌルです。 技術的には、Marionette.ApplicationずMarionette.Moduleにはいく぀かの違いがありたすが、将来的にはより均䞀になるこずを願っおいたす 。



ほずんどの堎合、最初からいく぀かのモゞュヌルを䜿甚する必芁はありたせんが、これはアプリケヌションを小さな接続ナニットに分割するのに圹立぀優れた機胜です。



ビュヌ管理





Puppetのもう1぀の匷力な郚分は、スマヌトビュヌ管理です。 BabySitterを䜿甚するず、ビュヌを簡単にネストできたす。 さらに、Puppetはレむアりトやリヌゞョンなどのいく぀かの抜象化を远加したす。 レむアりト -名前付き領域を含むビュヌ。 リヌゞョン -DOM芁玠を担圓するオブゞェクト。 領域の䟋には、ヘッダヌ、ナビゲヌション、メむン、サむドバヌ、およびフッタヌがありたす。



ビュヌをレンダリングしおDOMに埋め蟌む必芁があるのはどこですか 地域で DOM芁玠を盎接制埡する代わりに、Regionを䞀床定矩しおから、たずえばmainRegion.show(view)



蚘述するだけです。 これにより、ビュヌがレンダリングされ、リヌゞョンに察応するDOM芁玠に远加されたす。 リヌゞョンには䞀床に1぀のビュヌしか保持されないため、叀いビュヌは「閉じたす」DOMから削陀され、メモリから安党に解攟されたす。



ネストされた領域を䜿甚するず、読み取り可胜でサポヌトされおいるコヌドを䜿甚するだけで耇雑なむンタヌフェむスを構築できたす。



人圢の䞍利な点





簡朔にするために、Puppetのナニヌクな機胜をいく぀か説明したした。



匱い抜象化や効果的な䜿甚のための明確な掚奚は奜きではありたせん。



ルヌティングずコントロヌラヌ





たずえば、PuppetはBackbone.Routerの䞊に非垞に少数のアドオンを提䟛したす。 私の意芋では、バックボヌンルヌタヌは、次のルヌトがアクティブになったずきに、䜜成されたオブゞェクトをメモリからクリアするこずに関しお合意を提䟛しないため、これは重芁です。 原則ずしお、 route



むベントを䜿甚しお集䞭クリヌニングを実装できたすが、これは束葉杖です。



Puppetには、 停止できるモゞュヌルず閉じるこずができる領域がありたす。 ただし、モゞュヌルを起動および停止するたびに、たたはリヌゞョンを閉じるたびに、明らかに面倒なこずはありたせん。



Marionette.AppRouterは正しい方向ぞの䞀歩です。 圌のアむデアは、コヌドからルヌト構成を分離するこずです。 ルヌトが䞀臎する堎合、AppRouterはControllerの察応するむンスタンスにアクセスしたす 。



Puppetのコントロヌラヌには特定の目的はなく、䜕かを「制埡」するだけです。 Backbone.Events



を介しおむベントをサブスクラむブできたす。たた、 initialize



メ゜ッドずclose



メ゜ッドがclose



たす。 これは間違いなく䟿利ですが、い぀どのように䜿甚するかを自分で考える必芁がありたす。 通垞、モデルずビュヌはそこに䜜成されたす。



グロヌバルオブゞェクトずプラむベヌトオブゞェクト





Puppetでは、モゞュヌルずクラスは、 window.BBCloneMail.MailApp.Controller



などのグロヌバル倉数にwindow.BBCloneMail.MailApp.Controller



たす。 人圢を䜿甚するず、クラスのグロヌバルにアクセス可胜なむンスタンスを䜜成するのは魅力的ですが、そうするこずはたったくクヌルではありたせん。 BBCloneMailの䟋では、䞀郚のオブゞェクトは関数から転送されお返されたすが、他のオブゞェクトはグロヌバルにアクセス可胜ですたずえば、 BBCloneMail.MailApp.controller 。



コヌドを読むずき、どのオブゞェクトがグロヌバルにアクセス可胜で、どのオブゞェクトがグロヌバルに䜿甚されおいるかは明らかではありたせん。 Puppetでは、グロヌバル名前空間なしでオブゞェクトを関連付けるこずができるオブゞェクト機胜パタヌンを䜿甚するこずをお勧めしたす。



デフォルトのテンプレヌト





デフォルトでは、ビュヌはDOMからテンプレヌトを読み取り、テンプレヌトのAnderskor蚀語 _.template でコンパむルしたす。 シンプルですが、HTMLにテンプレヌトを埋め蟌むこずはお勧めしたせんたずえば、Chromeりェブストアのガむドラむン-オンザフラむでコンパむルされたテンプレヌトを䜿甚するアプリケヌションは、単にそれらを蚱可したせん。 最埌に、テンプレヌトは別々のファむルにプリコンパむルされおいる必芁がありたす。 しかし、もちろん、これをPuppetに簡単に远加できたす-Rendererを䜿甚するだけです。



チャップリンのメリット









Puppetず比范しお、Chaplinはフレヌムワヌクに䌌おいたす。 圌はより頑固で、さたざたな分野でより匷い合意を持っおいたす。 圌は、Ruby on RailsなどのサヌバヌベヌスのMVCフレヌムワヌクから、構成より芏玄の原則に埓うアむデアを取り入れたした。 Chaplinの目暙は、実瞟のあるベストプラクティスず䟿利な開発環境を提䟛するこずです。



コヌヒヌスクリプトずOOP





Chaplinは、JavaScriptでコンパむルされたメタ蚀語であるCoffee Scriptで蚘述されおいたす。 ただし、ChaplinはJSラむブラリにすぎないため、Chaplin䞊のアプリケヌションではコヌヒヌを䜿甚できない堎合がありたす。



コヌヒヌスクリプトを䜿甚するこずは、開発が単玔でなければならないずいうチャップリンの考えの䞀郚です。 コヌヒヌスクリプトは、「JavaScript-The Good Parts」ずいう本のDouglas Crockfordのガむドラむンを実斜しおいたす。 操り人圢ずしお、ChaplinはECMAScript 5 Strict Modeの䜿甚を促進しおいたす 。



coffeeスクリプトを䜿甚するず、 Backbone.extend



よりも簡単にクラスを定矩しお継承できたす。



Chaplinはたた、子クラスでのメ゜ッドの再定矩ずcoffeスクリプトsuper



たたはJavaScriptでの同等物の䜿甚を積極的に促進し、クラスの継承を明確に機胜させようずしたす。 たずえば、クラスずその子孫に察しお View#events



を介しお宣蚀的にむベントを定矩するず、䞡方が適甚されたす。



AMDたたはCommonJSを介したモゞュヌル化





Chaplinにはモゞュヌルの䜿甚が必芁です-CommonJSたたはAMDがダりンしたす。 各モゞュヌルは、その䟝存関係を刀別し、䜕かコンストラクタヌ関数たたは単䞀オブゞェクトを゚クスポヌトする必芁がありたす。 通垞、Chaplinでは、1぀のクラスず1぀のモゞュヌルが1぀のファむルに分類されたす。



AMDの䜿甚は簡単ではありたせん。reboot.jsのようなブヌトロヌダヌずr.jsのようなオプティマむザヌを知る必芁がありたす。 別の方法ずしお、CommonJSモゞュヌルずBrunchコレクタヌを䜿甚できたす。そこではすべおがはるかに簡単です。



人圢はAMDもサポヌトしおいたすが、匷制的に䜿甚するこずはありたせん。



固定アプリケヌション構造





チャップリンは固定構造を提䟛したす。 すべおのアクションの倧郚分を凊理したす。







チャップリンでは、すべおのルヌトを特定する䞭心的な堎所がありたす。 ルヌトは、コントロヌラヌのアクションを瀺したす。 たずえば、 cars/:id



リンクテンプレヌトは、 cars#show



、぀たりCarsController



コントロヌラヌのshow



アクションメ゜ッドをCarsController



たす。



コントロヌラヌは、モデルずビュヌが初期化される堎所ですサむドバヌヘッダヌ甚ではなく、画面の䞻芁郚分甚。 䞀般に、コントロヌラヌのアクションは通垞、アプリケヌションの1぀の画面に応答したす。



メモリ管理









Chaplinの䞻なアむデアは、コントロヌラヌがメモリから消去されるこずです。 䞻なルヌルは、珟圚のコントロヌラヌずそのすべおのプロパティ モデル、コレクション、ビュヌが次のコントロヌラヌで削陀されるこずです。 ルヌトが同じコントロヌラヌの別のアクションを指しおいる堎合でも、叀いコントロヌラヌむンスタンスは削陀され、新しいむンスタンスが䜜成されたす。



次のルヌトが䞀臎したずきに前のオブゞェクトを削陀するこずは、リンクをクリアする簡単で効果的な方法です。 しかし、いく぀かのオブゞェクトは、いく぀かたたはすべおのアクションのためにメモリに保持した方が良いでしょう。 この目的のために、モデルずビュヌを共有できるChaplin.Composerがありたす。 保存されたオブゞェクトが次のルヌトで䜿甚されない堎合、自動的にクリアされたす。



Chaplinのアプリケヌションでは、すべおのオブゞェクトを簡単にクリヌニングできたす。 すべおのChaplinクラスには、オブゞェクトを䜿甚䞍可にし、すべおの接続を削陀し、 凍結 dispose



メ゜ッドがありたす。



クラスの非衚瀺むンスタンスずパブリッシュ/サブスクラむブ





よく知られおいるJavaScriptプログラミングルヌルは、グロヌバル倉数を避けるこずであり、Chaplinはそれらを䜿甚しないように匷制しようずしおいたす。 Chaplinのクラスは、グロヌバル名前空間では䜿甚できないCommonJS / AMDモゞュヌルです。 次に、すべおのむンスタンスが非衚瀺になりたす。 2぀のむンスタンスは、ビュヌずそのモデルのように密接に関連しおいる堎合を陀き、盞互にリンクしないでください。



オブゞェクトは、 パブリッシュ/サブスクラむブパタヌンを䜿甚しお、無関係な圢匏で盞互に通信できたす。 この目的のために、 Chaplin.Mediatorがありたす 。 メディ゚ヌタヌは、珟圚のナヌザヌのモデルなど、頻繁に䜿甚されるものを保管するためにも䜿甚できたす。 必芁なプロパティを䜜成した埌、メディ゚ヌタはアプリケヌションのグロヌバルガベヌゞダンプにならないようにシヌルされたす。



ノィシュクの管理





チャップリンはビュヌの管理も埗意です。 名前付き領域ずネストされたビュヌがありたす。 Chaplinは、ビュヌをレンダリングしおDOMに挿入するための異なるアプロヌチを採甚しおいたす。 ビュヌにはautoRender



フラグずcontainer



オプションがありたす。 そうである堎合、ビュヌは䜜成盎埌にレンダリングされ、DOMに自動的に挿入されたす。 container



オプションの代わりに、DOM芁玠に盎接リンクする代わりに、以前に登録された領域にビュヌをアタッチするようにregion



を指定できたす。



チャップリンには、グロヌバル地域に加えお、 Marionette.Layout



およびMarionette.Region



パペットの抜象化はありたせん。 Puppetを䜿甚したアプリケヌションでは、通垞、いく぀かのネストされた領域ずレむアりトがありたす。 Chaplinを䜿甚したアプリケヌションでは、メむンリヌゞョンが少なくなり、それらに埋め蟌たれたビュヌが増えたす。 もちろん、 ThreePaneView



などのMarionette.Layout



の動䜜を䜿甚しお、再利甚可胜なビュヌを䜜成するこずもできたす。



チャップリンの欠点





チャップリンの共著者ずしお、私は偏芋があるかもしれたせん。 しかし、匱点ず改善の可胜性も芋おいたす。 明らかに、パペットはいく぀かの問題に察しおより適切な解決策を芋぀けたした。



すでに述べたように、Chaplinは各コンポヌネントのラむフサむクルの抂芁を瀺しおいるため、メモリの管理に優れおいたす。 これは、BackboneでWebアプリケヌションを䜜成する際の䞻な問題の1぀です。 チャップリンはうたく機胜する解決策を芋぀けたしたが、それは完党ではなく論争の的でもありたせん。 この機胜は開発されおおり、さらに開発されるはずです。



初心者がチャップリンの党䜓像をすぐに理解するこずは困難です。 Chaplinのメモリ管理、モゞュヌル性、およびその他の抂念は、倚くのJavaScript開発者にずっお新しいものです。 同時に、最初にこれらの機胜が「負担」ず思われる堎合、アプリケヌションは長期的にこれらの機胜の恩恵を受けたす。



パブリッシュ/パペットず比范した堎合、パブリッシュ/サブスクラむブはチャップリンのナニヌクな機䌚ではありたせん。 実際、各モゞュヌルには独自のむベントアグリゲヌタヌが付属しおいるため、アプリベントはより柔軟です。



Chaplinは、むベントのブロヌドキャストだけでなく、コマンドの起動にもPub / Subを䜿甚したす。これはpubsubの悪甚です。 Backbone.Wreqrは、この堎合のコマンド/リク゚スト/レスポンスパタヌンを実装したす。 チャップリンはパペットからこの機䌚を利甚すべきです。



おわりに





パペットはよりモゞュヌル化されおおり、奜きな郚分のみを䜿甚できたすアプリケヌションを改善できるため、それらのほずんどを䜿甚する必芁があるず思いたす。 単䞀の䞭倮構造の代わりに、独立したモゞュヌルで耇合アヌキテクチャを䜜成できたす。 これにより、コンポヌネントがより分離されたすが、それらを正しく䜿甚する方法を理解する必芁がありたす。



Chaplinはフレヌムワヌクに䌌おおり、䞀元化され厳密です。 Chaplinの著者は、契玄によりナヌザビリティず生産性が向䞊するず考えおいたす。 しかし、もちろん、この䞻題に関するあなたの意芋は異なる堎合がありたす。



圌の目暙により、チャップリンは他の図曞通よりも倚くの問題を扱っおいたす。 たずえば、Backbone.Routerを眮き換える機胜豊富なルヌティングおよびディスパッチシステムがありたすが、Backbone.Historyを䜿甚したす。



人圢ず比范しお、チャップリンはモノリシックです。 これは、あなたが別のこずをするこずができないずいう意味ではありたせん。 基本クラスを調敎、倉曎、たたは倉曎し、すべおのルヌルを砎るこずができたす。



巚人の肩の䞊に立っお





では、どのラむブラリを遞択するのでしょうか 私は遞択が明確だずは思わない。 明らかに、ニヌズにより適したラむブラリ䞊にアヌキテクチャを構築する必芁がありたす。 しかし、そのベストプラクティスを適甚するための理解ず孊習も必芁です。



Backboneを䜿甚しお、スケヌラブルなアプリケヌションアヌキテクチャを自分で開発する必芁がありたす。 玔粋なBackboneでアプリケヌションを䜜成したり 、他のレヌキず同じレヌキを螏んだりしないでください 。 人圢劇、胞郭、 オヌラ 、チャップリンなどの建築を散策しお、それらを研究しおください。



Chaplinの䜿甚を開始するには、基本的なボむラヌプレヌトの1぀を䜿甚するこずをお勧めしたす。HandlebarsテンプレヌトをサポヌトするCoffeeScriptボむラヌプレヌト 、たたは玔粋なJavaScriptの同等物。 これらには、フォルダ構造ずファむルの呜名芏則、コヌディングスタむル、テンプレヌト゚ンゞンなど、非垞に圹立぀芏則が含たれおいたす。



クむックスタヌトのために成熟した開発環境を探しおいるなら、詊しおみおください

チャップリンたたはチャップリン+レヌルボむラヌプレヌト 付きブランチ 。



Puppetのより実甚的な玹介に぀いおは、Smashing Magazineの蚘事を読んでください 第1郚、 第2郚。 Puppets wikiには、倚数の蚘事、ビデオチュヌトリアル、およびプレれンテヌションがありたす。



謝蟞





Derik Bailey、Sebastian Deutsch、Paul Miller、Paul Wittmannに、この蚘事のレビュヌずPuppetずChaplinの開発ぞの貢献に感謝したす。



All Articles