dioxus/packages/liveview
Demonthos 047ed1e553
Subtree memorization / reactive templates (#488)
This commit adds subtree memoization to Dioxus.

Subtree memoization is basically a compile-time step that drastically 
reduces the amount of work the diffing engine needs to do at runtime by
extracting non-changing nodes out into a static "template." Templates 
are then understood by the various renderers in the ecosystem as a 
faster way of rendering the same items. 

For example, in the web, templates are simply a set of DOM Nodes created 
once and then cloned later. This is the same pattern frameworks like Lithtml
and SolidJS use to achieve near-perfect performance. 

Subtree memoization adds an additional level of complexity to Dioxus. The RSX
macro needs to be much smarter to identify changing/nonchanging nodes and
generate a mapping between the Template and its runtime counterparts.

This commit represents a working starter point for this work, adding support 
for templates for the web, desktop, liveview, ssr, and native-core renderers.
In the future we will try to shrink code generation, generally improve 
performance, and simplify our implementation.
2022-09-30 12:03:06 -07:00
..
.vscode feat: liveview working with warp 2022-03-15 01:02:44 -04:00
examples Add liveview Salvo integration (#538) 2022-09-13 14:24:30 -07:00
src Subtree memorization / reactive templates (#488) 2022-09-30 12:03:06 -07:00
Cargo.toml Add liveview Salvo integration (#538) 2022-09-13 14:24:30 -07:00
CHANGELOG.md Release dioxus-core v0.1.3, dioxus-core-macro v0.1.2, dioxus-html v0.1.0, dioxus-desktop v0.0.0, dioxus-hooks v0.1.3, dioxus-liveview v0.1.0, dioxus-mobile v0.0.0, dioxus-router v0.1.0, dioxus-ssr v0.1.0, dioxus-web v0.0.0, dioxus v0.1.1 2021-12-15 16:07:09 -05:00
README.md Fix various typos and grammar nits 2022-01-21 21:43:43 -06:00

Dioxus LiveView

Enabling server-rendered and hybrid applications with incredibly low latency (<1ms).

#[async_std::main]
async fn main() -> tide::Result<()> {
    let liveview_pool = dioxus::liveview::pool::default();
    let mut app = tide::new();

    // serve the liveview client
    app.at("/").get(dioxus::liveview::liveview_frontend);

    // and then connect the client to the backend
    app.at("/app").get(|req| dioxus::liveview::launch(App, Props { req }))

    app.listen("127.0.0.1:8080").await?;

    Ok(())
}

Dioxus LiveView runs your Dioxus apps on the server

use soyuz::prelude::*;

#[tokio::main]
async fn main() {
    let mut app = soyuz::new();
    app.at("/app").get(websocket(handler));
    app.listen("127.0.0.1:8080").await.unwrap();
}

async fn order_shoes(mut req: WebsocketRequest) -> Response {
    let stream = req.upgrade();
    dioxus::liveview::launch(App, stream).await;
}

fn App(cx: Scope) -> Element {
    let mut count = use_state(&cx, || 0);
    cx.render(rsx!(
        button { onclick: move |_| count += 1, "Incr" }
        button { onclick: move |_| count -= 1, "Decr" }
    ))
}