Знакомство с фреймворком Backbone JavaScript, сторонними библиотеками и создание веб-приложения в стиле «блог».

Репозиторий GitHub

Если вы когда-либо пользовались Hulu, Wordpress, AirBnB или посещали веб-сайт USA Today, значит, вы использовали веб-приложение. В частности, веб-приложение, построенное на платформе BackboneJS.

Конечно, существует множество веб-приложений и множество фреймворков. Другие популярные JavaScript-фреймворки включают EmberJS и AngularJS - все они великолепны, я просто предпочитаю Backbone, потому что работаю с ним на регулярной основе.

К сожалению, теоретически вы могли бы написать веб-приложение, даже не касаясь фреймворка ... Это сделало бы вас сумасшедшим. Фреймворки используют так называемый архитектурный паттерн Контроллер представления модели (MVC). Я мог бы очень долго рассказывать о MVC, но все, что вам нужно знать, это то, что он работает, стандартен, а страница в Википедии на нем довольно короткая, так что прочтите об этом там.

Если бы вы были на веб-сайте BackboneJS и читали любую документацию, вы бы видели такие вещи, как модели, коллекции и представления. Я помню, как изо всех сил пытался понять, что именно представляет собой коллекция, как работает модель и где во всем этом находится контроллер? Если фреймворки должны быть ориентированы на MVC, то почему я слышу только о модели и представлении? Потому что мир безумный и несправедливый, вот почему.

Просто шучу.

Когда мы перейдем к этим частям структуры, я объясню их в меру своих возможностей.

Поговорим о проекте: Super Simple Backbone Blog. Если вы читаете это на Medium, а я думаю, что вам и должно быть, если только вы не из будущего (я понимаю вас), то конечный результат этого небольшого приложения должен показаться вам довольно знакомым. Нравится личный блог. Мы позволим «пользователю» создавать сообщения в блогах, удалять и даже обновлять их.

НАСТРОЙКА

Нам нужно создать каталог, в котором будет жить наше приложение. Я храню свои проекты в каталоге под названием development, внутри каталога development я создаю каталог Super Simple Backbone Blog , Я буду называть эту папку корневой.

Давайте начнем с создания каталога libs в корне для хранения всех js-библиотек наших поставщиков. Сторонние библиотеки JavaScript чрезвычайно полезны, и вы будете часто их использовать. Но вы уже должны знать об этом, если читаете «JavaScript для кошек. Backbone требует UnderscoreJS, поэтому мы поместим его в библиотеки, мы также будем полагаться на jQuery, Handlebars и JSON2. Поместите все эти библиотеки в каталог libs, включая Backbone.

Добавьте каталог css в корневой каталог. Поместите туда Bootstrap, поверьте мне, это облегчит жизнь, если вы изучите бутстрап - с таким же успехом можно начать прямо сейчас.

Затем давайте возьмем файл index.html. Сохраните это в корень.

Вот как все должно выглядеть:

Если бы вы открыли это в Chrome прямо сейчас, вы бы увидели свою скучную html-страницу. Молодец. Откройте инструменты разработчика и проверьте консоль, чтобы убедиться в отсутствии ошибок.

СОЗДАНИЕ ПРИЛОЖЕНИЯ

Создайте каталог app в корневом каталоге. В app создайте файл app.js. Начнем с содержания фрагмента ниже:

Давай поговорим о том, что здесь происходит. app.js - это собственно само приложение - именно здесь мы используем Backbone, поэтому справедливо предположить, что все это для вас в новинку.

Первое, что мы делаем, это создаем View: DashboardView:

var DashboardView = Backbone.View.extend({ });

Backbone Views создают элемент DOM (a ‹div› ‹/div›, если быть точным, но вы можете делать его как хотите) по умолчанию, вы можете думать о View как о занимающем пространство между этими элементами. Вы можете ссылаться на элемент, который занимает это представление, как this.el или $ el. Помните об этом, потому что мы будем часто это видеть.

Мы назначаем представлению шаблон Handlebars:

var DashboardView = Backbone.View.extend({
  template: Handlebars.compile( $(“#dashboard-view-template”).html() ),

Мы очень скоро поместим наши шаблоны Handlebars в index.html. По сути, то, что мы здесь сделали, является шаблоном для этого представления. Большинство, если не все, веб-приложения являются динамическими, для этого мы используем шаблоны. Вы не представляете, какие сообщения в блогах будут создавать ваши пользователи, поэтому вы заключаете «их» в шаблон, который будет обновляться динамически.

Каждое представление в Backbone имеет функцию initialize: function (), независимо от того, определяете вы ее или нет. Я определил это, потому что хочу, чтобы это представление выполнялось render () сразу после его создания. Все, что вы вставляете в initialize (), будет выполняться по порядку при создании экземпляра представления.

var DashboardView = Backbone.View.extend({
  template: Handlebars.compile( $(“#dashboard-view-template”).html() ),
  initialize: function () {
    this.render();
  },
  render: function () {
    this.$el.html(this.template({greeting:”This will display a list of our blog posts”}));
  }
});

Каждое представление в Backbone имеет render: function (). В этом случае render () происходит сразу после создания этого представления из-за того, что он вызывается в initialize (). render () передает объект со свойством «приветствие», а «приветствие» имеет значение «Это отобразит список наших сообщений в блоге», поэтому мы можем получить доступ к приветствию внутри шаблона и отобразить все, что происходит с этим значением. быть.

Вы можете подумать о том, как работает render (), сказав: «HTML внутри элемента dom этого представления должен быть тем же, что и шаблон, а также давайте передадим этот объект с приветствием свойства».

Вы должны уметь «перевести» строку ниже, чтобы отразить это:

this.$el.html(this.template({greeting:”This will display a list of our blog posts”}));
 }

Это все, что касается представления DashboardView. Спустившись вниз, у нас есть AppRouter. Backbone's Router довольно легко понять, и я рекомендую вам использовать его в будущем (одностраничные приложения - это здорово, но вы обычно хотите, чтобы кнопка возврата вашего пользователя работала правильно, а URL-адрес точно отражал, где бы они ни находились - это то, что делает маршрутизатор… на самом деле, просто прочтите о маршрутизаторе, прежде чем продолжить)

Маршрутизатор - это в основном набор маршрутов, в нашем случае у нас просто значение по умолчанию: dashboardRoute

var AppRouter = Backbone.Router.extend({
  routes: {
    ‘’: ‘dashboardRoute’,

Обратите внимание на пустой маршрут слева от двоеточия. Это означает, что это то место, где приложение установлено по умолчанию. Справа от двоеточия у нас есть dashboardRoute, который по сути является просто функцией, хранящейся внутри AppRouter:

var AppRouter = Backbone.Router.extend({
  routes: {
    ‘’: ‘dashboardRoute’,
    ‘dashboard’: ‘dashboardRoute’,
    ‘create-blog’: ‘createBlogRoute’,
  },
  dashboardRoute: function () {
    var dashboardView = new DashboardView();
    $(“#content-container”).html(dashboardView.el);
  },

Вы можете представить себе маршрутизатор, работающий следующим образом: «Браузер перешел на страницу по умолчанию, позволяет запустить функцию DashboardRoute. Хорошо, dashboardRoute хочет, чтобы я создал экземпляр DashboardView и назвал его dashboardView, отлично - я понял! Хорошо, теперь мне нужно найти в index.html элемент с идентификатором контейнера содержимого. Я нашел это! Хорошо, давайте поместим HTML-код dashboardView в контейнер содержимого. Хорошо, моя работа сделана! »

Итак, AppRouter сделал все необходимое, когда браузер пользователя перешел на страницу по умолчанию. И все это произошло за… наносекунды или что-то в этом роде. Не знаю, но очень быстро. Как бы то ни было - на этом этапе инициализацию () представления DashboardView берет на себя, и мы рассмотрели, что она делает.

Прежде чем мы продолжим, давайте потратим секунду, чтобы понять, что такое экземпляр, например, когда вы создаете экземпляр представления. DashboardView - это представление, которое делает то, что делает, в зависимости от того, что вы ему приказываете. Но это НИЧЕГО, пока вы не создадите его экземпляр. Это просто ракушка, штамп без чернил.

Когда ты говоришь:

var whatever = new DashboardView();

Теперь что угодно - это ЧТО-ТО, и это все, чем является DashboardView. Представления - это просто объекты JavaScript ... Если вы не понимаете, о чем я говорю, ПРОЧИТАЙТЕ JAVASCRIPT ДЛЯ КОШЕК. ФУ.

Хорошо, мы завершаем app.js этими двумя строками:

var appRouter = new AppRouter();
Backbone.history.start();

Угадай, что мы здесь сделали? Мы создали экземпляр AppRouter и назвали его appRouter. Мы сделали это, потому что следующая строка фактически включает маршрутизатор.

ОБНОВИТЬ INDEX.HTML ШАБЛОНАМИ

Прямо сейчас у нас есть эти загадочные шаблоны, которые мы используем в app.js. Поместим их в index.html и обновим также некоторые другие HTML:

Во-первых, избавляемся от наших

<h1>Super Simple Backbone Blog</h1>

Мы заменяем его навигационным меню. Я использовал для этого Bootstrap, потому что это быстро и легко. Вы можете узнать больше о Bootstrap на сайте getboostrap.com. Обратите внимание на ссылки в навигационном меню. Мы добавим их к нашему маршрутизатору позже.

Затем мы добавляем новый div с идентификатором content-container. Помните, что маршрутизатор ищет элемент с идентификатором content-container? Теперь он найдет его и поместит в этот элемент dashboardView. Говоря о dashboardView, нам нужно создать его шаблон, и это следующее, что мы делаем:

<script type="text/template" id="dashboard-view-template">
  <h1>Dashboard</h1>
  {{greeting}}
</script>

Во-первых, давайте установим, что этот не отображается на странице, он заключен в тег скрипта. Handlebars использует это - сам index.html ничего не делает с этими шаблонами. Он будет отображаться на странице, когда представление Backbone вызывает шаблон для размещения в элементе представления. Ты все еще со мной? Хороший.

Первым делом в этом шаблоне является стандартный тег заголовка с Dashboard. Самое интересное - это {{приветствие}}. Помните в панели управления, когда мы это сделали:

this.$el.html(this.template({greeting:”This will display a list of our blog posts”}));
 }

Handlebars ищет это свойство «приветствие», и он заменит {{приветствие}} любым значением «приветствия», которое мы передали в шаблон в dashboardView с помощью «Это отобразит список наших сообщений в блоге»! Это очень простая реализация динамических шаблонов, но вы можете увидеть, как это становится полезным для динамической информации. Позже мы еще больше воспользуемся этим.

Мы создали второй шаблон для create-blog-template. Угадайте, что ... Это означает, что мы собираемся добавить еще одно представление и обновить наш маршрутизатор!

Наконец, не забудьте добавить файл app.js в конец списка скриптов, нам нужно запустить приложение в какой-то момент.

<script src="libs/jquery-1.11.3.js"></script>
<script src="libs/underscore-1.8.3.js"></script>
<script src="libs/backbone-1.2.0.js"></script>
<script src="libs/handlebars-v3.0.3.js"></script>
<script src="libs/json2.js"></script>
<script src="app/app.js"></script>

ОБНОВЛЯЙТЕ APP.JS НОВЫМ ВИДОМ И МАРШРУТАМИ

Вернемся к app.js, нам нужно добавить новое представление CreateBlogView и добавить маршруты, которые позволят пользователю действительно перемещаться:

Мы уже разбирались в том, что делают представления. В CreateBlogView не должно быть ничего, чего вы еще не понимали.

AppRouter немного изменился. Мы добавили еще два маршрута: дашборд и create-blog. Однако мы добавили только еще одну функцию маршрута, createBlogRoute - это потому, что и «», и «панель мониторинга» используют одну и ту же функцию dashboardRoute - они оба просто создают экземпляр dashboardView. createBlogRoute теперь создает экземпляр createBlogView.

Как вы, наверное, догадались, когда вы щелкаете ссылку «Панель управления» и / или «Создать блог» на панели навигации, приложение будет отображать правильный вид.

Откройте index.html в Chrome.

В следующей части этой серии мы поговорим о базовых моделях и коллекциях - вещах, которые вам определенно необходимы для того, чтобы наш веб-сайт действительно функционировал!

Спасибо за прочтение!