diff --git a/packages/sycamore/Cargo.toml b/packages/sycamore/Cargo.toml index 4a967b7ed..bfd62c7f5 100644 --- a/packages/sycamore/Cargo.toml +++ b/packages/sycamore/Cargo.toml @@ -18,6 +18,7 @@ ahash = "0.7.4" html-escape = { version = "0.2.9", optional = true } indexmap = { version = "1.7.0", features = ["std"] } js-sys = "0.3.55" +once_cell = { version = "1.8.0", optional = true } smallvec = "1.6.1" sycamore-macro = { path = "../sycamore-macro", version = "=0.6.0" } sycamore-reactive = { path = "../sycamore-reactive", version = "=0.6.0" } @@ -47,7 +48,7 @@ wasm-bindgen-test = "0.3.28" [features] default = ["dom"] dom = [] -ssr = ["html-escape"] +ssr = ["html-escape", "once_cell"] serde = ["sycamore-reactive/serde"] [[bench]] diff --git a/packages/sycamore/src/generic_node/ssr_node.rs b/packages/sycamore/src/generic_node/ssr_node.rs index 2d332cb96..34d1b8eef 100644 --- a/packages/sycamore/src/generic_node/ssr_node.rs +++ b/packages/sycamore/src/generic_node/ssr_node.rs @@ -1,20 +1,26 @@ //! Rendering backend for Server Side Rendering, aka. SSR. use std::cell::RefCell; +use std::collections::HashSet; use std::hash::{Hash, Hasher}; use std::rc::{Rc, Weak}; use ahash::AHashMap; +use once_cell::sync::Lazy; use wasm_bindgen::prelude::*; use crate::generic_node::{EventHandler, GenericNode}; use crate::reactive::create_root; use crate::template::Template; -static VOID_ELEMENTS: &[&str] = &[ - "area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", - "track", "wbr", "command", "keygen", "menuitem", -]; +static VOID_ELEMENTS: Lazy> = Lazy::new(|| { + vec![ + "area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", + "source", "track", "wbr", "command", "keygen", "menuitem", + ] + .into_iter() + .collect() +}); /// Inner representation for [`SsrNode`]. #[derive(Debug, Clone)] @@ -321,7 +327,7 @@ impl WriteToString for Element { } // Check if self-closing tag (void-element). - if self.children.is_empty() && VOID_ELEMENTS.iter().any(|tag| tag == &self.name) { + if self.children.is_empty() && VOID_ELEMENTS.contains(self.name.as_str()) { s.push_str("/>"); } else { s.push('>');