Subtree memorization / reactive templates (#488)
This commit adds subtree memoization to Dioxus. Subtree memoization is basically a compile-time step that drastically reduces the amount of work the diffing engine needs to do at runtime by extracting non-changing nodes out into a static "template." Templates are then understood by the various renderers in the ecosystem as a faster way of rendering the same items. For example, in the web, templates are simply a set of DOM Nodes created once and then cloned later. This is the same pattern frameworks like Lithtml and SolidJS use to achieve near-perfect performance. Subtree memoization adds an additional level of complexity to Dioxus. The RSX macro needs to be much smarter to identify changing/nonchanging nodes and generate a mapping between the Template and its runtime counterparts. This commit represents a working starter point for this work, adding support for templates for the web, desktop, liveview, ssr, and native-core renderers. In the future we will try to shrink code generation, generally improve performance, and simplify our implementation.
This commit is contained in:
1 parent
b32fd2d2cd
commit
047ed1e553
80 files changed
+6774
-2552
No files matched your search
@@ -73,4 +73,44 @@ extern "C" {
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn RemoveAttribute(this: &Interpreter, root: u64, field: &str, ns: Option<&str>);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn CreateTemplateRef(this: &Interpreter, id: u64, template_id: u64);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn CreateTemplate(this: &Interpreter, id: u64);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn FinishTemplate(this: &Interpreter, len: u32);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn EnterTemplateRef(this: &Interpreter, id: u64);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn ExitTemplateRef(this: &Interpreter);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn CreateElementTemplate(
|
||||
this: &Interpreter,
|
||||
tag: &str,
|
||||
root: u64,
|
||||
locally_static: bool,
|
||||
fully_static: bool,
|
||||
);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn CreateElementNsTemplate(
|
||||
this: &Interpreter,
|
||||
tag: &str,
|
||||
id: u64,
|
||||
ns: &str,
|
||||
locally_static: bool,
|
||||
fully_static: bool,
|
||||
);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn CreateTextNodeTemplate(this: &Interpreter, text: &str, root: u64, locally_static: bool);
|
||||
|
||||
#[wasm_bindgen(method)]
|
||||
pub fn CreatePlaceholderTemplate(this: &Interpreter, root: u64);
|
||||
}
|
||||
Reference in new issue
Block a user