2个不稳定版本
0.2.0 | 2024年5月2日 |
---|---|
0.1.0 | 2024年2月19日 |
#547 in HTTP服务器
每月52次下载
在 leptos-use 中使用
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