渲染器 ( renderer )的作用是把虚拟 DOM 渲染为特定平台上的真实元素。在浏览器平台上,渲染器会把虚拟 DOM 渲染成真实 DOM 元素。
    虚拟DOM用英文表示为 virtual DOM ,通常简写为 vdom 或者 vnode 。
    渲染器把虚拟DOM节点渲染为真实DOM节点的过程叫做挂载,通常用英文mount来表示。例如Vue.js组件中的 mounted 钩子就会在挂在完成时触发。这就意味着,在mounted钩子中可以访问真实DOM元素。
    渲染器通常需要接收一个挂载点作为参数,用来指定具体挂载地址。这里的“挂载点”其实就是一个DOM元素,渲染器会把这个 DOM 元素作为容器节点,将内容渲染到容器下。用英文container来表达容器。

    1. function createRenderer(){
    2. function render(vnode , container){
    3. //....
    4. }
    5. return {
    6. render
    7. }
    8. }

    有了渲染器我们就可以用它来进行渲染了

    1. const renderer = createRenderer()
    2. //首次渲染
    3. renderer.render(vnode,document.querySelector('#app'))
    4. //第二次次渲染
    5. renderer.render(newVnode,document.querySelector('#app'))

    如果在同一个container内进行多次渲染,因为旧的vnode已经挂载在container中了,当再次进行渲染时就不能简单进行挂载动作了。在这种情况下渲染器会比较两个vnode,试图找到跟更新变更点。这个过程叫做打补丁(或更新),英文用 patch 表达。实际上挂载动作也可以看作是一种 patch ,只是它的旧vnode不存在。
    加入patch之后代码如下:

    1. function createRenderer(){
    2. function render(vnode,container){
    3. if(vnode){
    4. //如果vnode存在,将其与旧vnode一起传递给patch,进行打补丁
    5. patch(container._vnode,vnode,container)
    6. }else{
    7. //如果不存在,说明是卸载操作
    8. container.innerHTML = ""
    9. }
    10. //保存vnode为旧vnode
    11. container._vnode = vnode
    12. //...
    13. }
    14. return {
    15. render
    16. }
    17. }