️ Mejora rendimiento del renderizado de páginas

This commit is contained in:
Manuel Cillero 2024-12-28 12:30:05 +01:00
parent cffffe02d6
commit 8a184c38b6
6 changed files with 22 additions and 109 deletions

View file

@ -96,7 +96,6 @@ async fn mdbook_page(
.with_assets(AssetsOp::AddJavaScript(JavaScript::from(
"/mdbook/navigators.js",
)))
.with_body_skip_to("mdbook")
.with_component(Html::with(html! {
div id="mdbook" {
(PreEscaped(&html[beginning..]))

View file

@ -6,9 +6,3 @@ pub use after_render_component::*;
mod render_component;
pub use render_component::*;
mod before_render_page_body;
pub use before_render_page_body::*;
mod after_render_page_body;
pub use after_render_page_body::*;

View file

@ -1,37 +0,0 @@
use crate::prelude::*;
use crate::base::action::FnActionWithPage;
pub struct AfterRenderBody {
f: FnActionWithPage,
theme_type_id: Option<UniqueId>,
}
impl ActionTrait for AfterRenderBody {
fn theme_type_id(&self) -> Option<UniqueId> {
self.theme_type_id
}
}
impl AfterRenderBody {
pub fn new(theme: ThemeRef, f: FnActionWithPage) -> Self {
AfterRenderBody {
f,
theme_type_id: Some(theme.type_id()),
}
}
#[inline(always)]
#[allow(clippy::inline_always)]
pub(crate) fn dispatch(page: &mut Page) {
dispatch_actions(
&ActionKey::new(
UniqueId::of::<Self>(),
Some(page.context().theme().type_id()),
None,
None,
),
|action: &Self| (action.f)(page),
);
}
}

View file

@ -1,37 +0,0 @@
use crate::prelude::*;
use crate::base::action::FnActionWithPage;
pub struct BeforeRenderBody {
f: FnActionWithPage,
theme_type_id: Option<UniqueId>,
}
impl ActionTrait for BeforeRenderBody {
fn theme_type_id(&self) -> Option<UniqueId> {
self.theme_type_id
}
}
impl BeforeRenderBody {
pub fn new(theme: ThemeRef, f: FnActionWithPage) -> Self {
BeforeRenderBody {
f,
theme_type_id: Some(theme.type_id()),
}
}
#[inline(always)]
#[allow(clippy::inline_always)]
pub(crate) fn dispatch(page: &mut Page) {
dispatch_actions(
&ActionKey::new(
UniqueId::of::<Self>(),
Some(page.context().theme().type_id()),
None,
None,
),
|action: &Self| (action.f)(page),
);
}
}

View file

@ -12,7 +12,21 @@ pub trait ThemeTrait: PackageTrait + Send + Sync {
vec![("content", L10n::l("content"))]
}
fn render_head(&self, page: &mut Page) -> Markup {
#[allow(unused_variables)]
fn before_render_page_body(&self, page: &mut Page) {}
fn render_page_body(&self, page: &mut Page) -> Markup {
html! {
body id=[page.body_id().get()] class=[page.body_classes().get()] {
(page.context().render_region("content"))
}
}
}
#[allow(unused_variables)]
fn after_render_page_body(&self, page: &mut Page) {}
fn render_page_head(&self, page: &mut Page) -> Markup {
let viewport = "width=device-width, initial-scale=1, shrink-to-fit=no";
html! {
head {
@ -42,12 +56,4 @@ pub trait ThemeTrait: PackageTrait + Send + Sync {
}
}
}
fn render_body(&self, page: &mut Page) -> Markup {
html! {
body id=[page.body_id().get()] class=[page.body_classes().get()] {
(page.context().render_region("content"))
}
}
}
}

View file

@ -23,7 +23,6 @@ pub struct Page {
context : Context,
body_id : OptionId,
body_classes: OptionClasses,
body_skip_to: OptionId,
}
impl Page {
@ -37,7 +36,6 @@ impl Page {
context : Context::new(request),
body_id : OptionId::default(),
body_classes: OptionClasses::default(),
body_skip_to: OptionId::default(),
}
}
@ -85,12 +83,6 @@ impl Page {
self
}
#[fn_builder]
pub fn alter_body_skip_to(&mut self, id: impl Into<String>) -> &mut Self {
self.body_skip_to.alter_value(id);
self
}
#[fn_builder]
pub fn alter_theme(&mut self, theme: &'static str) -> &mut Self {
self.context.alter_assets(AssetsOp::Theme(theme));
@ -155,32 +147,28 @@ impl Page {
&self.body_classes
}
pub fn body_skip_to(&self) -> &OptionId {
&self.body_skip_to
}
// Page RENDER.
pub fn render(&mut self) -> ResultPage<Markup, ErrorPage> {
// Acciones específicas del diseño antes de renderizar el <body>.
action::theme::BeforeRenderBody::dispatch(self);
// Acciones específicas del tema antes de renderizar el <body>.
self.context.theme().before_render_page_body(self);
// Acciones de los paquetes antes de renderizar el <body>.
action::page::BeforeRenderBody::dispatch(self);
// Renderiza el <body>.
let body = self.context.theme().render_body(self);
let body = self.context.theme().render_page_body(self);
// Acciones específicas del diseño después de renderizar el <body>.
action::theme::AfterRenderBody::dispatch(self);
// Acciones específicas del tema después de renderizar el <body>.
self.context.theme().after_render_page_body(self);
// Acciones de los paquetes después de renderizar el <body>.
action::page::AfterRenderBody::dispatch(self);
// Renderiza el <head>.
let head = self.context.theme().render_head(self);
let head = self.context.theme().render_page_head(self);
// Compone la página completa incluyendo los atributos de idioma y dirección del texto.
// Compone la página incluyendo los atributos de idioma y dirección del texto.
let lang = &self.context.langid().language;
let dir = match self.context.langid().character_direction() {
CharacterDirection::LTR => "ltr",