Views
El módulo wippy/views proporciona un sistema de páginas y componentes virtuales con renderizado de plantillas, gestión de recursos y mapeo de variables de entorno. Las páginas pueden estar respaldadas por plantillas Jet o componentes externos (SPAs, micro-frontends).
Configuración
Sección titulada «Configuración»Agregue el módulo a su proyecto:
wippy add wippy/viewswippy installDeclare la dependencia:
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| Parámetro | Requerido | Predeterminado | Descripción |
|---|---|---|---|
api_router | sí | — | Router HTTP para los endpoints de API de las views |
env_storage | no | interno | Almacenamiento de entorno que provee la variable PUBLIC_API_URL |
Páginas de Plantilla
Sección titulada «Páginas de Plantilla»Las páginas de plantilla se renderizan en el lado del servidor usando plantillas 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_stylesMetadatos de Página
Sección titulada «Metadatos de Página»| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
meta.type | string | — | Debe ser view.page |
meta.name | string | nombre de la entrada | Identificador de la página |
meta.title | string | — | Título de visualización |
meta.icon | string | — | Identificador del icono |
meta.order | number | 9999 | Orden dentro del grupo |
meta.group | string | — | Categoría del grupo |
meta.group_icon | string | — | Icono del grupo |
meta.group_order | number | 9999 | Orden del grupo |
meta.group_placement | string | "default" | Ubicación: "default", "sidebar" |
meta.secure | boolean | false | Requiere autenticación |
meta.public | boolean | false | Accesible públicamente |
meta.announced | boolean | = public | Mostrar en navegación |
meta.inline | boolean | false | Oculto de la UI |
meta.content_type | string | text/html | Tipo MIME de la respuesta |
meta.parent | string | — | ID de la página padre |
Datos de Plantilla
Sección titulada «Datos de Plantilla»| Campo | Descripción |
|---|---|
data.set | ID del registro del conjunto de plantillas |
data.data_func | ID de la función que retorna los datos de la página |
data.resources | Array de IDs del registro de recursos |
La función data_func recibe { params, query } y retorna una tabla que se convierte en el contexto data en la plantilla.
Pipeline de Renderizado
Sección titulada «Pipeline de Renderizado»- Cargar la página desde el registro
- Verificar acceso (seguridad)
- Llamar a
data_funcsi está definido - Recolectar recursos: globales + recursos del conjunto de plantillas + recursos específicos de la página
- Cargar variables de entorno
- Renderizar plantilla Jet con contexto:
{ data, resources, query_params, route_params, env }
Páginas de Componente
Sección titulada «Páginas de Componente»Las páginas de componente apuntan a aplicaciones externas (SPAs, micro-frontends):
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: trueLa API retorna un descriptor de componente con la URL base y la configuración del proxy. El frontend renderiza el componente en un iframe o en línea.
Campos de Componente
Sección titulada «Campos de Componente»| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
meta.url | string | — | URL pública del componente |
meta.entry_point | string | index.html (páginas), index.js (componentes) | Archivo de entrada |
Configuración del Proxy
Sección titulada «Configuración del Proxy»El proxy controla qué CSS y comportamiento se inyecta en el componente:
| Opción | Predeterminado | Descripción |
|---|---|---|
proxy.enabled | true | Habilitar el wrapper del proxy |
proxy.css.fonts | true | Inyectar estilos de fuente |
proxy.css.theme_config | true | Inyectar variables de tema |
proxy.css.iframe | true | Estilos específicos de iframe |
proxy.css.prime_vue | false | Estilos de componentes PrimeVue |
proxy.css.markdown | false | Estilos de renderizado Markdown |
proxy.css.custom_css | false | CSS personalizado |
proxy.css.custom_variables | false | Variables CSS personalizadas |
proxy.tailwind_config | false | Inyectar configuración de Tailwind |
proxy.resize_observer | true | Auto-redimensionar iframe |
proxy.prevent_link_clicks | true | Interceptar navegación de enlaces |
proxy.iconify_icons | false | Cargar conjunto de iconos Iconify |
Componentes de Vista
Sección titulada «Componentes de Vista»Componentes independientes que no son páginas (sin entrada de navegación):
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: trueLos componentes usan meta.type: view.component en lugar de view.page. Por defecto usan index.js como punto de entrada.
Recursos
Sección titulada «Recursos»Los recursos son archivos CSS, JS y de fuentes asociados con las páginas:
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: trueCampos de Recurso
Sección titulada «Campos de Recurso»| Campo | Tipo | Descripción |
|---|---|---|
meta.type | string | Debe ser view.resource |
meta.resource_type | string | De eleccion libre (por defecto "other"); valores comunes son "style", "script", "font" |
meta.order | number | Orden dentro del tipo |
meta.global | boolean | Aplicado a todas las páginas |
meta.template_set | string | Específico a un conjunto de plantillas |
meta.url | string | URL del recurso |
meta.integrity | string | Hash SRI |
meta.crossorigin | string | "anonymous" o "use-credentials" |
meta.media | string | Media query CSS |
meta.defer | boolean | Carga diferida del script |
meta.async | boolean | Carga asíncrona del script |
Recolección de Recursos
Sección titulada «Recolección de Recursos»Los recursos se recolectan en tres capas, fusionados en orden:
- Recursos globales —
global: true, aplicados a todas las páginas - Recursos del conjunto de plantillas — coincidentes por ID de
template_set - Recursos de página — listados en el array
data.resources
Dentro de cada capa, los recursos se agrupan por resource_type y se ordenan por order.
Mapeo de Variables de Entorno
Sección titulada «Mapeo de Variables de Entorno»El cargador de entorno mapea variables de entorno a claves del contexto de plantilla mediante un sistema basado en prioridad.
Definición de Mapeos
Sección titulada «Definición de Mapeos»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_ENABLEDCada entrada de mapeo asocia claves de contexto (usadas en plantillas como env.api_endpoint) con nombres de variables de entorno.
Sistema de Prioridad
Sección titulada «Sistema de Prioridad»| Rango | Categoría | Descripción |
|---|---|---|
| 0–9 | Predeterminados del framework | Mapeos integrados del framework |
| 10–19 | Anulaciones del sistema | Configuración a nivel de sistema |
| 20–29 | Mapeos de aplicación | Mapeos específicos de la aplicación |
| 30–100 | Anulaciones de entorno | Anulaciones en tiempo de ejecución |
Mayor prioridad gana cuando múltiples mapeos definen la misma clave de contexto.
Uso en Plantillas
Sección titulada «Uso en Plantillas»Los valores de entorno resueltos están disponibles en el objeto de contexto env:
<script> window.API_URL = "{{ env.api_endpoint }}"; document.title = "{{ env.app_title }}";</script>Endpoints de la API HTTP
Sección titulada «Endpoints de la API HTTP»El módulo views registra estos endpoints en el router configurado:
| Método | Ruta | Descripción |
|---|---|---|
| GET | /pages/list | Listar páginas accesibles y anunciadas |
| GET | /components/list | Listar componentes de vista |
| GET | /pages/content/{id} | Renderizar página o retornar descriptor de componente |
| GET | /pages/public/{id} | Obtener URL base del componente |
Respuesta de Renderizado
Sección titulada «Respuesta de Renderizado»Para páginas de plantilla, retorna HTML renderizado con el content_type de la página.
Para páginas de componente, retorna un descriptor:
{ "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 } } }}Control de Acceso
Sección titulada «Control de Acceso»Las páginas con secure: true requieren autenticación. El registro de páginas verifica security.can("view", "page:<page_id>") contra el actor y el ámbito actuales.
Las páginas no seguras siempre son accesibles. La bandera announced controla la visibilidad en los listados de navegación sin afectar el acceso.
Calificación de IDs
Sección titulada «Calificación de IDs»Los IDs relativos en las definiciones de página se califican con el namespace de la entrada:
# En el namespace "app"data: data_func: my_data_func # se resuelve a app:my_data_func set: templates:default # permanece como templates:default (ya calificado) resources: - page_styles # se resuelve a app:page_stylesVéase También
Sección titulada «Véase También»- Facade - Facade de iframe del frontend y barra lateral de navegación
- Template - Motor de plantillas Jet
- Security - Actores de seguridad y control de acceso
- Environment - Almacenamiento de variables de entorno
- Resumen del Framework - Uso del módulo del framework