|
@@ -1,119 +1 @@
|
|
|
-> This guide assumes you read the [Web](web.md) guide and installed the [Dioxus-cli](https://github.com/DioxusLabs/cli)
|
|
|
-
|
|
|
-# Fullstack development
|
|
|
-
|
|
|
-We can combine the `dioxus-web` renderer with the `dioxus-ssr` renderer to create a full-stack Dioxus application. By combining server-side rendering with client-side hydration we can create an application that is initially rendered on the server and then hydrates the application on the client. Server-side rendering results in a fast first paint and make our page SEO-friendly. Client-side hydration makes our page responsive once the application has fully loaded.
|
|
|
-
|
|
|
-To help make full-stack development easier, Dioxus provides a `dioxus-fullstack` crate that integrates with popular web frameworks with utilities for full-stack development.
|
|
|
-
|
|
|
-## Setup
|
|
|
-
|
|
|
-For this guide, we're going to show how to use Dioxus with [Axum](https://docs.rs/axum/latest/axum/), but `dioxus-fullstack` also integrates with the [Warp](https://docs.rs/warp/latest/warp/) and [Salvo](https://docs.rs/salvo/latest/salvo/) web frameworks.
|
|
|
-
|
|
|
-Make sure you have Rust and Cargo installed, and then create a new project:
|
|
|
-
|
|
|
-```shell
|
|
|
-cargo new --bin demo
|
|
|
-cd demo
|
|
|
-```
|
|
|
-
|
|
|
-Add `dioxus` and `dioxus-fullstack` as dependencies:
|
|
|
-
|
|
|
-```shell
|
|
|
-cargo add dioxus
|
|
|
-cargo add dioxus-fullstack --features axum, ssr
|
|
|
-```
|
|
|
-
|
|
|
-Next, add all the Axum dependencies. This will be different if you're using a different Web Framework
|
|
|
-
|
|
|
-```shell
|
|
|
-cargo add tokio --features full
|
|
|
-cargo add axum
|
|
|
-```
|
|
|
-
|
|
|
-Your dependencies should look roughly like this:
|
|
|
-
|
|
|
-```toml
|
|
|
-[dependencies]
|
|
|
-axum = "*"
|
|
|
-dioxus = { version = "*" }
|
|
|
-dioxus-fullstack = { version = "*", features = ["axum", "ssr"] }
|
|
|
-tokio = { version = "*", features = ["full"] }
|
|
|
-```
|
|
|
-
|
|
|
-Now, set up your Axum app to serve the Dioxus app.
|
|
|
-
|
|
|
-```rust
|
|
|
-{{#include ../../../examples/server_basic.rs}}
|
|
|
-```
|
|
|
-
|
|
|
-Now, run your app with `cargo run` and open `http://localhost:8080` in your browser. You should see a server-side rendered page with a counter.
|
|
|
-
|
|
|
-## Hydration
|
|
|
-
|
|
|
-Right now, the page is static. We can't interact with the buttons. To fix this, we can hydrate the page with `dioxus-web`.
|
|
|
-
|
|
|
-First, modify your `Cargo.toml` to include two features, one for the server called `ssr`, and one for the client called `web`.
|
|
|
-
|
|
|
-```toml
|
|
|
-[dependencies]
|
|
|
-# Common dependancies
|
|
|
-dioxus = { version = "*" }
|
|
|
-dioxus-fullstack = { version = "*" }
|
|
|
-
|
|
|
-# Web dependancies
|
|
|
-dioxus-web = { version = "*", features=["hydrate"], optional = true }
|
|
|
-
|
|
|
-# Server dependancies
|
|
|
-axum = { version = "0.6.12", optional = true }
|
|
|
-tokio = { version = "1.27.0", features = ["full"], optional = true }
|
|
|
-
|
|
|
-[features]
|
|
|
-default = []
|
|
|
-ssr = ["axum", "tokio", "dioxus-fullstack/axum"]
|
|
|
-web = ["dioxus-web"]
|
|
|
-```
|
|
|
-
|
|
|
-Next, we need to modify our `main.rs` to use either hydrate on the client or render on the server depending on the active features.
|
|
|
-
|
|
|
-```rust
|
|
|
-{{#include ../../../examples/hydration.rs}}
|
|
|
-```
|
|
|
-
|
|
|
-Now, build your client-side bundle with `dioxus build --features web` and run your server with `cargo run --features ssr`. You should see the same page as before, but now you can interact with the buttons!
|
|
|
-
|
|
|
-## Sycronizing props between the server and client
|
|
|
-
|
|
|
-Lets make the initial count of the counter dynamic based on the current page.
|
|
|
-
|
|
|
-## Communicating with the server
|
|
|
-
|
|
|
-`dixous-server` provides server functions that allow you to call an automatically generated API on the server from the client as if it were a local function.
|
|
|
-
|
|
|
-To make a server function, simply add the `#[server(YourUniqueType)]` attribute to a function. The function must:
|
|
|
-
|
|
|
-- Be an async function
|
|
|
-- Have arguments and a return type that both implement serialize and deserialize (with [serde](https://serde.rs/)).
|
|
|
-- Return a `Result` with an error type of ServerFnError
|
|
|
-
|
|
|
-You must call `register` on the type you passed into the server macro in your main function before starting your server to tell Dioxus about the server function.
|
|
|
-
|
|
|
-Let's add a server function to our app that allows us to multiply the count by a number on the server.
|
|
|
-
|
|
|
-First, add serde as a dependency:
|
|
|
-
|
|
|
-```shell
|
|
|
-cargo add serde
|
|
|
-```
|
|
|
-
|
|
|
-Next, add the server function to your `main.rs`:
|
|
|
-
|
|
|
-```rust
|
|
|
-{{#include ../../../examples/server_function.rs}}
|
|
|
-```
|
|
|
-
|
|
|
-Now, build your client-side bundle with `dioxus build --features web` and run your server with `cargo run --features ssr`. You should see a new button that multiplies the count by 2.
|
|
|
-
|
|
|
-## Conclusion
|
|
|
-
|
|
|
-That's it! You've created a full-stack Dioxus app. You can find more examples of full-stack apps and information about how to integrate with other frameworks and desktop renderers in the [dioxus-fullstack examples directory](https://github.com/DioxusLabs/dioxus/tree/master/packages/server/examples).
|
|
|
+# Fullstack
|