VueJs设计与实现笔记
本文记录霍春阳-《VueJs设计与实现》阅读过程中的一些笔记
第一章
命令式与声明式
视图框架通常分为命令式与声明式,各自有优点,声明式代码的性能不优与命令式代码的性能
运行时与编译时
一个框架可以是运行时、编译时以及运行时+编译时。
举个例子,现在有一个render函数
function Render(obj,root) {
const el = document.createElement(obj.tag)
if( typeof obj.children === "string" ){
const text = document.createTextNode(obj.children)
el.appendChild(text)
} else if (obj.children) {
obj.children.forEach(child => Render(child,el))
}
root.appendChild(el)
}
用户可以这样使用:
Render({
tag:"div",
children:[{
tag:"span",
children:"Hello world"
}]
},document.body)
上述就是一个纯运行时的功能,但用户会觉得Render函数调用太复杂,直接使用HTML标签的描述方式来调用更直观,于是便引入编译器实现如下功能
<div>
<span>Hello world</span>
</div>
编译为
{
tag:"div",
children:[{
tag:"span",
children:"Hello world"
}]
}
然后再调用Render函数得到了一样的结果,上述过程就是 编译时 + 运行时。
而纯编译时就是直接编译为命令式代码,Render函数也省了
<div>
<span>Hello world</span>
</div>
编译为
const div = document.createElement('div')
const span = document.createElement('span')
span.innerText = 'hello world'
div.appendChild(span)
document.body.appendChild(div)
编译时代码运行效率更高,性能可能会更好,但没有什么灵活性,纯运行时又无法提前分析用户代码进而优化,VueJs采用的编译时+运行时架构,在保持灵活性的同时尽可能地优化代码