Expand description
§Resuma
SSR + resumability for Rust — components run on the server only; the browser resumes serialized signals and lazy handler chunks instead of re-hydrating the tree.
§Quick start
use resuma::prelude::*;
#[component]
fn Counter() -> View {
let n = use_signal(0);
view! {
<button onClick={move |_| n.update(|v| *v += 1)}>{n}</button>
}
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
ResumaApp::new()
.page("/", || Counter::render(CounterProps::default()))
.serve(ServeOptions::default())
.await
}Install the CLI: cargo install resuma. Narrative guides live at
resuma-docs.fly.dev.
§Resumability model (v0.3)
- Every
#[component]is a resumable boundary — handlers register under/_resuma/handler/{Component}.jsand prefetch when the boundary enters the viewport. computed!,effect!, anddebounce!translate Rust closures to client-replayable JS via rs2js (inresuma-macros).- Plain
use_computed/use_effectrun on SSR only; use the macros when the browser must replay derived state or side effects. #[island]is optional — for heavy lazy bundles,load = "visible", or dev HMR.
§Crate layout
| Module | Role |
|---|---|
core | Signals, View, RenderContext, ResumePayload |
ssr | HTML rendering + embedded resumability payload |
[server] | axum HTTP, ResumaApp, /_resuma/* assets |
flow | FlowApp, file-based pages, #[load], #[submit] |
router | Page discovery scanner |
cli | resuma new / dev / build (feature cli) |
Users depend on resuma only; resuma-macros is a separate
proc-macro crate required by the build.
§Re-exports
Most apps start with prelude (use resuma::prelude::*). Macros (view!, #[component],
#[server], Flow attributes) and common types are re-exported at the crate root for convenience.
Re-exports§
pub use crate::client::client_component;pub use crate::client::client_script_url;pub use crate::client::ClientComponent;pub use crate::client::CLIENT_SCRIPT_PREFIX;pub use crate::core::combine_js;pub use crate::core::error_boundary;pub use crate::core::error_boundary;pub use crate::core::no_serialize;pub use crate::core::portal;pub use crate::core::portal;pub use crate::core::provide_context;pub use crate::core::provide_theme;pub use crate::core::push_slots;pub use crate::core::resolve_slot;pub use crate::core::show;pub use crate::core::show;pub use crate::core::stream_chunk;pub use crate::core::stream_slot;pub use crate::core::theme_css_vars;pub use crate::core::use_computed;pub use crate::core::use_computed_with_js;pub use crate::core::use_context;pub use crate::core::use_debounce;pub use crate::core::use_effect;pub use crate::core::use_signal;pub use crate::core::use_store;pub use crate::core::use_task;pub use crate::core::use_theme;pub use crate::core::use_visible_task;pub use crate::core::visible_task_js;pub use crate::core::with_default_slot;pub use crate::core::with_view_transition;pub use crate::core::Child;pub use crate::core::Component;pub use crate::core::Computed;pub use crate::core::ContextId;pub use crate::core::Effect;pub use crate::core::FlowRequest;pub use crate::core::IntoView;pub use crate::core::NoSerialize;pub use crate::core::ReadSignal;pub use crate::core::RenderContext;pub use crate::core::RenderMode;pub use crate::core::Result;pub use crate::core::ResumaError;pub use crate::core::ResumePayload;pub use crate::core::Signal;pub use crate::core::SlotGuard;pub use crate::core::SlottedChild;pub use crate::core::Store;pub use crate::core::Theme;pub use crate::core::View;pub use crate::core::WriteSignal;pub use crate::server::configure_security;pub use crate::server::register_server_action;pub use crate::server::set_action_middleware;pub use crate::server::ResumaApp;pub use crate::server::SecurityConfig;pub use crate::server::ServeOptions;pub use crate::server::CSRF_FIELD;pub use crate::server::CSRF_HEADER;pub use crate::ssr::render_to_stream;pub use crate::ssr::render_to_string;pub use crate::ssr::render_view;pub use crate::ssr::PageOptions;pub use crate::flow::apply_layouts;pub use crate::flow::current_request;pub use crate::flow::discover_pages;pub use crate::flow::encode_submit_result;pub use crate::flow::error_page;pub use crate::flow::extract_redirect;pub use crate::flow::form;pub use crate::flow::form;pub use crate::flow::load_boundary;pub use crate::flow::not_found_page;pub use crate::flow::redirect;pub use crate::flow::redirect;pub use crate::flow::register_layout;pub use crate::flow::register_loader;pub use crate::flow::register_loader_cache;pub use crate::flow::register_middleware;pub use crate::flow::register_stream_chunk;pub use crate::flow::register_stream_loader;pub use crate::flow::register_submit;pub use crate::flow::try_use_load;pub use crate::flow::try_use_load_value;pub use crate::flow::use_load;pub use crate::flow::with_request;pub use crate::flow::DiscoveredPage;pub use crate::flow::FlowApp;pub use crate::flow::FlowError;pub use crate::flow::FlowExtensions;pub use crate::flow::FlowPageRegistry;pub use crate::flow::FlowPwaConfig;pub use crate::flow::FlowServeOptions;pub use crate::flow::LoadValue;pub use crate::flow::LoaderError;pub use crate::flow::Redirect;pub use crate::flow::SubmitError;pub use crate::flow::SubmitValue;
Modules§
- cli
- Resuma developer CLI —
resuma new,resuma dev,resuma build,resuma routes. - client
- TypeScript / JavaScript client components — prebuilt ESM bundles outside the resumability runtime.
- core
- Resuma Core
- flow
- Resuma Flow — full-stack pages, loaders, submits, and middleware on top of
ResumaApp. - prelude
- Convenient re-exports for application code.
- router
- File-based page discovery for Resuma Flow.
- server
- Resuma HTTP server.
- ssr
- Server-Side Rendering for Resuma.
Macros§
- computed
computed!([deps…], move || …)— derived signal with client replay (rs2js-translated).- debounce
debounce!([deps…], ms, move || …)— debounced client reaction (rs2js-translated).- effect
effect!([signals…], move || { … })— client-replayable side effect (rs2js).- js
js!— raw JavaScript escape hatch for event handlers.- view
view!— JSX-like template macro.
Functions§
- run
- CLI entry point (
cargo install resuma).
Attribute Macros§
- component
#[component]— resumable component with generated props builder.- island
#[island]— optional interactive boundary for heavy or visibility-gated JS.- layout
#[layout]— Resuma Flow layout wrapper.- load
#[load]— Resuma Flow server data loader.- middleware
#[middleware]— Resuma Flow request middleware.- server
#[server]— exposes an async fn as a server action.- submit
#[submit]— Resuma Flow form submission handler.