Pug – это высокоуровневый шаблонизатор, предназначенный для генерации HTML с минимальным синтаксическим шумом. Он использует отступы вместо тегов и закрывающих скобок, обеспечивая лаконичность и читаемость кода. Основное преимущество Pug – возможность встроенного использования JavaScript-выражений внутри шаблона, что делает его мощным инструментом для динамической генерации HTML-контента.
Синтаксис Pug основывается на логической структуре HTML-документа, где каждый уровень вложенности задается отступом. Теги не требуют закрытия, а атрибуты указываются в скобках, разделенных запятыми. Пример: div(class=»container», id=»main»). Контент внутри тега указывается сразу после названия, без использования дополнительных конструкций.
Переменные и условия интегрируются напрямую. Например, конструкция if user позволяет вывести блок только при наличии значения переменной user. Для циклов используется привычная конструкция each item in items. Это открывает возможности динамической генерации списков, таблиц и других элементов интерфейса без дублирования шаблонного кода.
Pug поддерживает миксины – переиспользуемые блоки шаблонов, определяемые один раз и вызываемые по мере необходимости. Это позволяет структурировать проект, избегая повторов и сохраняя единообразие компонентов. Например, mixin button(text) может использоваться в любом месте с разным содержимым, передаваемым как параметр.
Установка Pug и интеграция с Node.js проектом
Инициализируйте проект командой npm init -y
, чтобы создать файл package.json
. Установите Pug как зависимость: npm install pug
.
Создайте директорию views
для хранения шаблонов. По умолчанию Pug ищет файлы с расширением .pug
именно там. Пример структуры проекта: project-root/views/index.pug
.
Для рендеринга используйте Express. Установите его: npm install express
. Затем в index.js
настройте движок:
const express = require('express');
const app = express();
app.set('view engine', 'pug');
app.set('views', './views');
app.get('/', (req, res) => {
res.render('index', { title: 'Главная', message: 'Привет, Pug!' });
});
app.listen(3000);
После запуска node index.js
шаблон index.pug
автоматически компилируется в HTML при обращении к корневому маршруту. Пример содержимого index.pug
:
doctype html
html
head
title= title
body
h1= message
Изменения в Pug-файлах применяются без перезапуска сервера, если используется пакет nodemon
– установите его глобально через npm install -g nodemon
и запускайте сервер командой nodemon index.js
.
Базовые правила синтаксиса Pug на примерах
Pug использует отступы для определения структуры HTML. Один уровень вложенности – два пробела. Закрывающие теги не требуются.
Создание тега без атрибутов:
p Пример параграфа
Атрибуты указываются в круглых скобках после названия тега:
a(href="https://example.com" target="_blank") Ссылка
Классы и идентификаторы задаются краткой записью:
div#main.container Контейнер
Вложенные элементы записываются с отступами:
ul
li Первый пункт
li Второй пункт
| Это обычный текст без тега
Вставка переменных:
p Привет, #{имя}!
Условные конструкции:
if авторизован
p Добро пожаловать!
else
p Войдите в систему
Циклы:
each элемент in список
li= элемент
Комментарии, которые не попадают в итоговый HTML:
// Это комментарий Pug
Как передавать и использовать данные в шаблонах
В Pug данные передаются в шаблоны через объект, передаваемый в метод рендеринга. Например, при использовании Express это выглядит так:
res.render('template', { title: 'Главная', user: { name: 'Иван' } });
Данные становятся доступными внутри шаблона как переменные:
h1= title
p Привет, #{user.name}!
Для эффективной работы с данными в Pug:
- Поддерживается вложенность: доступ к полям осуществляется через точку –
user.name
. - Условные конструкции реализуются через ключевые слова
if
иelse
:if user p Добро пожаловать, #{user.name}! else p Войдите в аккаунт
- Итерации по массивам выполняются через цикл
each
:ul each item in items li= item
- Для доступа к индексу используйте синтаксис
each val, i in arr
. - Доступ к функциям и фильтрация данных возможны напрямую, если передать функцию в объект данных:
res.render('template', { items, format: (x) => x.toUpperCase() });
each item in items li= format(item)
Важно избегать прямой логики бизнес-уровня в шаблоне. Все вычисления, фильтрации и преобразования лучше выполнять заранее и передавать в шаблон уже готовые значения.
Вложенные элементы и управление структурой документа
Pug использует отступы вместо скобок или тегов для определения вложенности. Каждый уровень отступа соответствует уровню вложенности HTML-элемента. Пробелы или табуляция должны быть единообразными по всему файлу – смешение приводит к ошибкам компиляции.
Например, для создания списка внутри блока nav используется следующая структура:
nav ul li: a(href="/") Главная li: a(href="/about") О нас
Каждый дочерний элемент начинается с новой строки и смещается вправо. Элементы, находящиеся на одном уровне отступа, интерпретируются как соседние в HTML-структуре.
Для группировки элементов внутри одного блока без создания дополнительных обёрток применяются пустые контейнеры с символом точка или ():
div.content . // пустой блок h2 Заголовок p Описание
Для управления структурой документа в Pug важно правильно использовать миксины и инклуды. Миксины позволяют повторно использовать вложенные шаблоны:
mixin card(title, text) .card h3= title p= text
Вызов миксина с разными данными создаёт однородную структуру без дублирования кода:
+card('Пример', 'Описание карточки') +card('Вторая карточка', 'Другой текст')
Для организации кода рекомендуется разделять структуру на логические части с помощью include и extends. Это упрощает поддержку и масштабирование проекта:
include components/header.pug include components/footer.pug
Таким образом, управление вложенностью в Pug требует строгой дисциплины в отступах и грамотной декомпозиции компонентов.
Условные конструкции и циклы в шаблонах Pug
Pug поддерживает простые и лаконичные конструкции для условной логики. Для проверки условий используется ключевое слово if
, далее следует выражение. Альтернативные ветки указываются с помощью else if
и else
.
Пример:
if user.isAdmin
p Добро пожаловать, администратор
else if user.isLoggedIn
p Привет, пользователь
else
p Пожалуйста, войдите в систему
Для циклов используется each
. Синтаксис: each элемент in массив
. Можно указывать второй параметр – индекс:
each item, index in items
li= index + ': ' + item
Циклы поддерживают итерацию по объектам. Ключ используется как переменная:
each value, key in object
p= key + ': ' + value
Условные конструкции и циклы можно комбинировать. Например, отображать только элементы, удовлетворяющие условию:
each product in products
if product.inStock
li= product.name
Внутри условий и циклов допускаются любые вложенные конструкции. Использование отступов обязательно для корректной структуры.
Подключение и повторное использование шаблонов через include и extend
В Pug для работы с повторно используемыми частями кода предусмотрены директивы include и extend. Эти директивы позволяют эффективно организовать структуру шаблонов и минимизировать повторяющийся код.
include используется для включения содержимого другого шаблона. Это позволяет инкапсулировать части интерфейса, такие как шапка, подвал, боковые панели и другие компоненты, которые могут быть использованы в нескольких местах. Пример использования:
include header.pug
При таком подходе в шаблоне будет вставлено содержимое файла header.pug. Этот метод полезен, если вам нужно повторно использовать конкретный фрагмент в разных шаблонах без необходимости наследования или сложной структуры.
Для более сложных случаев, когда требуется расширение основного шаблона, используется директива extend. Она позволяет создавать базовые шаблоны, а затем изменять или дополнять их в дочерних файлах. Это идеальный способ для создания системы наследования шаблонов. Пример использования:
extend layout.pug block content h1 Главная страница p Добро пожаловать!
В этом примере файл layout.pug является базовым, и шаблон, использующий директиву extend, добавляет или изменяет блок content. Блоки, определенные в базовом шаблоне с помощью block, могут быть переопределены или дополнены в дочернем файле.
Таким образом, include лучше использовать для подключения статических фрагментов кода, а extend – для создания иерархии шаблонов с возможностью их гибкой настройки и расширения.
Работа с атрибутами и классами в Pug
В Pug работа с атрибутами и классами отличается от стандартного HTML-синтаксиса. В Pug атрибуты и классы задаются напрямую после имени тега или внутри объекта, используя сокращения и явное перечисление значений.
Для задания атрибутов в Pug используется синтаксис через скобки. Внутри скобок указываются пары «ключ-значение». Например:
a(href="https://example.com") Ссылка
Это будет преобразовано в HTML:
Ссылка
Если значение атрибута – это переменная или выражение, используется стандартная JavaScript-синтаксис:
a(href=link) Ссылка
Также, в Pug можно динамически менять атрибуты в зависимости от условий. Например, если атрибут должен быть добавлен только при выполнении какого-то условия:
a(href=link class=active ? 'active' : '') Ссылка
Для добавления классов в Pug можно использовать специальный синтаксис. Если необходимо указать несколько классов, они перечисляются через пробел:
div(class="container main") Контент
Если нужно добавить классы динамически, то можно использовать объектный синтаксис:
div(class={active: isActive, 'text-center': true}) Контент
Здесь классы добавляются в зависимости от значений переменных или выражений. Важно помнить, что значения true/false влияют на присутствие классов, а falsy значения, такие как пустая строка или 0, – на их отсутствие.
Если класс или атрибут должны быть обязательными, можно явно указать их, а затем динамически добавлять или изменять в зависимости от условий. Например:
div(class={active: isActive}) Контент
Этот код добавит класс active, если переменная isActive имеет значение true. Если условие не выполнится, класс не будет добавлен.
Для работы с несколькими атрибутами или условиями добавления классов используйте возможности тернарных операторов и логических выражений. Это позволяет сделать шаблоны более гибкими и удобными для динамических приложений.
Особенности отладки Pug-шаблонов в браузере
Отладка Pug-шаблонов в браузере требует определённых подходов, так как шаблоны компилируются в HTML до того, как отображаются в браузере. В этом процессе важно учитывать несколько особенностей.
- Использование исходных карт (source maps) – одна из ключевых особенностей, которая помогает точно отследить ошибки в Pug-шаблоне, несмотря на то что браузер видит уже скомпилированный HTML. Включив поддержку исходных карт, можно легко отлаживать шаблоны, видя их строки и позиции в исходных файлах, а не только в финальном HTML.
- Включение режима ошибок в Pug позволяет отслеживать синтаксические ошибки непосредственно в браузере. Для этого следует включить флаг для генерации ошибок во время компиляции, что обеспечит более точное указание местоположения ошибок в шаблоне.
- Режим Live-reloading позволяет ускорить процесс отладки. При изменении шаблона Pug, страница автоматически перезагружается, что дает возможность быстро видеть результат изменений в браузере без необходимости вручную обновлять страницу.
- Использование расширений браузеров – например, расширение Pug для Google Chrome предоставляет дополнительные инструменты для разработки и отладки. Оно позволяет просматривать структуру шаблонов и их скомпилированные версии прямо в браузере, что удобно для анализа кода в реальном времени.
- Консоль разработчика – при отладке Pug в браузере полезно часто проверять консоль на наличие ошибок или предупреждений, связанных с скомпилированным HTML или JavaScript. Это поможет быстро выявить несоответствия или неправильную генерацию контента.
Вопрос-ответ:
Что такое шаблонизатор Pug и для чего он используется?
Шаблонизатор Pug (ранее известный как Jade) используется для генерации HTML-разметки из шаблонов с использованием упрощенного синтаксиса. Он позволяет писать более краткий и читаемый код по сравнению с традиционным HTML, устраняя необходимость в повторяющихся тегах и атрибутах. Pug поддерживает использование переменных, циклов и условий, что делает его удобным инструментом для динамической генерации страниц.
В чем отличие синтаксиса Pug от обычного HTML?
Синтаксис Pug отличается от стандартного HTML тем, что в нем нет явных закрывающих тегов, а структура документа основывается на отступах. Это позволяет избежать лишнего кода и сделать его более читаемым. Например, вместо того чтобы писать полный HTML-тег, достаточно указать его название с нужными аттрибутами, а для вложенных элементов используются отступы. Такой подход помогает улучшить поддерживаемость кода и уменьшить вероятность ошибок.
Как в Pug подключаются переменные и данные?
В Pug можно подключать переменные и данные с помощью встроенного механизма вставки значений. Для этого используется синтаксис `$` для отображения значений переменных внутри шаблона. Переменные могут быть переданы в шаблон из JavaScript-кода, и их значения будут автоматически вставляться в соответствующие места. Это позволяет создавать динамические страницы, которые могут адаптироваться в зависимости от входных данных.
Можно ли использовать условия и циклы в шаблонах Pug?
Да, в Pug можно использовать условия и циклы, что делает его мощным инструментом для генерации динамических страниц. Условия записываются с помощью конструкции `if` и `else`, а циклы можно реализовать через `each`, что позволяет перебирать массивы или объекты. Например, с помощью цикла можно генерировать список элементов на основе данных, полученных из базы данных или API.
Что такое шаблонизатор Pug и чем он отличается от обычного HTML?
Шаблонизатор Pug — это инструмент, предназначенный для упрощения написания HTML-кода. В отличие от стандартного HTML, Pug использует свой синтаксис, который позволяет писать код короче и читабельнее. Например, вместо закрывающих тегов Pug использует отступы для определения структуры элементов. Это помогает избежать лишних символов и делает код более лаконичным. Вместо того чтобы писать каждый тег в полной форме, можно использовать сокращенные записи, что экономит время и уменьшает вероятность ошибок при верстке.
Какие особенности синтаксиса Pug нужно учитывать при работе с ним?
Основная особенность синтаксиса Pug — это отсутствие закрывающих тегов. Отступы играют ключевую роль в структурировании документа, и неправильное их использование может привести к ошибкам. Кроме того, Pug позволяет использовать переменные и встроенные конструкции, что делает код гибким и динамичным. Важно помнить, что Pug не поддерживает прямую работу с атрибутами в стандартной форме HTML, например, для добавления атрибутов к тегам используется особый синтаксис с двоеточием. Такой подход требует привычки, но в результате работы с Pug можно достичь большей читабельности и сокращения кода.