Шаблонизаторы¶
В 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 |
|