瀏覽代碼

provide a nicer builder API

Evan Almloff 2 年之前
父節點
當前提交
71ddd50963

+ 1 - 5
packages/server/examples/axum-hello-world/src/main.rs

@@ -23,11 +23,7 @@ fn main() {
                 axum::Server::bind(&addr)
                     .serve(
                         axum::Router::new()
-                            .serve_dioxus_application(
-                                ServeConfig::new(app, ()).head(r#"<title>Hello World!</title>"#),
-                                None,
-                            )
-                            .with_state(SSRState::default())
+                            .serve_dioxus_application("", ServeConfigBuilder::new(app, ()))
                             .into_make_service(),
                     )
                     .await

+ 10 - 7
packages/server/examples/axum-router/src/main.rs

@@ -41,12 +41,15 @@ fn main() {
                             // If the path is unknown, render the application
                             .fallback(
                                 move |uri: http::uri::Uri, State(ssr_state): State<SSRState>| {
-                                    let rendered = ssr_state.render(&ServeConfig::new(
-                                        App,
-                                        AppProps {
-                                            route: Some(format!("http://{addr}{uri}")),
-                                        },
-                                    ));
+                                    let rendered = ssr_state.render(
+                                        &ServeConfigBuilder::new(
+                                            App,
+                                            AppProps {
+                                                route: Some(format!("http://{addr}{uri}")),
+                                            },
+                                        )
+                                        .build(),
+                                    );
                                     async move { axum::body::Full::from(rendered) }
                                 },
                             )
@@ -79,7 +82,7 @@ fn App(cx: Scope<AppProps>) -> Element {
                         for _ in 0..100 {
                             tr {
                                 for _ in 0..100 {
-                                    td { "hello world??" }
+                                    td { "hello world!" }
                                 }
                             }
                         }

+ 2 - 3
packages/server/examples/salvo-hello-world/src/main.rs

@@ -20,9 +20,8 @@ fn main() {
         tokio::runtime::Runtime::new()
             .unwrap()
             .block_on(async move {
-                let router = Router::new().serve_dioxus_application(
-                    ServeConfig::new(app, ()).head(r#"<title>Hello World!</title>"#),
-                );
+                let router =
+                    Router::new().serve_dioxus_application("", ServeConfigBuilder::new(app, ()));
                 Server::new(TcpListener::bind("127.0.0.1:8080"))
                     .serve(router)
                     .await;

+ 1 - 3
packages/server/examples/warp-hello-world/src/main.rs

@@ -19,9 +19,7 @@ fn main() {
         tokio::runtime::Runtime::new()
             .unwrap()
             .block_on(async move {
-                let routes = serve_dioxus_application(
-                    ServeConfig::new(app, ()).head(r#"<title>Hello World!</title>"#),
-                );
+                let routes = serve_dioxus_application("", ServeConfigBuilder::new(app, ()));
                 warp::serve(routes).run(([127, 0, 0, 1], 8080)).await;
             });
     }

+ 5 - 23
packages/server/src/render.rs

@@ -16,38 +16,20 @@ fn dioxus_ssr_html<P: 'static + Clone>(cfg: &ServeConfig<P>, renderer: &mut Rend
         ..
     } = cfg;
 
-    let application_name = application_name.unwrap_or("dioxus");
     let mut vdom = VirtualDom::new_with_props(*app, props.clone());
     let _ = vdom.rebuild();
-    let base_path = base_path.unwrap_or(".");
 
     let mut html = String::new();
 
-    let result = match head {
-        Some(head) => {
-            write!(
-                &mut html,
-                r#"
+    let result = write!(
+        &mut html,
+        r#"
         <!DOCTYPE html>
         <html>
         <head>{head}
-        </head>
-        <body>
+        </head><body>
         <div id="main">"#
-            )
-        }
-        None => {
-            write!(
-                &mut html,
-                r#"<title>Dioxus Application</title>
-        <link rel="preload" href="/{base_path}/assets/dioxus/{application_name}_bg.wasm" as="fetch" type="application/wasm" crossorigin="" />
-        <link rel="modulepreload" href="/{base_path}/assets/dioxus/{application_name}.js" />
-        <meta content="text/html;charset=utf-8" http-equiv="Content-Type" />
-        <meta name="viewport" content="width=device-width, initial-scale=1" />
-        <meta charset="UTF-8" />"#
-            )
-        }
-    };
+    );
 
     if let Err(err) = result {
         eprintln!("Failed to write to html: {}", err);

+ 45 - 2
packages/server/src/serve.rs

@@ -1,15 +1,16 @@
 use dioxus_core::Component;
 
 #[derive(Clone)]
-pub struct ServeConfig<P: Clone> {
+pub struct ServeConfigBuilder<P: Clone> {
     pub(crate) app: Component<P>,
     pub(crate) props: P,
     pub(crate) application_name: Option<&'static str>,
     pub(crate) base_path: Option<&'static str>,
     pub(crate) head: Option<&'static str>,
+    pub(crate) assets_path: Option<&'static str>,
 }
 
-impl<P: Clone> ServeConfig<P> {
+impl<P: Clone> ServeConfigBuilder<P> {
     /// Create a new ServeConfig
     pub fn new(app: Component<P>, props: P) -> Self {
         Self {
@@ -18,6 +19,7 @@ impl<P: Clone> ServeConfig<P> {
             application_name: None,
             base_path: None,
             head: None,
+            assets_path: None,
         }
     }
 
@@ -38,4 +40,45 @@ impl<P: Clone> ServeConfig<P> {
         self.head = Some(head);
         self
     }
+
+    /// Set the path of the assets folder generated by the Dioxus CLI. (defaults to dist/assets)
+    pub fn assets_path(mut self, assets_path: &'static str) -> Self {
+        self.assets_path = Some(assets_path);
+        self
+    }
+
+    /// Build the ServeConfig
+    pub fn build(self) -> ServeConfig<P> {
+        let base_path = self.base_path.unwrap_or(".");
+        let application_name = self.application_name.unwrap_or("dioxus");
+        ServeConfig {
+            app: self.app,
+            props: self.props,
+            application_name,
+            base_path,
+            head: self.head.map(String::from).unwrap_or(format!(r#"<title>Dioxus Application</title>
+        <link rel="preload" href="/{base_path}/assets/dioxus/{application_name}_bg.wasm" as="fetch" type="application/wasm" crossorigin="" />
+        <link rel="modulepreload" href="/{base_path}/assets/dioxus/{application_name}.js" />
+        <meta content="text/html;charset=utf-8" http-equiv="Content-Type" />
+        <meta name="viewport" content="width=device-width, initial-scale=1" />
+        <meta charset="UTF-8" />"#)),
+            assets_path: self.assets_path.unwrap_or("dist/assets"),
+        }
+    }
+}
+
+#[derive(Clone)]
+pub struct ServeConfig<P: Clone> {
+    pub(crate) app: Component<P>,
+    pub(crate) props: P,
+    pub(crate) application_name: &'static str,
+    pub(crate) base_path: &'static str,
+    pub(crate) head: String,
+    pub(crate) assets_path: &'static str,
+}
+
+impl<P: Clone> From<ServeConfigBuilder<P>> for ServeConfig<P> {
+    fn from(builder: ServeConfigBuilder<P>) -> Self {
+        builder.build()
+    }
 }