Views
Модуль wippy/views предоставляет систему виртуальных страниц и компонентов с рендерингом шаблонов, управлением ресурсами и маппингом переменных окружения. Страницы могут опираться на Jet-шаблоны или внешние компоненты (SPA, микро-фронтенды).
Установка
Заголовок раздела «Установка»Добавьте модуль в проект:
wippy add wippy/viewswippy installОбъявите зависимость:
version: "1.0"namespace: app
entries: - name: dep.views kind: ns.dependency component: wippy/views version: "*" parameters: - name: api_router value: app:api.public - name: env_storage value: app:env.storage| Параметр | Обязательный | По умолчанию | Описание |
|---|---|---|---|
api_router | да | — | HTTP-роутер для API-эндпоинтов представлений |
env_storage | нет | внутреннее | Хранилище переменных окружения, обеспечивающее переменную PUBLIC_API_URL |
Шаблонные страницы
Заголовок раздела «Шаблонные страницы»Шаблонные страницы рендерятся на сервере с помощью Jet-шаблонов:
entries: - name: contact_page kind: template.jet meta: type: view.page name: contact title: Contact Us icon: mail order: 5 group: main group_icon: layout-grid group_order: 1 announced: true secure: false data: set: app.templates:default data_func: app:contact_data resources: - contact_stylesМетаданные страницы
Заголовок раздела «Метаданные страницы»| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
meta.type | string | — | Должно быть view.page |
meta.name | string | имя записи | Идентификатор страницы |
meta.title | string | — | Отображаемый заголовок |
meta.icon | string | — | Идентификатор иконки |
meta.order | number | 9999 | Порядок сортировки в группе |
meta.group | string | — | Категория группы |
meta.group_icon | string | — | Иконка группы |
meta.group_order | number | 9999 | Порядок сортировки группы |
meta.group_placement | string | "default" | Размещение: "default", "sidebar" |
meta.secure | boolean | false | Требует аутентификации |
meta.public | boolean | false | Публично доступна |
meta.announced | boolean | = public | Показывать в навигации |
meta.inline | boolean | false | Скрыта из UI |
meta.content_type | string | text/html | MIME-тип ответа |
meta.parent | string | — | ID родительской страницы |
Данные шаблона
Заголовок раздела «Данные шаблона»| Поле | Описание |
|---|---|
data.set | ID набора шаблонов в реестре |
data.data_func | ID функции, возвращающей данные страницы |
data.resources | Массив ID ресурсов в реестре |
data_func получает { params, query } и возвращает таблицу, которая становится контекстом data в шаблоне.
Конвейер рендеринга
Заголовок раздела «Конвейер рендеринга»- Загрузить страницу из реестра
- Проверить доступ (security)
- Вызвать
data_func, если определена - Собрать ресурсы: глобальные + ресурсы набора шаблонов + ресурсы страницы
- Загрузить переменные окружения
- Отрендерить Jet-шаблон с контекстом:
{ data, resources, query_params, route_params, env }
Компонентные страницы
Заголовок раздела «Компонентные страницы»Компонентные страницы указывают на внешние приложения (SPA, микро-фронтенды):
entries: - name: dashboard kind: registry.entry meta: type: view.page name: dashboard title: Dashboard icon: chart-bar url: https://cdn.example.com/dashboard/ secure: true announced: true data: proxy: enabled: true css: prime_vue: true theme_config: true tailwind_config: trueAPI возвращает дескриптор компонента с базовым URL и конфигурацией прокси. Фронтенд рендерит компонент в iframe или inline.
Поля компонента
Заголовок раздела «Поля компонента»| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
meta.url | string | — | Публичный URL компонента |
meta.entry_point | string | index.html (страницы), index.js (компоненты) | Файл точки входа |
Конфигурация прокси
Заголовок раздела «Конфигурация прокси»Прокси контролирует, какие CSS и поведение внедряются в компонент:
| Опция | По умолчанию | Описание |
|---|---|---|
proxy.enabled | true | Включить обёртку прокси |
proxy.css.fonts | true | Внедрять стили шрифтов |
proxy.css.theme_config | true | Внедрять переменные темы |
proxy.css.iframe | true | Стили, специфичные для iframe |
proxy.css.prime_vue | false | Стили компонентов PrimeVue |
proxy.css.markdown | false | Стили рендеринга Markdown |
proxy.css.custom_css | false | Пользовательский CSS |
proxy.css.custom_variables | false | Пользовательские CSS-переменные |
proxy.tailwind_config | false | Внедрять конфигурацию Tailwind |
proxy.resize_observer | true | Авторесайз iframe |
proxy.prevent_link_clicks | true | Перехватывать навигацию по ссылкам |
proxy.iconify_icons | false | Загружать набор иконок Iconify |
View-компоненты
Заголовок раздела «View-компоненты»Самостоятельные компоненты, не являющиеся страницами (без записи в навигации):
entries: - name: widget kind: registry.entry meta: type: view.component name: chat-widget title: Chat Widget url: https://cdn.example.com/chat-widget/ data: proxy: enabled: trueКомпоненты используют meta.type: view.component вместо view.page. По умолчанию точкой входа является index.js.
Ресурсы
Заголовок раздела «Ресурсы»Ресурсы — это файлы CSS, JS и шрифтов, связанные со страницами:
entries: - name: global_styles kind: registry.entry meta: type: view.resource name: Global Styles resource_type: style global: true order: 1 url: https://cdn.example.com/global.css
- name: app_script kind: registry.entry meta: type: view.resource name: App Script resource_type: script template_set: app.templates:default order: 10 url: https://cdn.example.com/app.js defer: trueПоля ресурса
Заголовок раздела «Поля ресурса»| Поле | Тип | Описание |
|---|---|---|
meta.type | string | Должно быть view.resource |
meta.resource_type | string | Произвольное (по умолчанию "other"); распространённые значения — "style", "script", "font" |
meta.order | number | Порядок сортировки внутри типа |
meta.global | boolean | Применяется ко всем страницам |
meta.template_set | string | Специфичен для набора шаблонов |
meta.url | string | URL ресурса |
meta.integrity | string | SRI-хеш |
meta.crossorigin | string | "anonymous" или "use-credentials" |
meta.media | string | CSS media query |
meta.defer | boolean | Отложенная загрузка скрипта |
meta.async | boolean | Асинхронная загрузка скрипта |
Сбор ресурсов
Заголовок раздела «Сбор ресурсов»Ресурсы собираются в три слоя, объединяемых по порядку:
- Глобальные ресурсы —
global: true, применяются ко всем страницам - Ресурсы набора шаблонов — сопоставляются по ID
template_set - Ресурсы страницы — перечислены в массиве
data.resources
Внутри каждого слоя ресурсы группируются по resource_type и сортируются по order.
Маппинг переменных окружения
Заголовок раздела «Маппинг переменных окружения»Загрузчик env сопоставляет переменные окружения с ключами контекста шаблона через систему приоритетов.
Определение маппингов
Заголовок раздела «Определение маппингов»entries: - name: app_env kind: registry.entry meta: type: view.env_mapping priority: 20 data: mappings: api_endpoint: API_BASE_URL app_title: APP_NAME debug_mode: DEBUG_ENABLEDКаждая запись маппинга связывает ключи контекста (используются в шаблонах как env.api_endpoint) с именами переменных окружения.
Система приоритетов
Заголовок раздела «Система приоритетов»| Диапазон | Категория | Описание |
|---|---|---|
| 0–9 | Значения по умолчанию фреймворка | Встроенные маппинги фреймворка |
| 10–19 | Системные переопределения | Конфигурация системного уровня |
| 20–29 | Прикладные маппинги | Маппинги, специфичные для приложения |
| 30–100 | Переопределения окружения | Runtime-переопределения |
Более высокий приоритет побеждает, если несколько маппингов определяют один и тот же ключ контекста.
Использование в шаблонах
Заголовок раздела «Использование в шаблонах»Разрешённые значения окружения доступны в объекте контекста env:
<script> window.API_URL = "{{ env.api_endpoint }}"; document.title = "{{ env.app_title }}";</script>HTTP API эндпоинты
Заголовок раздела «HTTP API эндпоинты»Модуль views регистрирует следующие эндпоинты на настроенном роутере:
| Метод | Путь | Описание |
|---|---|---|
| GET | /pages/list | Список доступных, объявленных страниц |
| GET | /components/list | Список view-компонентов |
| GET | /pages/content/{id} | Отрендерить страницу или вернуть дескриптор компонента |
| GET | /pages/public/{id} | Получить базовый URL компонента |
Ответ рендеринга
Заголовок раздела «Ответ рендеринга»Для шаблонных страниц возвращается отрендеренный HTML с content_type страницы.
Для компонентных страниц возвращается дескриптор:
{ "name": "dashboard", "version": "1.0.0", "specification": "wippy-component-1.0", "title": "Dashboard", "baseUrl": "https://cdn.example.com/dashboard/", "wippy": { "type": "page", "path": "index.html", "proxy": { "enabled": true, "injections": { "css": { "fonts": true, "themeConfig": true, "iframe": true }, "tailwindConfig": false, "resizeObserver": true, "preventLinkClicks": true } } }}Контроль доступа
Заголовок раздела «Контроль доступа»Страницы с secure: true требуют аутентификации. Реестр страниц проверяет security.can("view", "page:<page_id>") относительно текущего актора и области.
Незащищённые страницы всегда доступны. Флаг announced контролирует видимость в списках навигации, не влияя на доступ.
Квалификация ID
Заголовок раздела «Квалификация ID»Относительные ID в определениях страниц квалифицируются пространством имён записи:
# В пространстве имён "app"data: data_func: my_data_func # разрешается в app:my_data_func set: templates:default # остаётся как templates:default (уже квалифицирован) resources: - page_styles # разрешается в app:page_stylesСм. также
Заголовок раздела «См. также»- Facade — Iframe-фасад фронтенда и боковая панель навигации
- Template — Движок Jet-шаблонов
- Security — Акторы безопасности и контроль доступа
- Environment — Хранение переменных окружения
- Обзор фреймворка — Использование модулей фреймворка