Яка мета backbone.js?


442

Я спробував зрозуміти корисність backbone.js з його веб-сайту http://documentcloud.github.com/backbone , але я все ще не міг зрозуміти багато чого.

Хтось може мені допомогти, пояснивши, як це працює і як це може бути корисним у написанні кращого JavaScript?


36
Це рамка MVC. Це спонукає вас абстрагувати свої дані в моделях, а маніпуляція з DOM - переглядами та зв'язувати їх разом, використовуючи події.
Райнос

Як "погляд" може поводитися з подіями в контексті MVC? Про це стверджує backbonejs.org у своєму вступі.

3
Варто навчитися. Мені було важко почати роботу, але після переходу декількох горбів у кривій навчання це насправді не надто важко. Почніть з демонстрації винного підвалу.
kmitchel46725

2
У контексті хребта вид подання подвоюється як контролер. Він слухає події DOM і підбирає їх до відповідних моделей. Він також слухає зміни ваших моделей та колекцій та переробляє DOM відповідним чином. Хребна основа - це модель МВ, однак мається на увазі С. Якби хребтом були Rails, шаблоном було б вид, а перегляд - контролером.
суперлюмінація

Я думав, що це MVVM-фреймворк, оскільки він насправді не забезпечує контролери.
SoluableNonagon

Відповіді:


393

Backbone.js - це в основному фреймворк, що дозволяє структурувати ваш код Javascript у MVC (Model, View, Controller), де ...

Модель є частиною вашого коду, яка отримує та заповнює дані,

Перегляд - це HTML-представлення цієї моделі (перегляд змінюється в міру зміни моделей тощо)

і необов'язковий контролер, який у цьому випадку дозволяє зберегти стан програми Javascript за допомогою URL-адреси хешбангу, наприклад: http://twitter.com/#search?q=backbone.js

Деякі плюси, які я виявив у "Хребці":

  • Більше не спагетті Javascript: код організовується та розбивається на семантично значущі файли .js, які згодом поєднуються за допомогою JAMMIT

  • Не більше jQuery.data(bla, bla): немає необхідності зберігати дані в DOM, зберігати дані в моделях

  • Прив'язка подій просто працює

  • надзвичайно корисна бібліотека утиліт Underscore

  • код backbone.js добре задокументований і чудово прочитаний. Відкрив очі на ряд методик кодового JS.

Мінуси:

  • Взяв у мене час, щоб обернути голову навколо цього і зрозуміти, як застосувати його до свого коду, але я новачок у Javascript.

Ось набір чудових навчальних посібників із використання Backbone with Rails як резервного:

CloudEdit: Підручник 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
Зауважимо, що в самій бібліотеці «Backbone» немає контролерів, хоча Джеремі Ашкенас сказав, що об’єкти «Перегляд» займають своє місце, оскільки це об’єкти JavaScript, які мають моделі та переміщують дані до та з переднього кінця. Звичайно, ніщо не заважає вам реалізувати контролер, сервіс, навіть ViewModel, якщо ви цього хочете, це просто JavaScript.
суперлюмінація

3
Що таке JAMMIT? ɯnɯıuıɯ ʇunoɔ ɹǝʇɔɐɹɐɥɔ
користувач1717828

1
RE: "jQuery.data (бла, бла): немає необхідності зберігати дані в DOM" IIRC, jQuery зберігає, що все одно в пам'яті. тобто не встановлює data-атрибути назад на елементи DOM. (Отже, якщо ваш HTML мав data-атрибути при завантаженні сторінки, і вони змінені, DOM і представлення в пам'яті буде OOS - але ви все одно повинні працювати з даними пам’яті)
JoeBrockhaus

250

Якщо ви збираєтеся створювати складні інтерфейси користувача в браузері, то, ймовірно, ви знайдете, врешті-решт, винайдете більшість фрагментів, що складають рамки, такі як Backbone.js і Sammy.js. Отже, питання полягає в тому, чи ви створюєте щось досить складне в браузері, щоб заслужити його використання (так що ви не в кінцевому підсумку винайдете те саме).

Якщо те, що ви плануєте побудувати, - це те, де інтерфейс користувача регулярно змінює спосіб відображення, але не переходить на сервер, щоб отримати цілі нові сторінки, то вам, мабуть, потрібно щось на зразок Backbone.js або Sammy.js. Основним прикладом чогось подібного є GMail Google. Якщо ви коли-небудь використовували це, ви помітите, що він завантажує один великий фрагмент HTML, CSS та JavaScript під час першого входу, а потім після цього все відбувається на задньому плані. Він може переходити між читанням електронної пошти та обробкою вхідних повідомлень, пошуком і поверненням до них знову, без жодного запиту на створення нової сторінки.

Це такий додаток, який ці рамки вдосконалюють, полегшуючи розробку. Без них ви або в кінцевому підсумку збираєте різноманітний набір окремих бібліотек, щоб отримати частини функціоналу (наприклад, jQuery BBQ для управління історією, Events.js для подій тощо), або ви все-таки зможете все створити самостійно і потрібно все також підтримувати і перевіряти. Порівнюйте це з чимось на кшталт Backbone.js, у якому тисячі людей переглядають його на Github, сотні вил, де люди можуть працювати над ним, і сотні запитань і відповідей тут на Stack Overflow.

Але жодне з них не має жодного значення, якщо те, що ви плануєте побудувати, не є досить складним, щоб бути вагомим кривою навчання, пов'язаною з рамкою. Якщо ви все ще будуєте PHP, Java або якісь інші сайти, де сервер із заднім кінцем все ще робить важке зняття веб-сторінок за запитом користувача, а JavaScript / jQuery просто обмерзає цей процес, ви не ' не потрібно або ще не готові до Backbone.js.


21
Дякуємо за порівняння з Gmail. Це був простий спосіб для мене зрозуміти, що мені не потрібно далі вивчати це для сайту, який я розробляю.
Ерік Ху

15
+1, щоб згадати, що ви все одно напишіть щось на зразок backbone.js самостійно, якщо ваш проект стане досить великим: повторне 10-е правило Грінспана
Меттью Лок

Якщо ви використовуєте PHP або щось подібне просто в якості кінцевої точки для веб-сервісу, ви не використовуєте 80 або 90% традиційної структури веб-розробки в стилі запит / відповідь. Тож велика різниця в тому, як цей додаток закінчується будуватися порівняно з більш традиційним веб-додатком.
Джон Мюнш

2
Дякую Джону за Вашу відповідь за дійсно захоплююче
sushil bharwani

1
Довідка Gmail справді відкрила мені очі. Дякую!
Т.Каукоранта

95

Основою є ...

... дуже невелика бібліотека компонентів, яку ви можете використовувати для організації свого коду. Він поставляється упакованим у вигляді одного файлу JavaScript. За винятком коментарів, він має менше 1000 рядків фактичного JavaScript. Це розумно написано, і ви можете прочитати всю справу за пару годин.

Це фронтальна бібліотека, ви включаєте її на свою веб-сторінку з тегом сценарію. Це впливає лише на браузер і мало говорить про ваш сервер, за винятком того, що він в ідеалі повинен відкривати спокійний API.

Якщо у вас є API, у Backbone є кілька корисних функцій, які допоможуть вам поговорити з ним, але ви можете використовувати Backbone для додавання інтерактивності на будь-яку статичну HTML-сторінку.

Хребет для ...

... додавання структури в JavaScript.

Оскільки JavaScript не застосовує конкретних моделей, програми JavaScript можуть дуже швидко забруднитися. Кожен, хто створив щось нетривіальне в JavaScript, швидше за все, наштовхнеться на такі питання, як:

  1. Де я буду зберігати свої дані?
  2. Де я буду розміщувати свої функції?
  3. Як я з'єднаю свої функції разом, щоб вони були викликані розумним чином і не зверталися до спагетті?
  4. Як я можу зробити цей код підтримуваним різними розробниками?

Хребет шукає відповісти на ці запитання, надаючи вам:

  • Моделі та колекції, які допоможуть вам представляти дані та колекції даних.
  • Перегляди, щоб допомогти вам оновити DOM при зміні ваших даних.
  • Система подій, щоб компоненти могли слухати один одного. Це утримує ваші компоненти в роз'єднаному стані та запобігає спагетізації.
  • Мінімальний набір розумних умов, щоб розробники могли працювати разом на одній і тій же кодовій базі.

Ми називаємо це схемою MV *. Моделі, перегляди та додаткові додатки

Хребет легкий

Незважаючи на початкові виступи, хребет є фантастично легким, він навряд чи робить щось взагалі. Те, що вона робить, дуже корисно.

Він дає вам набір маленьких об’єктів, які ви можете створювати, і які можуть випромінювати події та слухати один одного. Ви можете створити невеликий об’єкт, наприклад, для представлення коментаря, а потім невеликий об’єкт commentView, щоб представити відображення коментаря в певному місці браузера.

Ви можете сказати commentView прослухати коментар і перемалювати себе, коли коментар зміниться. Навіть якщо у вас є один і той же коментар, який відображається в декількох місцях на вашій сторінці, усі ці перегляди можуть слухати ту саму модель коментарів і залишатися синхронізованою.

Такий спосіб складання коду допомагає уберегти вас від заплутування, навіть якщо ваша база коду стає дуже великою при багатьох взаємодіях.

Моделі

Коли ви починаєте, звичайно зберігати свої дані або в глобальній змінній, або в DOM як атрибути даних . У обох із них є проблеми. Глобальні змінні можуть конфліктувати між собою, і, як правило, погана форма. Атрибути даних, що зберігаються в DOM, можуть бути лише рядками, вам доведеться їх знову розбирати і вимикати. Важко зберігати такі речі, як масиви, дати чи об’єкти, і аналізувати свої дані в структурованому вигляді.

Атрибути даних виглядають приблизно так:

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

Магістральна система вирішує це, надаючи об’єкт Model для представлення ваших даних та пов'язаних з ними методів . Скажімо, у вас є список todo, ви б мали модель, що представляє кожен елемент у цьому списку.

Коли ваша модель оновлюється, вона запускає подію. У вас може бути вид, прив’язаний до конкретного об'єкта. Перегляд прослуховує події зміни моделі та відтворює себе.

Перегляди

Магістраль надає вам об’єкти Перегляд, які спілкуються з DOM. Усі функції, які маніпулюють DOM або слухають події DOM, переходять сюди.

Перегляд зазвичай реалізує функцію візуалізації, яка перемальовує весь вид або, можливо, частину подання. Немає обов'язку реалізовувати функцію візуалізації, але це звичайна конвенція.

Кожен перегляд прив’язаний до певної частини DOM, тому у вас може бути searchFormView, який слухає лише форму пошуку, і shoppingCartView, що відображає лише кошик для покупок.

Перегляди, як правило, також пов'язані з конкретними моделями або колекціями. Коли Модель оновлюється, вона запускає подію, яку перегляд слухає. Вигляд може викликати візуалізацію, щоб перемалювати себе.

Так само, коли ви вводите форму, ваш погляд може оновити об'єкт моделі. Кожен інший вигляд, слухаючи цю модель, буде викликати свою функцію візуалізації.

Це дає нам чітке розмежування проблем, яке підтримує наш код акуратним та охайним.

Функція візуалізації

Ви можете реалізувати функцію візуалізації будь-яким способом, який вважаєте за потрібне. Ви можете просто поставити сюди jQuery, щоб оновити DOM вручну.

Ви також можете скласти шаблон і використовувати його. Шаблон - це лише рядок з точками вставки. Ви передаєте його функції компіляції разом з об'єктом JSON і отримуєте назад складений рядок, який ви можете вставити у свій DOM.

Колекції

Ви також маєте доступ до колекцій, у яких зберігаються списки моделей, тож todoCollection буде списком моделей todo. Коли колекція отримує або втрачає модель, змінює її порядок або модель в колекції оновлюється, вся колекція запускає подію.

Перегляд може слухати колекцію та оновлювати себе щоразу, коли колекція оновлюється.

Ви можете додати методи сортування та фільтрування у свою колекцію та зробити їх сортування автоматично, наприклад.

І події, щоб зв’язати це все разом

Наскільки це можливо, компоненти додатків відокремлюються один від одного. Вони спілкуються за допомогою подій, тож ShoppingCartView може прослухати колекцію ShoppingCart та перемалювати себе, коли до кошика додано.

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

Звичайно, інші об’єкти також можуть слухати ShoppingCart, і вони можуть робити інші речі, такі як оновлення загальної кількості або збереження стану в локальному сховищі.

  • Перегляди слухають Моделі та відображають, коли модель змінюється.
  • Перегляди слухають колекції та надають список (або сітку, карту тощо), коли елемент колекції змінюється.
  • Моделі слухають перегляди, щоб вони могли змінити стан, можливо, коли редагувати форму.

Розв’язання подібних об’єктів та спілкування за допомогою подій означає, що ви ніколи не заплутаєтеся у вузлах, а додавання нових компонентів та поведінки легко. Ваші нові компоненти просто повинні слухати інші об'єкти, які вже є в системі.

Конвенції

Код, написаний для Backbone, дотримується нескінченного набору умов. Код DOM належить до перегляду. Код колекції належить до колекції. Логіка бізнесу йде в моделі. Інший розробник, який забирає вашу кодову базу, зможе вразити землю.

Підсумовуючи

Backbone - це легка бібліотека, яка надає структуру вашому коду. Компоненти роз'єднуються і спілкуються через події, щоб ви не опинилися в безладі. Ви можете легко розширити свою кодову базу, просто створивши новий об’єкт і змусивши його відповідним чином прослухати наявні об’єкти. Ваш код буде чистішим, приємнішим та більш ретельним.

Моя маленька книжка

Мені настільки сподобалось «Хребет», що я написав про це невелику вступну книгу. Ви можете прочитати його онлайн тут: http://nicholasjohnson.com/backbone-book/

Я також розбив матеріал на короткий онлайн-курс, який ви можете знайти тут: http://www.forwardadvance.com/course/backbone . Ви можете закінчити курс приблизно за день.


1
Чи Перегляд технічно не відображає шаблон, а не насправді "сам"? Здається, вона грає більше ролі "Presenter" або "ViewModel".
JoeBrockhaus

1
Хороша точка, хоча вигляд може відображати все, про що ви попросите. Це може бути шаблон, якийсь довільний jQuery, або навіть щось крихітне, як значення у формі або число у значку.
суперлюмінація

3
@superluminary дійсно допомагає !!
Antoops

2
Дивовижне пояснення!
TastyCode

3
Книга дуже корисна. Дякуємо, що написали це.
Сун Чо

32

Ось цікава презентація:

Вступ до Backbone.js

Підказка (зі слайдів):

  • Рейки в браузері? Ні .
  • Рамка MVC для JavaScript? Сорта .
  • Велика машина жиру? ТАК !

14

Backbone.js - це структура JavaScript, яка допомагає вам упорядкувати свій код. Це буквально основа, на якій ви будуєте свою програму. Він не забезпечує віджети (наприклад, інтерфейс jQuery або Dojo).

Це дає вам класний набір базових класів, який ви можете розширити, щоб створити чистий код JavaScript, який взаємодіє з RESTful кінцевими точками на вашому сервері.


Я активно використовую jQuery та mootools та загальний javascript у своєму проекті. Навчання backbone.js допоможе мені і що таке Спокійна кінцева точка. Вибачте, якщо моє запитання не має сенсу.
sushil bharwani

1
jQuery в основному призначений для маніпуляції з DOM, де як Магістральна система широко використовується як основана на події рамка, а також використовується для моделювання даних.
RobertPitt

14

JQuery і Mootools - це лише інструментарій з великою кількістю інструментів вашого проекту. Магістраль діє як архітектура або основа для вашого проекту, на якому ви можете побудувати додаток за допомогою JQuery або Mootools.


так, насправді просто назвати це ім'я - це лише ім'я, наприклад, "jquery", мабуть, означає "запит javascript", який насправді не означає багато сам по собі. Але в цьому випадку це досить буквально означає кістяк :)
msanjay


11

Маю визнати, що всі "переваги" MVC ніколи не робили мою роботу легшою, швидшою чи кращою. Це просто робить весь досвід кодування більш абстрактним і трудомістким. Технічне обслуговування - це кошмар, коли намагаються налагодити когось, не розуміючи, що означає розлука. Не знаєте, хто з вас коли-небудь намагався оновити веб-сайт FLEX, який використовував Cairngorm як модель MVC, але для оновлення потрібно 30 секунд, але це може зайняти понад 2 години (полювання / відстеження / налагодження лише для пошуку однієї події ). MVC був і досі є для мене «перевагою», яку можна наповнити.


2
Чесно кажучи, будь-яка рамкова структура може бути понівечена і деформована необізнаними програмістами або програмістами, які просто не турбуються. Я колись працював на сайті CodeIgniter, який повинен був бути дуже простим і простим у створенні. Але ідіот, з яким я працював, настільки звик робити речі 90-х, що він змінив його з чистого підходу до ООП на деформованого процедурного підходу в рамках ООП.
Патрік

9
Я також бачив, як хтось пише сайт з нуля і красиво пише його, не використовуючи жодних фреймворків. Одного разу це зробив відносно новий / зелений PHP-програміст. У нього просто трапився дуже раціональний розум, який розробив досить гладкий спосіб втілення речей. Використання хорошої рамки отримає вас лише поки що. Тоді як використання чудових практик програмування забере у вас світлі роки у майбутньому.
Патрік

2
@ user1415445: По суті, те, що ви говорите, означає, що мати один клас, який обробляє логіку даних, логіку візуалізації та зв’язок між віджетами шару презентації та кодом зберігання / пошуку даних, легше підтримувати, ніж обробляти кожне з цих питань окремими класами / об'єктами. У що важко повірити. Якщо ви не зможете продемонструвати нетривіальне додаток, написане двічі, один раз на MVC і один раз без цього, його версію, яка не є MVC, легше підтримувати тощо.
Бехранг Саедзаде,

1
Будь-яка програма, що не відповідає тривіальному, в ідеалі потребує шаблону, а MVC - відмінний зразок, коли ви маєте справу з поданням даних. Це здається, що у вас поганий досвід, але це не вина схеми.
суперлюмінація

Документація завжди буде відсутнім каменем розетки, незалежно від використовуваних шаблонів і практик, оскільки вони змінюються з часом. краса моделей, таких як MVC, полягає в тому, що, зрозумівши сантехніку, вам ніколи не доведеться витрачати час на написання сантехніки щоразу, коли ви додаєте нову функцію або оновлюєте стару. Так що, поки ви не зрозумієте сантехніку, це буде вправністю. Єдиний спосіб забезпечити адекватне розуміння майбутніх невідомих розробників - це дотримуватися достатньо розумних стандартів та ТАКОЖ добре документувати. Підтримувати та розуміти чиїсь спагетовані безладу не швидше чи простіше ..
JoeBrockhaus


3

backbone.js - це Model-View-Controller (MVC) з JavaScript, але Extjs краще, ніж магістраль для MVC Pattern за сценарієм java

З хребтом ви отримали свободу робити майже все, що забажаєте. Замість того, щоб намагатися розщедритися через api та налаштувати, я б використовував Backbonejs для його простоти та простоти в реалізації. Знову важко сказати, що вам потрібно з двох - це бібліотека, інший компонент


3

Основу хребта створив Джеремі Ашкенас, який також написав CoffeeScript. Як важкий для JavaScript додаток, те, що ми тепер знаємо як Backbone, відповідало за структурування програми в когерентну базу коду. Underscore.js, єдина залежність хребта, також була частиною програми DocumentCloud.

Backbone допомагає розробникам керувати моделлю даних у своєму веб-додатку на стороні клієнта з такою ж дисципліною та структурою, як ви отримаєте в традиційній логіці додатків на сервері.

Додаткові переваги використання Backbone.js

  1. Бачити хребет як бібліотеку, а не як рамку
  2. Тепер Javascript організовується структуровано, модель (MVVM)
  3. Велика спільнота користувачів

2

Він також додає маршрутизацію за допомогою контролерів та поглядів з KVO. Ви зможете розробляти додатки "AJAXy" за допомогою нього.

Розглядайте це як легкий каркас Sproutcore або Cappuccino.


1

Повірте, це модель дизайну MVC на стороні клієнта. Це допоможе вам заощадити тонни коду, не кажучи вже про більш чистий і зрозумілий код, простіший у обслуговуванні код. Спочатку може бути трохи хитро, але повірте, це чудова бібліотека.


0

Стільки хороших відповідей уже. Backbone js допомагає організувати код. Зміна моделі / колекції забезпечує подбання про автоматичне візуалізацію вигляду, що зменшує велику кількість витрат.

Незважаючи на те, що це забезпечує максимальну гнучкість для розробки, розробникам слід обережно знищити моделі та належним чином видалити представлення даних. В іншому випадку в програмі може виникнути витік пам'яті.


-3

Веб-додаток, що включає багато взаємодії користувачів з багатьма запитами AJAX, яке потрібно час від часу змінювати і яке працює в режимі реального часу (наприклад, Facebook або StackOverflow), повинно використовувати MVC-фреймворк, такий як Backbone.js. Це найкращий спосіб створити хороший код.

Якщо додаток лише невеликий, то Backbone.js надмірний, особливо для перших користувачів.

Магістральна система надає клієнтові MVC і всі переваги, що маються на увазі.


5
"must" використовувати хребет? Я не можу побачити stackoverflow або facebook, ваші два приклади, використовуючи магістраль або підкреслення. Чи є у вас посилання на цю претензію?
Девід Мейстер

Звичайно, існує багато інших бібліотек MV *, одна з яких є хребтом. Однак, як правило, MVC допомагає тримати речі акуратними та охайними при розробці великих фрагментів коду.
суперлюмінація
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.