From 9a8f958c13a8a87ab4960155f1a2407d0a851b27 Mon Sep 17 00:00:00 2001 From: "pipe.zkk" Date: Fri, 12 Jan 2024 10:26:21 +0800 Subject: [PATCH] Update Code --- _posts/2023-10~12/2023-12-19-virtualdom.md | 1 + _posts/2023-10~12/2023-12-30-virtualdom-2.md | 97 ------------- _posts/2024-01~03/2024-01-10-virtualdom-2.md | 117 ++++++++++++++++ _posts/2024-01~03/2024-01-10-virtualdom-3.md | 137 +++++++++---------- _posts/2024-01~03/2024-01-11-virtualdom-4.md | 18 ++- 5 files changed, 188 insertions(+), 182 deletions(-) delete mode 100644 _posts/2023-10~12/2023-12-30-virtualdom-2.md create mode 100644 _posts/2024-01~03/2024-01-10-virtualdom-2.md diff --git a/_posts/2023-10~12/2023-12-19-virtualdom.md b/_posts/2023-10~12/2023-12-19-virtualdom.md index 7fc1595..3733eac 100644 --- a/_posts/2023-10~12/2023-12-19-virtualdom.md +++ b/_posts/2023-10~12/2023-12-19-virtualdom.md @@ -5,6 +5,7 @@ date: 2023-12-20 tags: [note] --- +维护 DOM 已成 WebApp 时代最大的挑战。 * 背景:是从一开始的静态页面,发展到了 WebApp * Web Application:WebApp 所遇到的问题和挑战 diff --git a/_posts/2023-10~12/2023-12-30-virtualdom-2.md b/_posts/2023-10~12/2023-12-30-virtualdom-2.md deleted file mode 100644 index 7cb558e..0000000 --- a/_posts/2023-10~12/2023-12-30-virtualdom-2.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -layout: post -title: "再谈 Virtual DOM(二)" -date: 2023-12-30 -tags: [note] ---- - - - 接上次 [再谈 Virtual DOM(一)](https://zhoukekestar.github.io/notes/2023/12/20/virtualdom.html) - -* 背景:是从一开始的静态页面,发展到了 WebApp -* Web Application:WebApp 所遇到的问题和挑战 -* 维护 DOM:是最大的挑战之一 -* 更新 DOM:方案与优劣 -* 编写 DOM:HTML 的进化 - - -# 更新 DOM - - 现代框架的主要工作之一,便是维护、更新 DOM,所以,不同的框架便有了不同的实现。VirtualDOM 只是其中之一。 - - 以下是现有主流框架对于更新 DOM 的不同实现: - -### Virtual DOM (Facebook) - - 此处挖坑 - -### Incremental DOM (Google) - - 通过 `elementOpen`, `elementClose` 等函数,在真实 DOM 上做移动(比如 open 就进入子节点,close 就出子节点等等)、对比(tagname、属性是否相同等等)、标记(用于创建新节点、删除没有访问到的节点等等),将每次的 render 后的代码指令(就是 render 函数本身),通过 patch 做一步一步的执行,最终维护 DOM 的更新。 - - 此方案的优势,就是节省内存(相比 VDOM,基本没有额外的大内存开销),劣势是每次都要比对(相比 Lit),且无法有效复用节点,可以查看 [此视频](https://github.com/zhoukekestar/toy-lit-html/tree/main/idom)。 - -```js -var data = { - text: 'Hello World!', - someCondition: true -}; - -function render(data) { - elementVoid('input', '', [ 'type', 'text' ]); - elementOpen('div', '', null); - if (data.someCondition) { - text(data.text); - } - elementClose('div'); -} - -patch(document.body, function() { - render(data); -}); - -``` - -* https://github.com/google/incremental-dom -* https://auth0.com/blog/incremental-dom/ -* https://github.com/zhoukekestar/toy-lit-html/tree/main/idom -* https://www.reddit.com/r/Angular2/comments/8ytfc1/reacts_virtual_dom_vs_angulars_change_detection/ - - -### Lit DOM (Google) - - Lit 的 DOM 维护,在目前这个时间点,个人看来是最优的,也是个人近期项目用的最多的方式。Demo 如下: - -```js -import { html, render } from './lit.js'; - -const helloTemplate = (name1, name2) => html` -
hi ${name1} !
-
hello ${name2} ?
-` - -render(helloTemplate('foo', 'bar'), document.body) -``` - - Lit 总体上看,和 Chrome 浏览器(或者说是标准浏览器接口)做了非常多的复用,使得整体框架非常的简约、优雅。 - -* 首先是使用 `Template Literals` 创建模板(strings、values) - * [Tagged Templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) -* 通过 `