精读《Vuejs设计与实现》(11)之模板初解

133 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

3.4 模板的工作原理

虽然vue中使用了虚拟dom,但其实我们平常写的最多的还是模板,也就是.vue文件中的template.

image.png 这里就需要一个关键的东西:编译器。其实每个编程语言都会有编译器,通常我们把你写出来的代码,翻译成计算机识别的机器码,这个过程叫做编译。

我这里的编译定义比较狭隘,主要指的是把.vue文件,转换成js代码的过程。

我们都知道一个vue文件基本长这样

<template>
    <p>123</p>
</template>
<script>
export defineComponent({
    name:'App'
})
</script>
<style></style>

当我们把这个vue文件转换为js时

export default {
 name:'App',
 render(){
  return h('p','123')
 }

}

这里面就是编译器需要做的了,原书中这一章也讲的很简单。

3.5 Vuejs是各个模块组成的有机整体

在vue中,组件的实现依赖渲染器,模板的使用依赖编译器,二者中间的联系就是虚拟DOM。通过各个模块间的有机组合,才产生了vue这个框架。

我们还看我上面这个例子,稍微增加一点东西。模板里加上一个动态class名。

<p :class='cls'>123</p> 然后转换js的时候,就会变成这样,其中cls就成了变量。

export default {
 name:'App',
 render(){
  return h('p',{className:cls},'123')
 }

}

我们都知道vue3对于模板编译有一个小创新,就是把模板的变化的部分标记出来,那么我们也可以在虚拟dom中新增一个字段

export default {
 name:'App',
 render(){
  return h(
      'p',
      {
          className:cls,
          _patchFlag:1
      },
  '123'
  )
 }

}

我们假设_patchFlag === 1时,表示className是动态的,那么我们就可以定义各种_patchFlag,在渲染器中就可以根据这个字段做相应的优化,更快更有效率的渲染,这也算是vue3的一点创新。

总结

这一章,讲了vue3的设计思路,首先说了vue3是声明式渲染,因为声明式渲染,因此需要虚拟dom,再需要渲染器把虚拟dom变为真实dom.

再由于vue单文件组件的设计,因此需要一个编译器来解决。

这些其实就是vue的几个主要模块了,后续就进入到了第二篇:响应系统