Create a Static Site Generation platform; Deduplicate hot reloading code (#2226)

* create static site generation helpers in the router crate

* work on integrating static site generation into fullstack

* move ssg into a separate crate

* integrate ssg with the launch builder

* simplify ssg example

* fix static_routes for child routes

* move CLI hot reloading websocket code into dioxus-hot-reload

* fix some unused imports

* use the same hot reloading websocket code for fullstack

* fix fullstack hot reloading

* move cli hot reloading logic into the hot reload crate

* ssg example working with dx serve

* add more examples

* fix clippy

* fix formatting

* fix hot reload doctest imports

* fix axum imports

* don't run server doc tests

* Fix hot reload websocket doc examples
This commit is contained in:
Evan Almloff authored and GitHub committed 2024-05-22 07:24:15 -05:00
1 parent 460b70e0f0
commit 245003a5d4
59 files changed
+1507 -791

No files matched your search

+25 -5
View File
@@ -29,14 +29,21 @@ pub struct DefaultRenderer {
impl Default for DefaultRenderer {
fn default() -> Self {
let before = r#"<!DOCTYPE html>
let title = dioxus_cli_config::CURRENT_CONFIG
.as_ref()
.map(|c| c.dioxus_config.application.name.clone())
.unwrap_or("Dioxus Application".into());
let before = format!(
r#"<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dioxus Application</title>
<title>{}</title>
</head>
<body>"#;
<body>"#,
title
);
let after = r#"</body>
</html>"#;
Self {
@@ -68,6 +75,7 @@ pub struct IncrementalRendererConfig {
invalidate_after: Option<Duration>,
map_path: Option<PathMapFn>,
clear_cache: bool,
pre_render: bool,
}
impl Default for IncrementalRendererConfig {
@@ -85,6 +93,7 @@ impl IncrementalRendererConfig {
invalidate_after: None,
map_path: None,
clear_cache: true,
pre_render: false,
}
}
@@ -119,19 +128,30 @@ impl IncrementalRendererConfig {
self
}
/// Set whether to include hydration ids in the pre-rendered html.
pub fn pre_render(mut self, pre_render: bool) -> Self {
self.pre_render = pre_render;
self
}
/// Build the incremental renderer.
pub fn build(self) -> IncrementalRenderer {
let static_dir = self.static_dir.clone();
let mut ssr_renderer = crate::Renderer::new();
if self.pre_render {
ssr_renderer.pre_render = true;
}
let mut renderer = IncrementalRenderer {
static_dir: self.static_dir.clone(),
memory_cache: NonZeroUsize::new(self.memory_cache_limit)
.map(|limit| lru::LruCache::with_hasher(limit, Default::default())),
invalidate_after: self.invalidate_after,
ssr_renderer: crate::Renderer::new(),
ssr_renderer,
map_path: self.map_path.unwrap_or_else(move || {
Arc::new(move |route: &str| {
let (before_query, _) = route.split_once('?').unwrap_or((route, ""));
let mut path = static_dir.clone();
for segment in route.split('/') {
for segment in before_query.split('/') {
path.push(segment);
}
path