- Blitz es un motor de renderizado modular enfocado en el renderizado de HTML/CSS, diseñado para no incluir por defecto todas las funciones de un navegador y dejar las capacidades adicionales como opciones elegibles según sea necesario
- Su estado actual es pre-alpha: aunque el renderizador ya tiene bastantes funciones, todavía hay muchos errores y características faltantes, por lo que aún no se recomienda usarlo para desarrollar aplicaciones
- Sus objetivos de soporte incluyen modern HTML layout, advanced CSS, controles de formularios HTML, accesibilidad basada en AccessKit y extensión mediante custom widgets; no ofrece funciones como WebRTC, WebSockets, Bluetooth o localStorage
- Su estructura se divide en una abstracción central del DOM y módulos de red, renderizado, ventanas y manejo de estado, mientras que los crates wrapper de nivel superior
blitz y dioxus-native se encargan del renderizado de HTML/Markdown o de Dioxus VirtualDom
- La nueva versión, Blitz v0.2+, usa Stylo; el código fuente de la v0.1 permanece en la rama
legacy, pero ya no se desarrolla activamente
Motor enfocado en el renderizado de HTML/CSS
- Blitz es un motor de renderizado HTML/CSS que parte de la idea de que los navegadores resultan demasiado pesados en comparación con el caso de uso básico de renderizar HTML/CSS
- Su objetivo no es implementar todo el conjunto de funciones de un navegador, sino centrarse en lo necesario para renderizar HTML/CSS y dejar el resto, en la medida de lo posible, como funciones opt-in
- Actualmente está en estado pre-alpha
- El renderizador ya tiene bastantes capacidades
- Todavía hay muchos errores y funciones faltantes
- Aún no se recomienda usarlo para crear aplicaciones
- Se puede consultar más detalle del progreso en el roadmap issue
Funciones que busca soportar y funciones que excluye
- El alcance que Blitz busca cubrir está enfocado en el renderizado de interfaces HTML/CSS
- modern HTML layout como flexbox, grid, table, block, inline y absolute/fixed
- advanced CSS como complex selectors, media queries y CSS variables
- controles de formularios HTML
- accesibilidad basada en AccessKit
- extensibilidad mediante custom widgets
- Blitz no ofrece funciones como WebRTC, WebSockets, Bluetooth o localStorage
- En aplicaciones nativas, gran parte de esas funciones puede resolverse con crates comunes de Rust
- La postura del proyecto es que esas funciones no necesitan estar acopladas al renderizador
- Aún no existen bindings para otros lenguajes como JavaScript o Python, aunque se aceptan contribuciones relacionadas
Cómo ejecutarlo y ejemplos
- Después de clonar el repositorio, se puede ejecutar el paquete
browser
cargo run --release --package browser
- Como ejemplos, se incluyen una pequeña app de TODO, un renderizador de Markdown y una integración de renderizado raw con WGPU
cargo run --release --package todomvc
cargo run --release --package readme ./README.md
cargo run --release --package wgpu_texture
Arquitectura modular
- Blitz está compuesto por una abstracción central del DOM, módulos de funciones adicionales y dos wrappers de nivel superior
- Funciones como red, renderizado, ventanas y manejo de estado están divididas en módulos separados
- Estas piezas pueden combinarse para crear un motor web completo
-
Crates wrapper de nivel superior
blitz: un frontend HTML/Markdown capaz de renderizar cadenas HTML
- Es útil para previsualizar archivos HTML o Markdown
- Actualmente no tiene interacción
- Usa
blitz-dom, blitz-html, blitz-shell y blitz-renderer-vello
dioxus-native: un frontend de Dioxus que renderiza Dioxus VirtualDom
- Soporta interacción completa mediante el manejo de eventos de Dioxus
- Usa
blitz-dom, dioxus-core, blitz-shell y blitz-renderer-vello
- Ambos wrappers pueden usar opcionalmente
blitz-net para obtener subrecursos
-
Crates principales y crates adicionales
blitz-dom: abstracción central del DOM que incluye style resolution, layout y event handling
- No incluye parsing, rendering ni integración con el sistema
- Usa Stylo, Taffy y Parley
blitz-traits: crate base mínima que permite que otros crates interoperan sin depender directamente unos de otros
blitz-net: módulo de red que obtiene recursos desde HTTP, el sistema de archivos y encoded data URI
- Usa reqwest
blitz-paint: convierte el árbol de blitz-dom en comandos de dibujo de anyrender
- Usa anyrender
blitz-html: agrega parsing de HTML a blitz-dom
- Usa html5ever y xml5ever
blitz-shell: shell que permite a Blitz renderizar en ventanas
- Integra Winit event loop, AccessKit, Muda y más
- Usa winit, accesskit y muda
- La abstracción de renderizado AnyRender se trasladó a un repositorio separado: anyrender
Uso de la versión de desarrollo de Dioxus Native
- La versión de desarrollo más reciente de Dioxus Native está en este repositorio
- Como Dioxus Native se está desarrollando rápidamente, se puede usar la versión de git para obtener funciones nuevas y correcciones antes de una release oficial
- El procedimiento para usar la versión de git es el siguiente
- Eliminar por completo la dependencia del crate
dioxus
- Agregar
dioxus-native = { git = "https://github.com/DioxusLabs/blitz", rev = "e64a3d8", features = ["prelude"] }
- Cambiar
e64a3d8 por el git commit id de la versión deseada
- En el código Rust, cambiar
use dioxus::prelude::* por use dioxus_native::prelude::*
- Si se necesitan funciones de
dioxus que el prelude de Dioxus Native no exporta, importarlas desde sub-crates individuales como dioxus-html, dioxus-signals o dioxus-router
- La versión de git de Dioxus Native sigue dependiendo de la versión estable de crates.io, Dioxus v0.7.x
- Bibliotecas adicionales como
dioxus-sdk, dioxus-components y dioxus-free-icons deberían seguir funcionando
Versiones y licencia
- Este repositorio contiene la nueva versión Blitz v0.2+, que usa Stylo
- El código de la versión anterior, v0.1, permanece en la rama legacy
- La v0.1 ya no se desarrolla activamente
- El proyecto se distribuye bajo licencia dual Apache 2.0 y MIT
- El crate
stylo_taffy también aplica MPL 2.0 adicionalmente para facilitar la interoperabilidad con el proyecto Servo
- Por lo tanto,
stylo_taffy tiene licencia triple: Apache 2.0, MIT y MPL 2.0
- Las contribuciones enviadas intencionalmente a Blitz se manejan como dual licensed bajo Apache 2.0 y MIT, salvo que se especifique lo contrario
- Las contribuciones enviadas a
stylo_taffy también incluyen MPL 2.0
1 comentarios
Opiniones de Hacker News
Soy el desarrollador líder de Blitz. Todavía no está en una etapa terminada, y el sistema de entrada de texto/foco es básico; además, no admite scroll fuera del viewport raíz. Los selectores CSS complejos como
nth-childy:hasaún no funcionan bien, y la integración del manejo de eventos con Dioxus, un framework similar a React que corre sobre Blitz, apenas llega al nivel de clics y no tienepreventDefault. La red actualmente es muy simple: hace solicitudes síncronas en el hilo principal, y necesita networking asíncrono o multihilo bien implementado. Casi no se ha trabajado en rendimiento, así que recalcula estilos/layout/paint en cada frame, y también hay algunas fugas de memoria por nodos que no se limpian. Todavía faltan sombras, fuentes web,calc, layout con floats y controles de formulario aparte de la entrada de texto. En definitiva, está más cerca de “hacer un webview es un trabajo grande y todavía no llegamos ahí”, y espero tener una forma más completa en 2 a 3 meses. También hay capturas aquí: https://github.com/DioxusLabs/blitz/issues/23Este proyecto, a primera vista, parece muy útil. La idea es crear apps nativas usando el paradigma de layout HTML/CSS ampliamente utilizado, pero quitando las partes pesadas que implica una API completa de JS/DOM/navegador. Parece que podría permitir una mejora mucho mayor que empaquetar un motor de navegador como hace Electron. Justo hace poco escuché a Casey Muratori hablar de CSS de forma muy crítica en el podcast de Richard Feldman. Me pegaron especialmente los casos en los que tuvo que prerenderizar una página web y medirla dinámicamente para crear relaciones de layout simples. Como dice Muratori, escribir CSS se siente menos como construir sobre primitivos simples y más como defender un caso en un tribunal. Por supuesto, por la familiaridad, la compatibilidad y lo extremadamente productivo que es el “CSS del camino feliz”, hay una gran demanda que este tipo de proyecto satisface. Aun así, parece haber una oportunidad para ofrecer una capa más simple y general a la que el usuario pueda bajar cuando la necesite. También podría inspirarse en CSS Houdini, que intenta hacer extensible CSS mediante APIs de JS; quizá eso sea lo que significan “Custom Widgets”.
float.Hace unos años, no, hace 20 años, creé un proyecto open source parecido llamado Flying Saucer. Era un renderizador de HTML + CSS2 hecho en Java puro. Imaginaba que se usaría para renderizar interfaces de texto enriquecido en juegos, pero su uso principal real fue la generación de PDF del lado del servidor. Era mucho más fácil generar HTML y renderizarlo como PDF que usar las distintas APIs de generación de reportes PDF disponibles en ese momento. Blitz se ve genial, y me entusiasma que haya más bibliotecas GUI en Rust. https://en.wikipedia.org/wiki/Flying_Saucer_(library) Sorprendentemente, todavía se actualiza: https://github.com/flyingsaucerproject/flyingsaucer/releases...
“Una webview ligera que reemplaza el motor de JavaScript por una API nativa en Rust” suena prometedor. Básicamente, si es algo como Tauri sin JS en el camino, con solo oírlo ya suena bien.
Interesante. Justo hoy pasé por algo horrible con puppeteer y Chromium headless, y estaba buscando un reemplazo para wkhtmltopdf. Nunca hay que ejecutar eso metiendo jemalloc en
LD_PRELOAD. Resolví el problema, pero me gustaba más la idea de un renderizador simple.No es sobre Blitz en sí, pero acabo de conocer Dioxus. Me pregunto si existe alguna regla implícita según la cual los frameworks que compilan a WASM no muestran demos en serio o no alojan su propio sitio usando el framework. Creo que ya vi esto unas 5 o 6 veces. En la página de Dioxus se ve que se carga un archivo WASM, pero no queda claro dónde se usa ni si realmente se usa.
Podría ser genial usarlo junto con htmx en el backend. Aunque parece que no se mezcla ningún motor JS, así que me pregunto cómo se podría hacer.
ydeberían poder hacer solicitudes HTTP? ¿Por qué solo los eventos de clic y envío deberían disparar solicitudes? ¿Por qué solo deberían ser posibles GET y POST? ¿Por qué solo se debería poder reemplazar toda la pantalla? Visto de otra forma, HTMX vuelve a los elementos HTML menos restrictivos y más generales. Si un renderizador web lo toma en cuenta al diseñarse, incluso podría volverse más simple.Hoy conocí Dioxus por primera vez. https://dioxuslabs.com/
Realmente genial. Me gustaría probarlo en un proyecto de C++. Una pregunta que se me ocurre es el rendimiento. Me pregunto si puede renderizar páginas relativamente complejas con una alta tasa de cuadros por segundo. Normalmente uso ImGUI, y es tan bueno que casi no tengo que pensar en problemas de rendimiento al mostrar datos en tiempo real. En cambio, el renderizado web de Chromium quema CPU incluso con simples actualizaciones de texto en el DOM a solo 10 cuadros por segundo; si esto se resolviera, podría cambiar las reglas del juego.