Vue 模板是如何编译的?

简介: Vue 模板是如何编译的?

Vue如何进行模板编译

Vue 模板编译是 Vue.js 在运行时将模板字符串转换为渲染函数的过程。Vue 模板编译分为两个主要步骤:

  1. 模板解析: Vue 编译器将模板字符串解析成一个抽象语法树(AST,Abstract Syntax Tree)。AST 是一个树状结构,用于表示模板的抽象结构,包含了模板中的各种元素、指令、插值等信息。
  2. 渲染函数生成: 编译器根据生成的 AST,生成可执行的渲染函数。渲染函数是一个 JavaScript 函数,它接收数据作为参数,并返回虚拟 DOM。这个虚拟 DOM 最终用于渲染真实的 DOM。

下面是一个简单的示例来说明这个过程:

假设有如下的 Vue 模板:

<div id="app">
  <p>{{ message }}</p>
</div>

1.模板解析: 编译器将模板字符串解析成 AST。对于上面的模板,生成的 AST 大致如下:

{
  tag: 'div',
  attrs: [{ name: 'id', value: 'app' }],
  children: [
    {
      tag: 'p',
      children: [
        {
          type: 'text',
          text: '{{ message }}'
        }
      ]
    }
  ]
}

2.渲染函数生成: 根据生成的 AST,生成渲染函数。渲染函数的大致形式如下:

function render() {
  return _c('div', { attrs: { 'id': 'app' } }, [
    _c('p', [_v(_s(message))])
  ])
}
  1. 这里 _c_v_s 等函数是由 Vue 提供的,用于创建虚拟 DOM 节点、文本节点,以及对数据进行字符串化等操作。

一旦渲染函数生成,Vue 就可以利用它来动态地更新视图,根据数据的变化重新生成虚拟 DOM,并将变化应用到实际的 DOM 上。

这个过程在 Vue.js 中是自动进行的,无需直接关注编译的细节。Vue 会在运行时将模板编译成渲染函数,并在组件初始化时执行这个函数。

什么是AST

AST 指的是抽象语法树,它是源代码的抽象语法结构的树状表示。在编译原理中,AST 是一个树状的数据结构,用于表示程序的语法结构,它捕捉了代码的语法信息,但忽略了具体的细节。

在前端领域中,AST 在解析和处理代码时非常有用,特别是在编译器、静态分析工具、代码转换工具(如 Babel)等方面。它可以帮助我们理解代码的结构,进行代码的转换、优化等操作。

对于 Vue.js 中的模板编译过程,AST 的角色是在模板字符串被解析之后,生成一个树状的结构来表示模板的语法。这样的 AST 结构将模板中的元素、指令、插值等抽象成】 节点,形成了一个树状的层次结构,可以通过访问这个结构来理解和处理模板的内容。

例如,对于下面的 Vue 模板:

<div id="app">
  <p>{{ message }}</p>
</div>

生成的简化的 AST 大致如下:

{
  tag: 'div',
  attrs: [{ name: 'id', value: 'app' }],
  children: [
    {
      tag: 'p',
      children: [
        {
          type: 'text',
          text: '{{ message }}'
        }
      ]
    }
  ]
}

这个 AST 表示了模板的结构,其中包含了 div 元素、p 元素以及文本节点 {{ message }}。编译器在处理模板时会生成这样的 AST,然后根据 AST 生成渲染函数,用于动态地渲染视图。

什么模板编译

模板编译是指将 Vue 模板字符串转换为渲染函数的过程。在 Vue.js 中,模板编译是在运行时进行的,它把包含在字符串中的 Vue 模板转换为可以执行的 JavaScript 渲染函数。这个渲染函数用于生成虚拟 DOM,并在数据发生变化时更新实际的 DOM。

模板编译的主要目的有两个:

  1. 提高运行时性能: 编译器将模板转换为渲染函数,避免了在运行时解析和处理模板的开销。这样,Vue 可以在初始化时就生成渲染函数,然后在组件更新时直接调用这个函数,而不需要重新解析模板。
  2. 实现模板语法的功能: Vue 模板语法包括了一些特定的语法和指令,如插值、指令、事件处理等。模板编译的过程中,这些语法和指令会被解析成相应的 JavaScript 代码,以便在渲染函数中执行。

下面是模板编译的基本流程:

  1. 模板解析: 将模板字符串解析成抽象语法树。AST 是一个树状的数据结构,表示了模板的抽象语法结构,包括了元素、指令、插值等信息。
  2. 渲染函数生成: 根据生成的 AST,生成可执行的渲染函数。渲染函数是一个 JavaScript 函数,接收数据作为参数,返回虚拟 DOM。
  3. 运行时使用: 在组件初始化和更新时,调用生成的渲染函数,生成虚拟 DOM,并将其渲染到实际的 DOM 中。

模板编译过程是在组件实例化的过程中完成的,不需要手动调用模板编译的过程。Vue.js 提供了一个编译器来处理这些任务,并将编译结果包含在运行时的 Vue.js 构建中。

目录
相关文章
|
1月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
124 4
|
11天前
|
人工智能 自然语言处理 JavaScript
用 CodeBuddy 搭建Vue框架 像呼吸一样简单
本文介绍如何借助 CodeBuddy 快速创建 Vue 项目。CodeBuddy 是一款支持自然语言编程的工具,能根据用户需求自动生成代码,降低开发门槛。文章详细说明了通过 CodeBuddy 创建 Vue 项目的步骤,包括解决项目创建失败的问题、自动补全代码功能以及启动开发服务器的方法。无论开发者经验如何,CodeBuddy 都能显著提升效率,让开发更专注创意实现。
|
22天前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
2月前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
143 56
|
2月前
|
SQL JavaScript 前端开发
Vue实现动态数据透视表(交叉表)
Vue实现动态数据透视表(交叉表)
190 13
|
2月前
|
数据采集 资源调度 JavaScript
极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图
本文介绍了使用 Vue Flow 绘制流程图的方法与技巧。Vue Flow 是一个灵活强大的工具,适合自定义复杂的流程图。文章从环境要求(Node.js v20+ 和 Vue 3.3+)、基础入门案例、自定义功能(节点与连线的定制、事件处理)到实际案例全面解析其用法。重点强调了 Vue Flow 的高度灵活性,虽然预定义内容较少,但提供了丰富的 API 支持深度定制。同时,文中还分享了关于句柄(handles)的使用方法,以及如何解决官网复杂案例无法运行的问题。最后通过对比 mermaid,总结 Vue Flow 更适合需要高度自定义和复杂需求的场景,并附带多个相关技术博客链接供进一步学习。
|
2月前
|
存储 数据采集 供应链
属性描述符初探——Vue实现数据劫持的基础
属性描述符还有很多内容可以挖掘,比如defineProperty与Proxy的区别,比如vue2与vue3实现数据劫持的方式有什么不同,实现效果有哪些差异等,这篇博文只是入门,以后有时间再深挖。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
5月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
236 1
|
3月前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
3月前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
191 12