Шаблонизаторы¶
В Node.js для генерации и отдачи HTML-страниц используются шаблонизаторы. Node.js шаблонизатор представляет собой специальный модуль, использующий более удобный синтаксис для формирования HTML на основе динамических данных и позволяющий разделять представление от контроллера.
Настройка Node.js шаблонизатора осуществляется заданием двух параметров:
views- путь к директории, в которой находятся шаблоны;view engine- указание самого шаблонизатора.
Для задания этих параметров используется метод Express set().
1 2 | |
Шаблонизаторов очень много, но наибольшее распространение получили Handlebars и Pug.
Handlebars¶
Начнем с установки Node.js handlebars.
1 | |
И сразу рассмотрим пример.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
views/home.handlebars
1 | |
views/layouts/main.handlebars
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
С помощью метода engine() задается настройка Node.js handlebars, конкретно в примере указывается шаблон по умолчанию, в который будут подгружаться шаблоны страниц.
Генерация и отдача представления осуществляется с помощью метода render(), который принимает два параметра:
- шаблон;
- данные для шаблона в виде объекта (если необходимо).
Если директория с шаблонами не задана явно, то поиск представлений по умолчанию будет осуществляться в директории views, а макеты - в views/layouts.
Шаблоны Node.js handlebars представляют собой обычные файлы HTML в формате handlebars, в которых с помощью специального синтаксиса выводятся передаваемые данные. Для отображения значения свойства переданного объекта используется запись {{{(название свойства)}}}.
В макете /views/layouts/main.handlebars запись {{{body}}} определяет место, куда при запросе определенной страницы будет вставлено соответствующее ей представление.
Чтобы сгенерировать представление без макета, в объекте, передаваемом функции render() укажите свойство layout со значением false. Если хотите использовать макет, отличный от макета по умолчанию, просто укажите его имя. Помните, что макеты должны находиться в директории layouts директории с представлениями.
1 2 3 4 5 6 | |
Node.js handlebars гибкий шаблонизатор с обширным функционалом.
Кэширование¶
В handlebars предусмотрен механизм кэширования представлений в режиме production. Шаблонизатор самостоятельно следит за режимом запуска приложения и управляет кэшированием. Но для этого сперва необходимо активировать кэширование с помощью Express.
1 | |
Условия¶
В представлениях Node.js handlebars предусмотрен механизм отображения той или иной части шаблона в зависимости от определенного условия.
1 2 3 4 5 6 | |
1 2 3 4 5 | |
Циклы¶
Для вывода данных переданного массива в Node.js шаблонизаторе handlebars предусмотрена конструкция, аналогичная работе обычного цикла.
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 | |
Частичные представления¶
Для переиспользования повторяющейся части шаблона без ее дублирования при каждом использовании имеются частичные представления.
partials/advantages.handlebars
1 2 3 4 5 | |
home.handlebars
1 2 3 4 5 | |
Вспомогательные функции¶
Под вспомогательными функциями в Node.js handlebars подразумеваются функции, которые могут быть вызваны прямо в представлении для обработки отображаемых данных. Такие функции могут быть определены глобально для всех шаблонов или только для одного конкретного и задаются в свойстве helpers.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 | |
Вспомогательные функции, определенные локально в методе render() конкретного запроса, могут использоваться только в шаблоне, обрабатываемом этим запросом.
Если имя локально определенной вспомогательной функции совпадает с глобальной, то в представлении, где описана локальная, будет использоваться локальная.
Pug¶
Еще один популярный Node.js шаблонизатор - Pug. Сразу установим его.
1 | |
И сразу пример с Node.js Pug в качестве шаблонизатора.
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
views/main.pug
1 2 3 4 5 6 | |
В Node.js Pug представления имеют расширение .pug и подобно шаблонизатору Handlebars генерируются с помощью метода объекта ответа render(), принимающего первым параметром имя шаблона, а вторым - данные для этого шаблона в виде объекта.
Шаблонизатор использует крайне необычный подход к построению представления. Каждая строка в файле полностью описывает одни HTML-элемента. Сначала идет имя тега, затем через пробел - его значение. Для использования в значении тега (или его атрибута) внешних данных, применяется механизм интерполяции. Так, свойство переданного объекта, значение которого необходимо использовать, заключается в #{ и }.
1 | |
Если HTML-тег не указан, то по умолчанию будет использоваться div.
Атрибуты HTML-элементов задаются в следующем формате.
1 | |
Вложенность тегов HTML в Node.js Pug шаблоне реализуется через отступ табуляции относительно родителя, причем эта вложенность соблюдается в файле и визуально. Для компиляции HTML-кода в одну строку без соблюдения визуальной иерархии используйте следующую запись.
1 2 3 | |
Гибкость работы с Node.js Pug обеспечивается рядом специальных инструментов и конструкций.
Переменные¶
Внутри самого представления возможно определение переменных, которые могут использоваться только в пределах текущего шаблона.
1 2 3 4 5 6 7 8 | |
Условия Pug¶
Node.js шаблонизатор Pug для реализации условий использует конструкции, аналогичные JavaScript операторам if и switch.
Пример с if.
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 | |
Пример со switch.
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Циклы Pug¶
Отображение массива данных или вывод какой-либо части шаблона заданное количество раз осуществляется с помощью конструкций each и while.
1 2 3 4 5 6 7 8 | |
Переиспользование шаблонов¶
Для переиспользования представления в Node.js Pug имеется оператор include, в указанное место вставляет содержимое файла заданного шаблона.
views/index.pug
1 2 3 4 5 6 | |
views/includes/_list.pug
1 2 3 | |
Если указанного файла не существует, то в HTML-документ значение оператора include будет вставлено обычной строкой.
Наследование¶
Node js Pug реализует принцип наследования для шаблонов, за которое отвечают операторы block и extends. С помощью block в представлении описывается какая-либо его часть, которая может быть заменена при наследовании (через extends) шаблона другим шаблоном. В родительском представлении блок может иметь значение по умолчанию, но если дочернее представление имеет собственную реализацию, то будет использоваться она.
app.js
1 2 3 | |
views/index.pug
1 2 3 4 5 6 7 8 9 10 11 12 | |
views/home.pug
1 2 3 4 5 6 7 8 9 10 | |
Также Node.js Pug позволяет “расширять” значение по умолчанию, а не заменять его. Для этого имеются операторы append и prepend, которые добавляют указанное содержимое после или до значения, заданного по умолчанию.
1 2 3 4 5 6 7 | |
Миксины¶
Миксины представляют собой подобие функций, которые могут быть использованы для создания переиспользуемых частей представления. Как и обычные функции, они могут принимать параметры.
views/mixins/_button.pug
1 2 | |
views/index.pug
1 2 3 4 5 6 7 8 | |