Для Zig представили zt — типобезопасные HTML-шаблоны с проверкой при сборке
Библиотека zt преобразует HTML-шаблоны в код Zig при сборке, чтобы проверять типы и параметры компилятором. Динамические значения экранируются по умолчанию, но проект пока не зрелый.
В материале, опубликованном 12 октября 2026 года, разработчик zio и Dusty рассказал о zt — библиотеке HTML-шаблонов для Zig. Как пишет автор в «Type-safe HTML templating in Zig», шаблоны преобразуются в код Zig во время zig build: параметры проверяет компилятор, а динамические значения по умолчанию экранируются. Библиотекой уже пользуются несколько человек, но сам автор пока не считает проект зрелым.
Как устроены шаблоны zt
Шаблон в zt похож на HTML со вставками Zig, а не на набор вызовов для сборки разметки. В нём можно объявить параметры с типами, подключить модель из кода приложения, вывести её поля и использовать обычные if, for и switch. Например, страница может принимать необязательного пользователя и показывать разные блоки для вошедшего посетителя и гостя.
При сборке zt разбирает шаблон и создаёт Zig-код. Приложение может импортировать готовый шаблон и вызвать его рендеринг, а шаблон — импортировать типы приложения. Поэтому ошибка в имени поля или неподходящий тип аргумента обнаруживаются при компиляции, а не после открытия страницы. Сообщение компилятора указывает на сгенерированный код; комментарии в нём помогают найти соответствующее место в исходном шаблоне.
Результат рендеринга записывается напрямую в std.Io.Writer. Его можно отправлять в сокет либо собирать в буфере; промежуточное представление HTML для этого не нужно. В Dusty вызов рендеринга HTML-ответа дополнительно скрывает детали работы с writer. Автор отдельно предупреждает, что приведённый им простой пример записи в стандартный вывод не во всех ситуациях корректно обрабатывает ошибки, связанные с отменой операций std.Io.
Для повторяющейся разметки предусмотрены компоненты, которые можно передавать как значения. Макеты могут оборачивать вложенные шаблоны через @children — это способ собрать общую структуру страницы без отдельного механизма наследования шаблонов. Так код страницы остаётся рядом с привычной HTML-разметкой, но его входные данные не превращаются в неявные переменные.
Безопасность и открытые вопросы
Динамические значения экранируются по умолчанию и в тексте, и в атрибутах. Для URL-атрибутов, включая href и src, предусмотрена проверка опасных схем. Вывод HTML без экранирования возможен, но его нужно явно обозначить записью {!value}. Кроме того, парсер требует закрывать элементы, чтобы шаблон не содержал незавершённой разметки.
Экранирование и проверка URL-схем помогают избежать распространённых причин XSS, хотя не дают защиты от всех возможных ошибок. Требование закрывать элементы решает другую задачу: помогает не получить некорректную разметку. Возможность вставить сырой HTML при этом остаётся — использовать её или нет, решает разработчик.
Одна часть синтаксиса ещё обсуждается. Если строка начинается с if, for или switch, парсер воспринимает её как код. Из-за этого обычный текст, начинающийся с такого слова, может дать ошибку разбора: его придётся поместить внутрь элемента или оформить как строковое выражение. Автор рассматривает вариант с явными @if, @for и @switch, но окончательное решение в материале не названо. Сроков выхода более зрелой версии он тоже не указывает.
Что это значит для веб-проектов
Для разработчика, который уже строит серверную часть на Zig, zt закрывает практическую задачу: как отдавать HTML, не собирая его конкатенацией строк и не теряя проверку типов. Автор показывает применение в Dusty и упоминает TODO-приложение с htmx, где вместе работают шаблоны и другие части его веб-стека.
Владельцу сайта или маркетологу из этого не следует, что проект нужно переводить на Zig. Польза здесь более узкая: если команда уже выбрала такой стек, ошибки в данных шаблона можно ловить при сборке, а экранирование не нужно добавлять вручную для каждого значения. Одновременно стоит учитывать молодость библиотеки и открытый вопрос с синтаксисом, прежде чем опираться на неё в большом наборе страниц.
Моё мнение
Мне нравится направление: вместо ещё одного слоя между данными и страницей zt использует компилятор Zig и пишет результат прямо в writer. Особенно ценна связка типизированных параметров с экранированием по умолчанию. Но я бы оценивала инструмент на конкретной задаче и проверяла, насколько удобно поддерживать шаблоны после генерации кода, особенно когда приходится разбирать ошибки компиляции.
Для обычного лендинга я бы не выбирала новый стек ради одного только шаблонизатора: серверный рендеринг или статика часто проще в сопровождении. А вот команде, которая уже пишет веб-приложение на Zig, за zt интересно следить. Здесь решается реальная задача — получать HTML без ручной сборки строк, — хотя проект пока оставляет вопросы открытыми.
Источники
Откуда новость. Текст — пересказ своими словами, факты — из источника, мнение — автора.
- Type-safe HTML templating in Zig lalinsky.com
фулстек-разработчица
Я проектирую веб-сервисы и магазины, а свободное время трачу на эксперименты с очередями, кэшем и сборкой. Люблю, когда инструмент решает реальную задачу, а не добавляет ещё один слой абстракции.
Все публикации автораПохожие статьи
В Chrome 157 вышел HTML-in-Canvas для интерактивного DOM внутри графических сцен
В стабильной версии Chrome 157 появился HTML-in-Canvas. API позволяет встраивать интерактивный HTML в графические сцены, сохраняя доступность текста, форм и других DOM-элементов.
Представлен Proa — Rust-фреймворк с серверным рендерингом и выводом в разные форматы
На Hacker News представили Proa — веб-фреймворк на Rust для серверного рендеринга и вывода компонентов в HTML и Markdown. Авторы предлагают проверить его на одном маршруте действующего проекта.
Bez генерирует браузерный движок по веб-спецификациям и тестам
Bez создаёт браузерный движок по веб-спецификациям, сверяя результат с Chromium, Firefox и WebKit. Проект пока на ранней стадии, а опубликованные показатели не означают готовность движка.
Обсуждение 4
Халина Урсу
Для дизайн-системы тут важна не только проверка типов, но и то, насколько шаблон оставляет предсказуемый контроль над HTML-структурой: компилятор не поймает неудачную семантику или недоступный интерфейс
Лео Вагнер
@halyna.ursu, ещё полезно прогонять шаблоны через скринридер и проверку клавиатурной навигации: типы в zt не заменят такие тесты, зато HTML-каркас можно заранее зафиксировать в общих компонентах 🙂
Ернур Холматов
@leo.codes, на учебной странице с формой я как-то проверял только что поля типизируются, а табом до кнопки отправки добраться забыл — компилятор, конечно, промолчал
Ярванд Саркис
@yernur.khol, а ты потом добавил проверку клавиатурой в свой чек-лист перед сборкой? 🙂