static_generation.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #![allow(non_snake_case)]
  2. use std::time::Duration;
  3. use dioxus::prelude::*;
  4. use dioxus_router::prelude::*;
  5. use dioxus_ssr::incremental::{DefaultRenderer, IncrementalRendererConfig};
  6. #[tokio::main]
  7. async fn main() {
  8. let mut renderer = IncrementalRendererConfig::new(DefaultRenderer {
  9. before_body: r#"<!DOCTYPE html>
  10. <html lang="en">
  11. <head>
  12. <meta charset="UTF-8">
  13. <meta name="viewport" content="width=device-width,
  14. initial-scale=1.0">
  15. <title>Dioxus Application</title>
  16. </head>
  17. <body>"#
  18. .to_string(),
  19. after_body: r#"</body>
  20. </html>"#
  21. .to_string(),
  22. })
  23. .static_dir("./static")
  24. .invalidate_after(Duration::from_secs(10))
  25. .build();
  26. println!(
  27. "SITE MAP:\n{}",
  28. Route::SITE_MAP
  29. .iter()
  30. .flat_map(|route| route.flatten().into_iter())
  31. .map(|route| {
  32. route
  33. .iter()
  34. .map(|segment| segment.to_string())
  35. .collect::<Vec<_>>()
  36. .join("")
  37. })
  38. .collect::<Vec<_>>()
  39. .join("\n")
  40. );
  41. pre_cache_static_routes::<Route, _>(&mut renderer)
  42. .await
  43. .unwrap();
  44. }
  45. #[inline_props]
  46. fn Blog(cx: Scope) -> Element {
  47. render! {
  48. div {
  49. "Blog"
  50. }
  51. }
  52. }
  53. #[inline_props]
  54. fn Post(cx: Scope, id: usize) -> Element {
  55. render! {
  56. div {
  57. "PostId: {id}"
  58. }
  59. }
  60. }
  61. #[inline_props]
  62. fn PostHome(cx: Scope) -> Element {
  63. render! {
  64. div {
  65. "Post"
  66. }
  67. }
  68. }
  69. #[inline_props]
  70. fn Home(cx: Scope) -> Element {
  71. render! {
  72. div {
  73. "Home"
  74. }
  75. }
  76. }
  77. mod inner {
  78. use dioxus::prelude::*;
  79. use dioxus_router::prelude::*;
  80. #[rustfmt::skip]
  81. #[derive(Clone, Debug, PartialEq, Routable)]
  82. pub enum Route {
  83. #[nest("/blog")]
  84. #[route("/")]
  85. Blog {},
  86. #[route("/post/index")]
  87. PostHome {},
  88. #[route("/post/:id")]
  89. Post {
  90. id: usize,
  91. },
  92. #[end_nest]
  93. #[route("/")]
  94. Home {},
  95. }
  96. #[inline_props]
  97. fn Blog(cx: Scope) -> Element {
  98. render! {
  99. div {
  100. "Blog"
  101. }
  102. }
  103. }
  104. #[inline_props]
  105. fn Post(cx: Scope, id: usize) -> Element {
  106. render! {
  107. div {
  108. "PostId: {id}"
  109. }
  110. }
  111. }
  112. #[inline_props]
  113. fn PostHome(cx: Scope) -> Element {
  114. render! {
  115. div {
  116. "Post"
  117. }
  118. }
  119. }
  120. #[inline_props]
  121. fn Home(cx: Scope) -> Element {
  122. render! {
  123. div {
  124. "Home"
  125. }
  126. }
  127. }
  128. }
  129. #[rustfmt::skip]
  130. #[derive(Clone, Debug, PartialEq, Routable)]
  131. enum Route {
  132. #[nest("/blog")]
  133. #[route("/")]
  134. Blog {},
  135. #[route("/post/index")]
  136. PostHome {},
  137. #[route("/post/:id")]
  138. Post {
  139. id: usize,
  140. },
  141. #[end_nest]
  142. #[route("/")]
  143. Home {},
  144. #[child("/hello_world")]
  145. HelloWorldRoute(inner::Route)
  146. }