콘텐츠로 이동

Views

wippy/views 모듈은 템플릿 렌더링, 리소스 관리, 환경 변수 매핑이 포함된 가상 페이지 및 컴포넌트 시스템을 제공합니다. 페이지는 Jet 템플릿 또는 외부 컴포넌트(SPA, 마이크로 프론트엔드)로 백킹될 수 있습니다.

프로젝트에 모듈 추가:

Terminal window
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뷰 API 엔드포인트의 HTTP 라우터
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.typestringview.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.inlinebooleanfalseUI에서 숨김
meta.content_typestringtext/html응답 MIME 타입
meta.parentstring상위 페이지 ID
필드설명
data.set템플릿 세트 레지스트리 ID
data.data_func페이지 데이터를 반환하는 함수 ID
data.resources리소스 레지스트리 ID 배열

data_func{ params, query }를 받고 템플릿에서 data 컨텍스트가 되는 테이블을 반환합니다.

  1. 레지스트리에서 페이지 로드
  2. 접근 확인 (보안)
  3. 정의된 경우 data_func 호출
  4. 리소스 수집: 전역 + 템플릿 세트 리소스 + 페이지별 리소스
  5. 환경 변수 로드
  6. 컨텍스트 { data, resources, query_params, route_params, env }로 Jet 템플릿 렌더링

컴포넌트 페이지는 외부 애플리케이션(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 또는 인라인으로 렌더링합니다.

필드타입기본값설명
meta.urlstring컴포넌트의 공개 URL
meta.entry_pointstringindex.html (페이지), index.js (컴포넌트)진입 파일

프록시는 컴포넌트에 주입되는 CSS와 동작을 제어합니다:

옵션기본값설명
proxy.enabledtrue프록시 래퍼 활성화
proxy.css.fontstrue폰트 스타일 주입
proxy.css.theme_configtrue테마 변수 주입
proxy.css.iframetrueiframe 전용 스타일
proxy.css.prime_vuefalsePrimeVue 컴포넌트 스타일
proxy.css.markdownfalse마크다운 렌더링 스타일
proxy.css.custom_cssfalse커스텀 CSS
proxy.css.custom_variablesfalse커스텀 CSS 변수
proxy.tailwind_configfalseTailwind 설정 주입
proxy.resize_observertrueiframe 자동 크기 조정
proxy.prevent_link_clickstrue링크 내비게이션 가로채기
proxy.iconify_iconsfalseIconify 아이콘 세트 로드

페이지가 아닌 독립 실행형 컴포넌트(내비게이션 엔트리 없음):

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

컴포넌트는 view.page 대신 meta.type: view.component를 사용합니다. 진입점은 기본적으로 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.typestringview.resource이어야 함
meta.resource_typestring자유롭게 지정 가능(기본값 "other"); 일반적인 값은 "style", "script", "font"
meta.ordernumber타입 내 정렬 순서
meta.globalboolean모든 페이지에 적용
meta.template_setstring특정 템플릿 세트 전용
meta.urlstring리소스 URL
meta.integritystringSRI 해시
meta.crossoriginstring"anonymous" 또는 "use-credentials"
meta.mediastringCSS 미디어 쿼리
meta.deferboolean지연 스크립트 로딩
meta.asyncboolean비동기 스크립트 로딩

리소스는 세 계층으로 수집되어 순서대로 병합됩니다:

  1. 전역 리소스global: true, 모든 페이지에 적용
  2. 템플릿 세트 리소스template_set ID로 일치
  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환경 오버라이드런타임 오버라이드

여러 매핑이 동일한 컨텍스트 키를 정의할 때 더 높은 우선순위가 우선합니다.

해석된 환경 값은 env 컨텍스트 객체에서 사용할 수 있습니다:

<script>
window.API_URL = "{{ env.api_endpoint }}";
document.title = "{{ env.app_title }}";
</script>

views 모듈은 설정된 라우터에 다음 엔드포인트를 등록합니다:

메서드경로설명
GET/pages/list접근 가능하고 announced된 페이지 목록
GET/components/listview 컴포넌트 목록
GET/pages/content/{id}페이지 렌더링 또는 컴포넌트 디스크립터 반환
GET/pages/public/{id}컴포넌트 베이스 URL 가져오기

템플릿 페이지의 경우 페이지의 content_type으로 렌더링된 HTML을 반환합니다.

컴포넌트 페이지의 경우 디스크립터를 반환합니다:

{
"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 템플릿 엔진
  • 보안 - 보안 액터 및 접근 제어
  • 환경 - 환경 변수 스토리지
  • 프레임워크 개요 - 프레임워크 모듈 사용법