2个不稳定版本

0.2.0 2024年5月2日
0.1.0 2024年2月19日

#547 in HTTP服务器

Download history 176/week @ 2024-04-29 7/week @ 2024-05-20 1/week @ 2024-05-27 6/week @ 2024-06-03 3/week @ 2024-06-10 4/week @ 2024-06-17 1/week @ 2024-06-24 21/week @ 2024-07-22 12/week @ 2024-07-29 9/week @ 2024-08-05 10/week @ 2024-08-12

每月52次下载
leptos-use 中使用

Apache-2.0

38KB
755

Spin/Leptos集成库

这是一个正在进行中的项目。 实际上“正在进行中”可能过于夸张。这是一个早期草案,我们在前进过程中学到了很多。

这个库为在Spin中运行Leptos服务器端应用程序提供了集成服务。它在Leptos的Actix和Axum集成中扮演了类似的角色,将Spin实现的概念与Leptos桥接,并将公共功能抽象化,以便将请求路由到Leptos视图和服务器功能。

目前,这个库是完全实验性的。它存在已知差距,名称和API将改变,Leptos专家无疑将对它的设计有许多看法!

安装和运行模板

可以使用以下命令安装leptos-ssr模板

spin templates install --git https://github.com/fermyon/leptos-spin

Copying remote template source
Installing template leptos-ssr...
Installed 1 template(s)

+-------------------------------------------------------------+
| Name         Description                                    |
+=============================================================+
| leptos-ssr   Leptos application using server-side rendering |
+-------------------------------------------------------------+

模板安装后,可以使用以下命令创建一个新的Leptos项目

spin new -t leptos-ssr my-leptos-app -a

在构建和运行项目之前,需要安装cargo-leptos

cargo install cargo-leptos

要构建和运行创建的项目,可以使用以下命令

cd my-leptos-app
spin build --up

现在应用应该在http://127.0.0.1:3000上提供服务

特殊要求

  • 所有服务器函数(#[server]) 必须显式注册(见下面的用法示例)。在本地代码中,Leptos使用一个巧妙的宏来自动注册它们;不幸的是,这不在WASI中工作。

  • feature = "ssr"块中,使用上下文值时,您必须调用use_context 而不是 expect_context。在使用路由时,expect_context将引发panic。例如。

#[component]
fn HomePage() -> impl IntoView {
    #[cfg(feature = "ssr")]
    {
        if let Some(resp) = use_context::<leptos_spin::ResponseOptions>() {
            resp.append_header("X-Utensil", "spork".as_bytes());
        };
    }

    view! {
        <h1>"Come over to the Leptos side - we have headers!"</h1>
    }
}

用法

use leptos::ServerFn;
use leptos_spin::{render_best_match_to_stream, RouteTable};
use spin_sdk::http::{ResponseOutparam, IncomingRequest};
use spin_sdk::http_component;

#[http_component]
async fn handle_request(req: IncomingRequest, resp_out: ResponseOutparam) {
    let mut conf = leptos::get_configuration(None).await.unwrap();
    conf.leptos_options.output_name = "sample".to_owned();

    // A line like this for every server function
    register_explicit::<crate::app::SaveCount>();

    let app_fn = crate::app::App;

    let mut routes = RouteTable::build(app_fn);
    routes.add_server_fn_prefix("/api").unwrap();

    render_best_match_to_stream(req, resp_out, &routes, app_fn, &conf.leptos_options).await
}

依赖项

~24–37MB
~601K SLoC