backbone.jsの目的は何ですか?


442

私のサイトhttp://documentcloud.github.com/backboneからbackbone.jsのユーティリティを理解しようとしましたが、それでも多くのことを理解することはできませんでした。

誰かがそれがどのように機能するか、そしてそれがより良いJavaScriptを書くのにどのように役立つかを説明することで私を助けることができますか?


36
これはMVCフレームワークです。データをモデルに抽象化し、DOM操作をビューに抽象化し、イベントを使用して2つをバインドすることをお勧めします。
レイノス

「ビュー」はMVCのコンテキストでどのようにイベントを処理できますか?これは、backbonejs.orgが紹介で主張していることです。

3
学ぶ価値があります。私は始めるのに苦労しましたが、学習曲線でいくつかのこぶを乗り越えた後、それは本当にそれほど難しくありません。ワインセラーのデモから始めます。
kmitchel46725

2
バックボーンのコンテキスト内では、ビューはコントローラーとしても機能します。DOMイベントをリッスンし、必要に応じてモデルにチャッキングします。また、モデルとコレクションの変更をリッスンし、DOMを適切に再描画します。バックボーンはMVパターンですが、Cが暗示されています。バックボーンがRailsの場合、テンプレートはビューになり、ビューはコントローラーになります。
スーパールミナリー2014

実際にはコントローラーを提供していないため、MVVMフレームワークだと思いました。
SoluableNonagon、2015

回答:


393

Backbone.jsは、基本的に、JavascriptコードをMVC(モデル、ビュー、コントローラー)方式で構造化できる超軽量フレームワークです...

モデルは、データを取得して入力するコードの一部であり、

ビューはこのモデルのHTML表現です(モデルの変更に応じてビューも変更されます)。

この場合、オプションのControllerを使用して、Javaアプリケーションの状態をハッシュバングURLで保存できます。例:http : //twitter.com/#search? q=backbone.js

私がバックボーンで発見したいくつかのプロ:

  • Javascript Spaghettiはもうありません。コードは整理され、意味的に意味のある.jsファイルに分解され、後でJAMMITを使用して結合されます。

  • これ以上jQuery.data(bla, bla):DOMにデータを格納する必要はなく、代わりにモデルにデータを格納します

  • イベントバインディングが機能する

  • 非常に便利なアンダースコアユーティリティライブラリ

  • backbone.jsコードは十分に文書化されており、読みやすくなっています。多くのJSコード手法に目を向けました。

短所:

  • 私の頭を包み込み、コードに適用する方法を理解するのにしばらく時間がかかりましたが、私はJavascriptの初心者です。

以下は、バックボーンとしてRailsでBackboneを使用するための一連の優れたチュートリアルです。

CloudEdit:Railsを使用したBackbone.jsチュートリアル:

http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/

http://www.jamesyu.org/2011/02/09/backbone.js-tutorial-with-rails-part-2/

ps モデルのコレクションを処理し、ネストされたモデルを模倣できるこの素晴らしいコレクションクラスもありますが、最初から混乱させたくありません。


1
別の便利なチュートリアル:coenraets.org/blog/2012/01/...
ジェフリー・ニコルソンカレ

16
この答えは間違っています。バックボーンはMVCフレームワークではありません。MV *フレームワークです。主要なコンポーネントを理解することは、一種の重要なことです。また、コントローラーはありません。幸運を。

3
繰り返しますが、バックボーンライブラリ自体にはコントローラがありませんが、ジェレミーアシュケナス氏は、ビューオブジェクトはモデルを所有し、フロントエンドとの間でデータをシャッフルするJavaScriptオブジェクトであるため、代わりになると述べています。もちろん、コントローラーやサービスの実装を妨げるものは何もありません。たとえ望めば、それはJavaScriptだけです。
スーパールミナリー2014

3
JAMMITとは ɯnɯıuıɯ ʇunoɔ ɹǝʇɔɐɹɐɥɔ
user1717828

1
RE: "jQuery.data(bla、bla):DOMにデータを格納する必要はありません" IIRC、とにかくjQueryはメモリに格納します。つまりdata-、DOM要素に属性を設定し直しません。(つまりdata-、ページが読み込まれたときにHTMLに属性があり、それらが変更された場合、DOMとメモリ内の表現はOOSになりますが、とにかくメモリ内データで作業する必要があります)
JoeBrockhaus

250

ブラウザーで複雑なユーザーインターフェイスを構築する場合、Backbone.jsやSammy.jsなどのフレームワークを構成するほとんどの要素を最終的に発明していることに気付くでしょう。したがって、問題は、ブラウザでそれを使用するに値するほど複雑なものを構築しているかどうかです(そのため、自分で同じものを発明することにはなりません)。

ビルドする予定のUIが定期的に表示方法を変更するものの、サーバーにアクセスして新しいページ全体を取得しない場合は、 Backbone.jsやSammy.jsなどが必要になる可能性があります。そのようなものの基本的な例は、GoogleのGmailです。これを使用したことがある場合は、最初にログインしたときにHTML、CSS、JavaScriptの大きなチャンクが1つダウンロードされ、その後、すべてがバックグラウンドで実行されることに気付くでしょう。新しいページ全体をレンダリングするように要求することなく、電子メールの読み取りと受信ボックスの処理、検索、およびそれらすべての検索の間を移動できます。

これらのフレームワークが開発を容易にする優れたアプリです。それらがなければ、機能の一部(たとえば、履歴管理用のjQuery BBQ、イベント用のEvents.jsなど)を取得するために、個々のライブラリの多様なセットをまとまってしまうか、すべてを自分で構築することになります。自分ですべてを維持し、テストする必要もあります。それとは対照的に、Githubで何千人もの人が見ているBackbone.jsのようなもの、何百人もの人が作業している可能性のあるフォーク、何百もの質問がここでStack Overflowで既に行われ、回答されています。

ただし、フレームワークに関連する学習曲線に見合うだけの複雑さを構築する予定がない場合は、どれも重要ではありません。PHP、Java、またはその他のサイトを構築していて、ユーザーからの要求に応じてバックエンドサーバーがWebページの構築のすべての重い作業を行っており、JavaScript / jQueryがそのプロセスに集中している場合は、 t Backbone.jsが必要になるか、まだ準備ができていません。


21
Gmailと比較していただきありがとうございます。これは、自分が開発しているサイトについてこれ以上詳しく調べる必要がないことを理解する簡単な方法でした。
Eric Hu

15
グリーンスパンの10日ルールRE:プロジェクトが十分に大きいを取得する場合は、とにかくBACKBONE.JSのように自分で何かを書いてしまいますことを言及するための1
マシューロックを

PHPまたは同様のものをWebサービスのエンドポイントとして使用している場合、従来の要求/応答スタイルのWeb開発フレームワークの80%または90%を使用していません。このため、この種のアプリが従来のWebアプリと比較して、どのように構築されるかには大きな違いがあります。
John Munsch、

2
ジョンはあなたの答えに感謝しますその本当に啓発
sushil bharwani

1
Gmailのリファレンスは本当に私の目を開きました。ありがとう!
T.Kaukoranta 2013

95

バックボーンは...

...コードの整理に役立つコンポーネントの非常に小さなライブラリ。単一のJavaScriptファイルとしてパッケージ化されています。コメントを除いて、実際のJavaScriptは1000行未満です。それは賢明に書かれていて、数時間で全部を読むことができます。

これはフロントエンドライブラリであり、スクリプトタグを使用してWebページに含めます。これはブラウザにのみ影響し、サーバーについてはほとんど言及しませんが、Restful APIを公開することが理想的です。

APIを使用している場合、Backboneには、APIとの対話に役立ついくつかの便利な機能がありますが、Backboneを使用して、静的HTMLページに対話機能を追加できます。

バックボーンは...

... JavaScriptに構造を追加します。

JavaScriptは特定のパターンを強制しないため、JavaScriptアプリケーションは非常に乱雑になる可能性があります。JavaScriptで些細なことを超えて何かを作成した人は、おそらく次のような質問に遭遇するでしょう。

  1. データはどこに保存しますか?
  2. 関数はどこに配置しますか?
  3. 関数を一緒に配線して、それらが賢明な方法で呼び出され、スパゲッティにならないようにするにはどうすればよいですか?
  4. このコードをさまざまな開発者が保守できるようにするにはどうすればよいですか?

バックボーンはあなたにこれらの質問に答えようとします:

  • データとデータのコレクションを表すのに役立つモデルとコレクション。
  • データが変更されたときにDOMを更新するのに役立つビュー。
  • コンポーネントが互いにリッスンできるようにするイベントシステム。これにより、コンポーネントの分離が維持され、スパゲティフィケーションが防止されます。
  • 開発者が同じコードベースで共同作業できるように、実用的な規約の最小限のセット。

これをMV *パターンと呼びます。モデル、ビュー、オプションの追加機能。

バックボーンは軽い

初期の外観にもかかわらず、バックボーンは素晴らしく軽量で、ほとんど何もしません。それが行うことは非常に役立ちます。

作成できる小さなオブジェクトのセットを提供し、イベントを発行して互いにリッスンできます。たとえば、コメントを表す小さなオブジェクトを作成してから、ブラウザの特定の場所でのコメントの表示を表す小さなcommentViewオブジェクトを作成します。

コメントを聞いて、コメントが変更されたときに自分自身を再描画するようにcommentViewに指示できます。同じコメントがページの複数の場所に表示されている場合でも、これらのビューはすべて同じコメントモデルをリッスンして、同期を保つことができます。

このようにコードを構成する方法は、コードベースが非常に大きくなり、多くの相互作用が発生した場合でも、絡まないようにするのに役立ちます。

モデル

最初は、データをグローバル変数に格納するか、DOMにデータ属性として格納するのが一般的です。。これらの両方に問題があります。グローバル変数は互いに競合する可能性があり、一般に悪い形式です。DOMに格納されているデータ属性は文字列のみです。それらを再度解析および解析する必要があります。配列、日付、オブジェクトなどを格納し、構造化された形式でデータを解析することは困難です。

データ属性は次のようになります。

<p data-username="derek" data-age="42"></p>

バックボーンは、データと関連するメソッドを表すモデルオブジェクトを提供することでこれを解決します。ToDoリストがあるとすると、そのリストの各項目を表すモデルがあるとします。

モデルが更新されると、イベントが発生します。その特定のオブジェクトに関連付けられたビューがある場合があります。ビューはモデル変更イベントをリッスンし、それ自体を再レンダリングします。

ビュー

バックボーンは、DOMと通信するViewオブジェクトを提供します。DOMを操作したり、DOMイベントをリッスンしたりするすべての関数がここに配置されます。

ビューは通常、ビュー全体またはビューの一部を再描画するレンダリング関数を実装します。render関数を実装する義務はありませんが、それは一般的な慣習です。

各ビューはDOMの特定の部分にバインドされているため、検索フォームのみをリッスンするsearchFormViewと、ショッピングカートのみを表示するshoppingCartViewがある場合があります。

ビューは通常、特定のモデルまたはコレクションにもバインドされます。モデルが更新されると、ビューがリッスンするイベントが発生します。ビューはレンダーを呼び出して、自分自身を再描画する場合があります。

同様に、フォームに入力すると、ビューでモデルオブジェクトを更新できます。そのモデルをリッスンする他のすべてのビューは、独自のレンダリング関数を呼び出します。

これにより、問題を明確に分離して、コードをきちんと整頓できます。

レンダー機能

レンダリング関数は、必要に応じて任意の方法で実装できます。DOMを手動で更新するために、jQueryをここに配置するだけかもしれません。

テンプレートをコンパイルして使用することもできます。テンプレートは、挿入ポイントを持つ文字列です。それをJSONオブジェクトと共にコンパイル関数に渡し、DOMに挿入できるコンパイルされた文字列を取得します。

コレクション

モデルのリストを格納するコレクションにもアクセスできるため、todoCollectionはtodoモデルのリストになります。コレクションがモデルを取得または失ったとき、その順序を変更したとき、またはコレクション内のモデルが更新されたとき、コレクション全体がイベントを発生させます。

ビューはコレクションをリッスンし、コレクションが更新されるたびにそれ自体を更新できます。

たとえば、コレクションに並べ替えとフィルターのメソッドを追加し、それ自体を自動的に並べ替えることができます。

そしてすべてを結びつけるイベント

可能な限り、アプリケーションコンポーネントは互いに分離されています。それらはイベントを使用して通信するため、shoppingCartViewはshoppingCartコレクションをlistenToし、カートが追加されると自分自身を再描画します。

shoppingCartView.listenTo(shoppingCart, "add", shoppingCartView.render);

もちろん、他のオブジェクトもshoppingCartをリッスンしている可能性があり、合計を更新したり、状態をローカルストレージに保存したりすることもあります。

  • ビューはモデルをリッスンし、モデルが変更されるとレンダリングします。
  • ビューはコレクションをリッスンし、コレクション内のアイテムが変更されたときにリスト(またはグリッド、マップなど)をレンダリングします。
  • モデルはビューをリッスンするため、フォームが編集されたときに状態を変更できます。

このようにオブジェクトを分離し、イベントを使用して通信することで、結び目に巻き込まれることがなくなり、新しいコンポーネントや動作の追加が簡単になります。新しいコンポーネントは、システムにすでに存在する他のオブジェクトをリッスンするだけです。

規約

バックボーン用に書かれたコードは、大まかな規則に従っています。DOMコードはビューに属します。コレクションコードはコレクションに属しています。ビジネスロジックはモデルに入ります。別の開発者がコードベースを入手すると、実行を開始できます。

総括する

バックボーンは、コードに構造を与える軽量のライブラリです。コンポーネントは分離され、イベントを介して通信するため、混乱することはありません。新しいオブジェクトを作成し、既存のオブジェクトを適切にリッスンさせるだけで、コードベースを簡単に拡張できます。あなたのコードはよりクリーンで、より良く、そしてより保守しやすくなります。

私の小さな本

私はバックボーンがとても好きだったので、それについて少しイントロ本を書きました。ここでオンラインで読むことができます:http : //nicholasjohnson.com/backbone-book/

また、資料を短いオンラインコースに分割しました。このコースは、http//www.forwardadvance.com/course/backboneで見つけることができます。約1日でコースを修了できます。


1
ビューは実際には「それ自体」ではなく、技術的にテンプレートをレンダリングしませんか?「Presenter」または「ViewModel」の役割を果たしているようです。
JoeBrockhaus、2015

1
ビューはあなたがそれを要求するものは何でもレンダリングできますが、良い点です。これは、テンプレート、任意のjQuery、フォーム内の値、バッジ内の数値などの小さなものでもかまいません。
superluminary

3
@superluminary本当に役に立ちます!!
Antoops、2015

2
素晴らしい説明!
TastyCode 2015年

3
この本はとても役に立ちます。それを書いてくれてありがとう。
Sung Cho

32

ここに興味深いプレゼンテーションがあります:

Backbone.jsの紹介

ヒント(スライドから):

  • ブラウザのRails?いいえ
  • JavaScriptのMVCフレームワークですか?みかん
  • 大きな脂肪の状態マシン?はい

14

Backbone.jsは、コードの整理に役立つJavaScriptフレームワークです。これは文字通り、アプリケーションを構築するためのバックボーンです。ウィジェット(jQuery UIやDojoなど)は提供していません。

これは、サーバー上のRESTfulエンドポイントとインターフェースするクリーンなJavaScriptコードを作成するために拡張できる基本クラスのクールなセットを提供します。


私のプロジェクトでは、jQueryとmootools、および一般的なJavaScriptを多用しています。backbone.jsを学習することでどのように役立ち、Restfulエンドポイントとは何ですか?
sushil bharwani

1
jQueryは主にDOM操作用であり、バックボーンはイベント駆動型フレームワークとして頻繁に使用されるだけでなく、データのモデリングにも使用されます。
RobertPitt

14

JQueryとMootoolsは、プロジェクトの多くのツールを備えた単なるツールボックスです。バックボーンは、JQueryまたはMootoolsを使用してアプリケーションを構築できるプロジェクトのアーキテクチャまたはバックボーンのように機能します。


ええ、実際には、名前が単なる名前であると仮定するのは簡単です。たとえば、「jquery」は、おそらくそれ自体ではあまり意味がない「JavaScriptクエリ」を意味します。しかし、この場合、それは文字通りバックボーンを意味します:)
msanjay


11

私は、MVCのすべての「利点」が私の作業を簡単に、より速く、またはより良くしたことは決してないことを認めなければなりません。コーディング全体のエクスペリエンスがより抽象的で時間のかかるものになります。分離が何を意味するかについて他の誰かの概念をデバッグしようとするとき、メンテナンスは悪夢です。MVCモデルとしてCairngormを使用したFLEXサイトを更新しようとした人の数はわかりませんが、更新に30秒かかるはずの場合、多くの場合2時間以上かかることがあります(単一のイベントを見つけるためだけに、ハンティング/トレース/デバッグ) )。MVCは、私にとって、あなたが詰め込める「利点」でしたし、今でもそうです。


2
正直なところ、フレームワーク構造は、無知なプログラマーや、気にしないプログラマーによって切断されたり、変形されたりする可能性があります。私はかつて、非常に単純で簡単に構築できるはずのCodeIgniterサイトに取り組みました。しかし、私が働いていた馬鹿は90年代のやり方に慣れていたので、彼はそれをクリーンなOOPアプローチからOOP内の変形手続きアプローチに変更しました。
Patrick

9
また、誰かが最初からサイトを書いて、フレームワークを使わずに美しく書いている人を見たこともあります。ある場合には、これは比較的新しい緑のPHPプログラマーによって行われました。彼はたまたま物事を実装するための非常に洗練された方法を考え出した非常に合理的な心を持っていました。優れたフレームワークを使用することは、今のところあなたを得るだけです。一方、優れたプログラミング手法を使用すると、未来に数年かかります。
Patrick

2
@ user1415445:基本的に、データロジック、レンダリングロジック、およびプレゼンテーションレイヤーウィジェットとデータストレージ/取得コード間の通信を処理する単一のクラスを使用する方が、これらの各懸念事項を個別のクラス/オブジェクトで処理するよりも維持が容易であることを意味します。信じがたいことです。あなたは非自明なアプリはMVCで1回、2回書かれており、一度など、その非MVCのバージョンを維持することが容易であること、なしを証明できない限り
Behrang Saeedzadeh

1
些細なことを超えるアプリケーションにはパターンが必要であり、MVCはデータのプレゼンテーションを処理するときに優れたパターンです。悪い経験をしたようですが、それはパターンのせいではありません。
超光速

ドキュメントは、使用されるパターンやプラクティスに関係なく、常に欠けているロゼッタ石になります。それらは時間とともに変化するためです。MVCのようなパターンの優れた点は、配管を理解したら、新しい機能を追加したり、古い機能を更新したりするたびに、配管を書く時間を無駄にする必要がないことです。だから、はい、配管を理解するまで、それは無益な練習になります。将来の未知の開発者の適切な理解を確実にする唯一の方法は、十分に妥当な標準に従い、さらにドキュメントをよく読むことです。誰かのspagettified混乱を維持し、理解することは速くなったり、簡単に...ではありません
JoeBrockhaus


3

backbone.jsはJavaScriptを備えたModel-View-Controller(MVC)です が、Extjsは javaスクリプトによるMVCパターンのバックボーンよりも優れています

バックボーンを使用すると、ほぼすべてのことを自由に行うことができます。APIをフォークしてカスタマイズしようとするのではなく、シンプルさと実装の容易さのためにBackbonejsを使用します。繰り返しになりますが、2つのうち1つはライブラリであり、もう1つはコンポーネントです。


3

Backboneは、CoffeeScriptを執筆したJeremy Ashkenasによって作成されました。JavaScriptを多用するアプリケーションとして、バックボーンとして現在知られているのは、アプリケーションを首尾一貫したコードベースに構築することです。バックボーンの唯一の依存関係であるUnderscore.jsもDocumentCloudアプリケーションの一部でした。

バックボーンは、開発者がクライアント側のWebアプリでデータモデルを管理するのに役立ちます。これは、従来のサーバー側のアプリケーションロジックで行うのと同じくらいの規律構造です。

Backbone.jsを使用するその他の利点

  1. フレームワークとしてではなく、ライブラリとしてバックボーンを見る
  2. JavaScriptは構造化された方法で整理されています(MVVM)モデル
  3. 大規模なユーザーコミュニティ

2

また、コントローラーとKVOのビューを使用してルーティングを追加します。これで「AJAXy」アプリケーションを開発できるようになります。

それを軽量のSproutcoreまたはCappuccinoフレームワークとして見てください。


1

クライアント側のMVC設計パターンです。信じてください。これにより、よりクリーンで明確なコードはもちろんのこと、コードのメンテナンスがより簡単になるだけでなく、大量のコードを節約できます。最初は少し難しいかもしれませんが、素晴らしいライブラリだと私は信じています。


0

すでに多くの良い答えがあります。バックボーンjsは、コードを整理しておくのに役立ちます。モデル/コレクションを変更すると、ビューのレンダリングが自動的に処理され、開発のオーバーヘッドが大幅に削減されます。

開発に最大の柔軟性を提供しますが、開発者はモデルを破棄してビューを適切に削除するように注意する必要があります。そうしないと、アプリケーションでメモリリークが発生する可能性があります。


-3

時々変更する必要があり、リアルタイムで実行される多くのAJAX要求での多くのユーザーインタラクションを含むWebアプリケーション(FacebookやStackOverflowなど)は、Backbone.jsなどのMVCフレームワークを使用する必要があります。これは、優れたコードを作成するための最良の方法です。

ただし、アプリケーションが小さい場合、Backbone.jsは特に初めてのユーザーにとってはやりすぎです。

バックボーンはクライアント側のMVCを提供し、これによって暗示されるすべての利点があります。


5
バックボーンを使用する必要がありますか?バックボーンまたはアンダースコアを使用した、あなたの2つの例である、stackoverflowまたはfacebookがまったく表示されません。その主張についての言及はありますか?
David Meister

もちろん他にも多くのMV *ライブラリーがあり、Backboneもその1つです。ただし一般的に、MVCは、より大きなコードを開発する際に、整然と整頓するのに役立ちます。
スーパールミナリー2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.