运行时
我们写了一个框架,这个框架为用户提供了一个render函数,这个函数可以把一个js对象渲染成dom元素。
tag属性表示标签名
const obj = {
tag: 'div',
children: [
{
}
]
}
function render (virtualDom,root) {
let el = document.createElement(virtualDom.tag)
if (typeof virtualDom.children === 'string') {
const text = document.createTextNode(obj.children)
el.appendChild(text)
}else if (virtualDom.children) {
// 数组,递归调用 Render,使用 el 作为 root 参数
virtualDom.children.forEach((child) => Render(child, el))
}
}
// 渲染到 body 下
render(obj, document.body)
我们把这个函数提供给用户,这便称为运行时框架。
编译时
但是如果有一天用户说,编写虚拟dom对象太麻烦了,可以直接写html然后转化为虚拟dom对象。
这时候你开始思考,于是你写了一个compiler程序。就是将html转化为虚拟dom对象。然后给用户使用。用户每次使用render之前都需要先通过compiler这个程序进行编译。 这种方式就是先编译后运行的方式。
纯编译时程序
你发挥了想象,可不可以写html后把它转化为命令式的代码,这样我们连render函数都不需要调用了。
<div>
<span>hello world</span>
</div>
const diy = document.createElement('div")
const span = document.createElement('span")
span.innerText = "hello world'
div.appendChild(span)
document.body.appendChild(div)
因此,我们实现了一个纯编译时的框架。
我们可以得出一个框架既可以时纯运行时也可以是纯编译时,也可以是先编译再运行的模式。那这些模式分别有什么优缺点是我们需要讨论的。