Improving the performance of DOM node creation

This commit is contained in:
Pauan 2019-06-16 01:59:22 +02:00
parent 6fedf2c71a
commit 02337c2d74
3 changed files with 21 additions and 12 deletions

View File

@ -252,7 +252,11 @@ impl Dom {
}
// TODO create HTML / SVG specific versions of this ?
#[inline]
pub fn create_element<A>(name: &str) -> A where A: JsCast {
document().create_element(name).unwrap_throw().dyn_into().unwrap_throw()
}
#[inline]
pub fn create_element_ns<A>(name: &str, namespace: &str) -> A where A: JsCast {
document().create_element_ns(Some(namespace), name).unwrap_throw().dyn_into().unwrap_throw()

View File

@ -13,23 +13,27 @@ macro_rules! __internal_builder_method {
}
#[doc(hidden)]
#[macro_export]
macro_rules! builder {
($namespace:expr, $default:ty, $kind:expr => $t:ty) => {
$crate::builder!($namespace, $default, $kind => $t, {})
macro_rules! __internal_builder {
($default:ty, $name:ident => $make:expr, $kind:expr => $t:ty) => {
$crate::__internal_builder!($default, $name => $make, $kind => $t, {})
};
($namespace:expr, $default:ty, $kind:expr => $t:ty, { $($methods:tt)* }) => {{
let a: $t = $crate::create_element_ns($kind, $namespace);
($default:ty, $name:ident => $make:expr, $kind:expr => $t:ty, { $($methods:tt)* }) => {{
let a: $t = {
let $name = $kind;
$make
};
let b = $crate::DomBuilder::new(a);
let c = $crate::__internal_builder_method!(b, $($methods)*);
$crate::DomBuilder::into_dom(c)
}};
($namespace:expr, $default:ty, $kind:expr) => {
$crate::builder!($namespace, $default, $kind => $default)
($default:ty, $name:ident => $make:expr, $kind:expr) => {
$crate::__internal_builder!($default, $name => $make, $kind => $default)
};
($namespace:expr, $default:ty, $kind:expr, { $($methods:tt)* }) => {
$crate::builder!($namespace, $default, $kind => $default, { $($methods)* })
($default:ty, $name:ident => $make:expr, $kind:expr, { $($methods:tt)* }) => {
$crate::__internal_builder!($default, $name => $make, $kind => $default, { $($methods)* })
};
}
@ -37,7 +41,7 @@ macro_rules! builder {
#[macro_export]
macro_rules! html {
($($args:tt)+) => {
$crate::builder!($crate::HTML_NAMESPACE, $crate::HtmlElement, $($args)+)
$crate::__internal_builder!($crate::HtmlElement, kind => $crate::create_element(kind), $($args)+)
};
}
@ -45,7 +49,7 @@ macro_rules! html {
#[macro_export]
macro_rules! svg {
($($args:tt)+) => {
$crate::builder!($crate::SVG_NAMESPACE, $crate::SvgElement, $($args)+)
$crate::__internal_builder!($crate::SvgElement, kind => $crate::create_element_ns(kind, $crate::SVG_NAMESPACE), $($args)+)
};
}

View File

@ -145,6 +145,7 @@ pub(crate) fn insert_children_signal_vec<A>(element: Node, callbacks: &mut Callb
let mut has_inserts = false;
// TODO is it worth it to use fragments ?
let fragment = document().create_document_fragment();
for dom in state.children.iter_mut() {