Appearance
什么是运行时?
在 Vue3 的 源码中存在一个  runtime-core 的文件夹,该文件夹内存放的就是 运行时 的核心代码逻辑。
 runtime-core 中对外暴露了一个函数,叫做 渲染函数 render
我们可以通过 render 代替 template 来完成 DOM 的渲染:
有些同学可能看不懂当前代码是什么意思,没有关系,这不重要。
html
<!-- 代码存放于demo目录下 -->
<body>
    <div id="app">
        <!-- 目标如下: -->
        <!-- <div class="test">hello render</div> -->
    </div>
</body>
<script>
    const {render,h} = Vue
    // 生成Vnode
    const Vnode = h('div',{
        class:'test'
    },'hello render')
    // 拿到承载的容器
    const container = document.querySelector('#app')
    // 渲染
    render(Vnode,container)
</script>
我们知道,在 Vue 的项目中,我们可以通过 template 渲染 DOM 节点,如下:
html
<template>
	<div class="test">hello render</div>
</template>
但是对于 render 的例子而言,我们并没有使用 template,而是通过了一个名字叫做 render 的函数, 返回了一个不知道是什么的东西,为什么也可以渲染出 DOM 呢?
带着问题,我们来看:
我们知道在上面的代码中,存在一个核心函数:渲染函数 render ,那么这个 render 在这里到底做了什么事情呢?
继续往下看:
假设有一天你希望根据如下数据:
json{ type:'div', props:{ class:test }, children:'hello render' }渲染出这样一个div:
html<div class="test">hello render</div>
那么我们根据这个需求来写出以下代码:
js
// 代码存放于demo文件夹中
const vnode = {
        type:'div',
        props:{
            class:'test'
        },
        children:'hello render'
    }
    // 创建一个 render 函数
    function render(vnode){
        // 根据type创建dom节点
        const ele = document.createElement(vnode.type)
        // 把props中的class赋值给ele的className
        ele.className = vnode.props.class
        // 把children赋值给ele的innerText
        ele.innerText = vnode.children
        // 把ele作为子节点插入body中
        document.body.appendChild(ele)
    }
    render(vnode)
在这样一个代码中,我们成功的通过了一个 render 函数渲染出 了对应的DOM,和前面的 render 示例类似,他们都是渲染了一个 vnode ,这样的代码是不是妙极了!!!
但是呢,你经常这么写,用了一段时间之后,觉得很麻烦,你就想能不能 光写一个HTML标签的格式 来进行渲染呢?
用现在我们已经了解到的知识,是不是不能解决了?
没错,那就不是以上 运行时 的代码可以解决的了!
所以说,我们刚刚编写的这样一段代码,就是运行时的代码“框架”!
最后,做个总结: 运行时可以利用 render 把 vnode 渲染成真实的 dom 节点
Study Note