Перейти к содержимому

Views

Модуль wippy/views предоставляет систему виртуальных страниц и компонентов с рендерингом шаблонов, управлением ресурсами и маппингом переменных окружения. Страницы могут опираться на Jet-шаблоны или внешние компоненты (SPA, микро-фронтенды).

Добавьте модуль в проект:

Окно терминала
wippy add wippy/views
wippy 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.typestringДолжно быть view.page
meta.namestringимя записиИдентификатор страницы
meta.titlestringОтображаемый заголовок
meta.iconstringИдентификатор иконки
meta.ordernumber9999Порядок сортировки в группе
meta.groupstringКатегория группы
meta.group_iconstringИконка группы
meta.group_ordernumber9999Порядок сортировки группы
meta.group_placementstring"default"Размещение: "default", "sidebar"
meta.securebooleanfalseТребует аутентификации
meta.publicbooleanfalseПублично доступна
meta.announcedboolean= publicПоказывать в навигации
meta.inlinebooleanfalseСкрыта из UI
meta.content_typestringtext/htmlMIME-тип ответа
meta.parentstringID родительской страницы
ПолеОписание
data.setID набора шаблонов в реестре
data.data_funcID функции, возвращающей данные страницы
data.resourcesМассив ID ресурсов в реестре

data_func получает { params, query } и возвращает таблицу, которая становится контекстом data в шаблоне.

  1. Загрузить страницу из реестра
  2. Проверить доступ (security)
  3. Вызвать data_func, если определена
  4. Собрать ресурсы: глобальные + ресурсы набора шаблонов + ресурсы страницы
  5. Загрузить переменные окружения
  6. Отрендерить 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: true

API возвращает дескриптор компонента с базовым URL и конфигурацией прокси. Фронтенд рендерит компонент в iframe или inline.

ПолеТипПо умолчаниюОписание
meta.urlstringПубличный URL компонента
meta.entry_pointstringindex.html (страницы), index.js (компоненты)Файл точки входа

Прокси контролирует, какие CSS и поведение внедряются в компонент:

ОпцияПо умолчаниюОписание
proxy.enabledtrueВключить обёртку прокси
proxy.css.fontstrueВнедрять стили шрифтов
proxy.css.theme_configtrueВнедрять переменные темы
proxy.css.iframetrueСтили, специфичные для iframe
proxy.css.prime_vuefalseСтили компонентов PrimeVue
proxy.css.markdownfalseСтили рендеринга Markdown
proxy.css.custom_cssfalseПользовательский CSS
proxy.css.custom_variablesfalseПользовательские CSS-переменные
proxy.tailwind_configfalseВнедрять конфигурацию Tailwind
proxy.resize_observertrueАвторесайз iframe
proxy.prevent_link_clickstrueПерехватывать навигацию по ссылкам
proxy.iconify_iconsfalseЗагружать набор иконок Iconify

Самостоятельные компоненты, не являющиеся страницами (без записи в навигации):

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.typestringДолжно быть view.resource
meta.resource_typestringПроизвольное (по умолчанию "other"); распространённые значения — "style", "script", "font"
meta.ordernumberПорядок сортировки внутри типа
meta.globalbooleanПрименяется ко всем страницам
meta.template_setstringСпецифичен для набора шаблонов
meta.urlstringURL ресурса
meta.integritystringSRI-хеш
meta.crossoriginstring"anonymous" или "use-credentials"
meta.mediastringCSS media query
meta.deferbooleanОтложенная загрузка скрипта
meta.asyncbooleanАсинхронная загрузка скрипта

Ресурсы собираются в три слоя, объединяемых по порядку:

  1. Глобальные ресурсыglobal: true, применяются ко всем страницам
  2. Ресурсы набора шаблонов — сопоставляются по ID template_set
  3. Ресурсы страницы — перечислены в массиве 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>

Модуль 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 в определениях страниц квалифицируются пространством имён записи:

# В пространстве имён "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 — Хранение переменных окружения
  • Обзор фреймворка — Использование модулей фреймворка