Сборка фронтенда - часть 2. Тестовое приложение Backbone + Require.js
В предыдущей статье мы договорились разобраться, как собирать фронтенд с помощью gulp. Но предварительно нужно сделать тестовое приложение для того, чтобы было что собирать. В качестве примера сделаем простенькую страничку на Backbone. Управлять модулями будем с помощью require.js. Работать с dom поможет добрая jQuery, а с данными - lodash. Подгружать html-шаблоны мы сможем с помощью requirejs-text.
Так как приложение тестовое, я не буду уделять внимание функциональности - все предельно просто. Обычная страничка с парой текстов и картинкой. Мы создадим одну модель, представление view к ней, загрузим html-шаблон и отрендерим все это добро. Предполагаю, что Вы уже знакомы с Backbone и Require.js, поэтому подробно каждую строчку расписывать не буду. Код очень простой, но все-таки без знания основ этих библиотек не все будет очевидно.
Если Вы не знакомы с Backbone, но интересуетесь созданием Single Page Application в целом и этой замечательной библиотекой в частности, оставляйте комментарии в статье, что-нибудь придумаем :-)
А теперь к делу.
Каркас приложения
В предыдущей части статьи мы уже видели скриншот со структурой проекта.
Но это была итоговая структура, уже после настройки gulp.
Сейчас когда мы только напишем тестовое приложение, все выглядит немного проще:
Внимание! Для запуска тестового приложения из этой Вам нужно настроить у себя веб-сервер. Просто из папки приложение не запустится. В третьем уроке, когда мы разберем, как это сделать с помощью gulp, все будет работать и так, но пока придется запустить веб-сервер самим или загрузить содержимое папки src на какой-нибудь тестовый домен.
Напоминаю, как будет выглядеть наша итоговая страница.
Достаточно сурово, но меж тем мы затронем важные моменты касаемо работы Backbone в связке с Require.js.
Для начала создадим папку img и поместим в нее картинку backbone.js. Все исходники будут в конце третьей статьи. Дальше заведем папку lib, где будут лежать нужные библиотеки.
- 1. jquery - 1.3.3
- 2. lodash - 2.2.4
- 3. backbone - 4.13.1
- 4. require - 2.2.0
- 5. text - 2.0.15
index.html в корне папки будет выглядеть так.
Секция head
Webdevkin • Backbone.js + RequireJS
Секция body
Конфигурация require.js
Теперь настроим главный файл конфигурации require.js. Сначала привожу код полностью. Файл js/main.js
'use strict'; // Пути приложения var path = { base: './js/', lib: '../lib/', tpl: '../tpl/' }; // Конфиг для require.js require.config({ baseUrl: path.base, shim: { lodash: { exports: '_' }, backbone: { deps: [ 'lodash', 'jquery' ], exports: 'Backbone' } }, paths: { jquery: path.lib + 'jquery', lodash: path.lib + 'lodash', backbone: path.lib + 'backbone', text: path.lib + 'text', tpl: path.tpl }, map: { '*': { 'underscore': 'lodash' } } }); // Старт приложения require([ 'views/app' ], function ( AppView ) { new AppView().render(); });
Сначала для удобства заведем переменную-объект path, в которой укажем пути к папке js со всеми модулями приложения, lib и tpl соответственно, библиотеки и шаблоны для requirejs-text. В require.config указываем базовый url и стандартная для настроек backbone секция shim.
Пути paths кто-то прописывает, кто-то нет, но я предпочитаю настроить их один раз в главном конфиге, чем указывать потом в каждом модуле, думая об относительных путях к файлам-зависимостям.
Секция map тоже наверняка знакома тем, кто пишет на backbone не с помощью underscore, а предпочитает lodash.
И сам старт приложения включает единственную зависимость - представление view/app, пока еще не написанную. Мы создаем новое view и рендерим его. Как это сделать, увидим чуть позже, а пока создадим модель нашего приложения.
Создаем модель приложения
Модели называют сердцем backbone-приложений, и, пожалуй, не зря. Ведь именно они хранят самое важное и интересное с точки зрения программиста - данные. В качестве данных мы иметь в виду заголовок h2 страницы и некое имя пользователя. Впрочем, посмотрим на код. Файл models/app.js
'use strict'; define(['backbone'], function(Backbone) { var AppModel = Backbone.Model.extend({ defaults: { title: 'Webdevkin • Backbone.js + RequireJS', username: 'Webdevkin' } }); // singleton var instance; return function() { if (!instance) { instance = new AppModel(); } return instance }; });
Тоже ничего особенного. Дефолтные значения, никакой логики и синглтон, чтобы подчеркнуть, что эта модель должна существовать в единственном экземпляре.
Переходим к представлению.
Представление view и html-шаблон
Содержимое файла views/app.js
'use strict'; define([ 'lodash', 'backbone', '../models/app', 'text!tpl/app.html' ], function( _, Backbone, AppModel, appTpl ) { var AppView = Backbone.View.extend({ el: '#app', template: _.template(appTpl), model: new AppModel, render: function() { this.$el.html(this.template(this.model.toJSON())); } }); // singleton var instance; return function() { if (!instance) { instance = new AppView(); } return instance }; });
Здесь зависимостей в секции define уже больше. В качестве элемента el мы используем #app, шаблон template получаем из внешнего файла tpl/app.html (вскоре напишем). Обязательно указываем модель, попутно создав ее экземпляр. И функция render просто подставит html-строку в el, получив ее из шаблона с данными модели. Синглтон знаком по предыдущему коду.
Не забудем про файл шаблона tpl/app.html.
<%- title %>
Hello, <%- username %>!
Пишем простое приложение на Backbone.js
![]()
Если Вы читали мои предыдущие статьи из серии интернет-магазин на фронте, то рендер html-кода из шаблонов покажется Вам очень знакомым. Отличие только в том, что в тех статьях мы работали с underscore и хранили шаблоны прямо в основном html-коде страницы. А теперь мы заменили библиотеку на более продвинутую lodash и как трушные программисты поместили шаблон в отдельный файл.
Стили sass
Последнее, что нам осталось сделать, это написать стили с помощью sass. В папке styles создадим папку modules с файлами _common.scss и _page.scss. Вот их содержимое.
// _common.scss body { position: relative; color: #333; font-family: Helvetica, Arial, sans-serif; font-size: 16px; } .wrapper { position: relative; max-width: 1000px; margin: 0 auto; } // _page.scss h2 { font-size: 20px; } p { color: steelblue; padding: 20px 0; }
А в папке styles создадим общий файл main.scss, который собирает все стили в кучу
@import 'modules/common'; @import 'modules/page';
Вы уже можете запустить наше приложение. Если все сделано правильно, веб-сервер настроен, то увидите отрендеренную страничку. Не обращайте внимания, что только что написанные стили не подключились, браузер не нашел файл styles/main.css. Можно создать его вручную, склеив содержимое _common.scss и _page.scss, но предлагаю потерпеть до следующей статьи и возложить это рутинное дело на gulp. В конце концов инструменты сборки для того и нужны, чтобы выполнять за нас подобную работу.
Итоги
Итак, мы написали простое тестовое приложение на Backbone в связке с Require.js. По коду мы пробежались только поверхностно, так как задача наша была не в разборе возможностей библиотеки, а в подготовке приложения, в котором есть много интересных задач для сборки фронтенда.
Если Вы их не увидели, то ничего страшного, в третьей и заключительной части статьи мы преобразуем наше приложение и посмотрим, как много мелких и рутинных задач может сделать за нас gulp даже в таком простом приложении. И что важнее, что приведенная структура позволяет нам расширять функционал сколь угодно, всего один раз настроив сборку фронтенда. Подробности в следующей статье
Все пожелания и вопросы оставляйте в комментариях!
Истории из жизни айти и обсуждение кода.