因为 lit-html 更新 dom 使用的方式和 virtual dom 不一样,所以,简单实现一下 lit-html。

在线 Demo

lit-html 对外暴露一个 html 字符串模板函数,并使用 render 函数渲染。

https://zhoukekestar.github.io/toy-lit-html/index.html

<script type="module">
  import { html, render } from './lit.js';

  const helloTemplate = (name1, name2) => html`
    <div>hi ${name1} !</div>
    <div>hello ${name2} ?</div>
  `

  render(helloTemplate('foo', 'bar'), document.body)

  window.onclick = () => {
    render(helloTemplate('jucy' + Math.random(), 'bob'), document.body)
  }

</script>

效果

首次渲染为 foo、bar,然后点击页面,渲染 jucy、bob,且仅更新对应的 text 节点。

再次多次点击,bob 由于没有更新相关的值,所以后续的每次更新,bob 节点都无变化。

Execute flow

真实的 lit-html 大致执行顺序。

源码

https://github.com/zhoukekestar/toy-lit-html