- Blitz는 HTML/CSS 렌더링에 초점을 맞춘 모듈형 렌더링 엔진이며, 브라우저 전체 기능을 기본 제공하지 않고 필요한 추가 기능은 선택적으로 두려는 설계를 가짐
- 현재 상태는 pre-alpha로, 렌더러는 이미 상당한 기능을 갖췄지만 버그와 누락 기능이 많아 앱 개발에 사용하는 것은 아직 권장되지 않음
- 지원 목표는 modern HTML layout, advanced CSS, HTML form controls, AccessKit 기반 접근성, custom widgets 확장이며 WebRTC, WebSockets, Bluetooth, localStorage 같은 기능은 제공하지 않음
- 구조는 core DOM 추상화와 네트워킹, 렌더링, 윈도우, 상태 관리 모듈로 나뉘며,
blitz와 dioxus-native라는 상위 래퍼 crate가 HTML/Markdown 또는 Dioxus VirtualDom 렌더링을 담당함
- 새 버전인 Blitz v0.2+는 Stylo를 사용하며, v0.1 소스는
legacy 브랜치에 남아 있지만 활발히 개발되지 않음
HTML/CSS 렌더링에 집중하는 엔진
- Blitz는 HTML/CSS 렌더링 엔진이며, 기본 사용 사례인 HTML/CSS 렌더링에 비해 브라우저가 비대하다는 문제의식에서 출발함
- 목표는 브라우저 기능 전체를 구현하는 것이 아니라, HTML/CSS 렌더링에 필요한 기능을 중심으로 두고 나머지 기능은 가능하면 opt-in으로 만드는 것임
- 현재는 pre-alpha 상태임
- 렌더러는 이미 상당한 기능을 갖췄음
- 아직 버그와 누락 기능이 많음
- 앱을 만드는 데 사용하는 것은 아직 권장되지 않음
- 더 자세한 진행 상황은 roadmap issue에서 확인 가능함
지원하려는 기능과 제외하는 기능
- Blitz가 지원하려는 범위는 HTML/CSS UI 렌더링에 맞춰져 있음
- flexbox, grid, table, block, inline, absolute/fixed 등 modern HTML layout
- complex selectors, media queries, CSS variables 같은 advanced CSS
- HTML form controls
- AccessKit 기반 접근성
- custom widgets를 통한 확장성
- Blitz는 WebRTC, WebSockets, Bluetooth, localStorage 같은 기능을 제공하지 않음
- 네이티브 앱에서는 이런 기능의 상당 부분을 일반 Rust crate로 처리할 수 있음
- 이런 기능이 렌더러와 결합될 필요는 없다는 입장임
- JavaScript, Python 등 다른 언어 바인딩은 아직 없지만, 관련 기여는 받을 수 있음
실행 방법과 예제
- 저장소를 클론한 뒤
browser 패키지를 실행할 수 있음
cargo run --release --package browser
- 예제로는 작은 TODO 앱, Markdown 렌더러, raw WGPU 렌더링 통합이 제공됨
cargo run --release --package todomvc
cargo run --release --package readme ./README.md
cargo run --release --package wgpu_texture
모듈형 아키텍처
- Blitz는 core DOM abstraction, 추가 기능 모듈, 두 개의 상위 래퍼로 구성됨
- 네트워킹, 렌더링, 윈도우, 상태 관리 같은 기능이 별도 모듈로 나뉨
- 이 조각들을 결합해 하나의 웹 엔진을 만들 수 있음
-
상위 래퍼 crate
blitz: HTML 문자열을 렌더링할 수 있는 HTML/Markdown frontend
- HTML 또는 Markdown 파일 미리보기에 유용함
- 현재는 상호작용이 없음
blitz-dom, blitz-html, blitz-shell, blitz-renderer-vello를 사용함
dioxus-native: Dioxus VirtualDom을 렌더링하는 Dioxus frontend
- Dioxus 이벤트 처리를 통해 완전한 상호작용을 지원함
blitz-dom, dioxus-core, blitz-shell, blitz-renderer-vello를 사용함
- 두 래퍼 모두 하위 리소스를 가져오기 위해
blitz-net을 선택적으로 사용할 수 있음
-
핵심 crate와 추가 crate
blitz-dom: style resolution, layout, event handling을 포함하는 core DOM abstraction
- parsing, rendering, system integration은 포함하지 않음
- Stylo, Taffy, Parley를 사용함
blitz-traits: 다른 crate들이 서로 직접 의존하지 않고 상호운용할 수 있게 하는 최소 기반 crate
blitz-net: HTTP, 파일시스템, encoded data URI에서 리소스를 가져오는 네트워킹 모듈
- reqwest를 사용함
blitz-paint: blitz-dom 트리를 anyrender draw commands로 변환함
- anyrender를 사용함
blitz-html: blitz-dom에 HTML parsing을 추가함
- html5ever와 xml5ever를 사용함
blitz-shell: Blitz가 윈도우에 렌더링할 수 있게 하는 shell
- Winit event loop, AccessKit, Muda 등을 통합함
- winit, accesskit, muda를 사용함
- AnyRender 렌더링 추상화는 별도 저장소인 anyrender로 이동함
Dioxus Native 개발 버전 사용
- 최신 개발 버전의 Dioxus Native는 이 저장소에 있음
- Dioxus Native가 빠르게 개발 중이기 때문에, 공식 릴리스보다 먼저 최신 기능과 버그 수정을 사용하려면 git 버전을 쓸 수 있음
- git 버전 사용 절차는 다음과 같음
dioxus crate 의존성을 완전히 제거함
dioxus-native = { git = "https://github.com/DioxusLabs/blitz", rev = "e64a3d8", features = ["prelude"] }를 추가함
e64a3d8은 원하는 버전의 git commit id로 바꿈
- Rust 코드에서
use dioxus::prelude::*를 use dioxus_native::prelude::*로 변경함
- Dioxus Native prelude가 내보내지 않는
dioxus 기능이 필요하면 dioxus-html, dioxus-signals, dioxus-router 등 개별 sub-crate에서 import함
- Dioxus Native의 git 버전은 crates.io의 안정 버전 Dioxus v0.7.x에 여전히 의존함
dioxus-sdk, dioxus-components, dioxus-free-icons 같은 추가 라이브러리는 계속 동작해야 함
버전과 라이선스
- 이 저장소에는 Blitz v0.2+ 새 버전이 들어 있으며 Stylo를 사용함
- 이전 버전인 v0.1 소스는 legacy 브랜치에 남아 있음
- 프로젝트는 Apache 2.0과 MIT dual license로 배포됨
stylo_taffy crate는 Servo 프로젝트와의 상호운용을 쉽게 하기 위해 MPL 2.0도 추가로 적용됨
- 따라서
stylo_taffy는 Apache 2.0, MIT, MPL 2.0의 triple license임
- Blitz에 의도적으로 제출한 기여는 별도 조건이 없는 한 Apache 2.0과 MIT로 dual licensed 처리됨
stylo_taffy에 제출한 기여는 MPL 2.0도 포함함