Vue.js渲染过程之从Template模板到VNode的转化路径

梦雪吖_7745

梦雪吖_7745

2026-04-12

1027人浏览

原创

Vue模板渲染核心是模板→AST→渲染函数→VNode的四阶段流水线:先解析模板为静态AST树,再编译为可执行render函数,执行后生成含type/props/children等字段的VNode对象树。

vue.js渲染过程之从template模板到vnode的转化路径

Vue.js 的模板渲染过程,核心是将开发者编写的 字符串(或 DOM 模板)逐步解析、编译为可执行的 JavaScript 对象——即 VNode(虚拟节点),最终由 patch 算法驱动真实 DOM 更新。这个转化不是一步到位,而是分阶段、有明确职责的流水线。

模板字符串 → AST 抽象语法树

Vue 在编译阶段(运行时编译或构建时预编译)首先对模板进行词法分析和语法分析,生成一棵结构化的 AST 节点树。每个 AST 节点描述了模板中一个语法单元:比如元素节点(div)、文本节点({{ msg }})、指令(v-if、v-for)、属性(:id)、插槽等。

关键点:

  • AST 不含运行时逻辑,纯静态结构,便于后续优化(如静态提升、hoist 静态节点)
  • 模板中的 Mustache 表达式({{ }})会被解析为 expression 字段,保留原始字符串以便后续生成渲染函数时调用 with(this){...} 或作用域插值
  • 指令和绑定属性被提取并挂载到对应 AST 节点的 directives 或 attrsList/attrsMap 中

AST → 渲染函数(Render Function)

接下来,Vue 的编译器遍历 AST,递归地将其转换为可执行的 JavaScript 函数体代码(字符串),再通过 new Function() 动态生成渲染函数(render)。这个函数在组件实例化后被调用,返回 VNode。

例如:

{{ text }}
会生成类似这样的渲染函数片段:

h('div', { id: 'app', class: this.cls }, [this.text])

其中 h 是 createElement 的别名(Vue 3 中为 h(),Vue 2 中常为 vm.$createElement)。

Vue Wrap
Vue Wrap

Vue 入门指南 — JavaScript 框架

下载

注意:

  • 模板编译只发生在首次(或热更新时),生成的 render 函数会被缓存,避免重复解析
  • 使用单文件组件(.vue)时, 默认由 @vue/compiler-sfc 编译;若手写 render 函数,则跳过此步
  • Vue 3 的编译器更激进地做静态分析,比如自动将纯静态节点标记为 isStatic,并在生成 VNode 时复用(cloneVNode)以减少创建开销

渲染函数执行 → VNode 对象树

当组件首次挂载或响应式数据变化触发更新时,Vue 会执行 render() 函数。该函数内部调用 h()(或 createElement),按参数逐层构造标准的 VNode 对象:

  • type:标识类型(字符串表示原生标签,组件对象表示自定义组件,Fragment / Teleport 等特殊类型)
  • props:归一化后的属性对象(含事件、指令钩子、class/style 合并结果)
  • children:子节点数组,可能是字符串(文本)、VNode、或 undefined/空数组
  • key、ref、scopeId 等用于 diff 和生命周期管理的元信息

此时得到的是一棵内存中的轻量级对象树,与真实 DOM 完全解耦,具备跨平台能力(如服务端渲染、小程序适配)。

VNode → 真实 DOM(补充说明)

虽然问题聚焦“到 VNode”,但需明确:VNode 本身不操作 DOM。它交由 Vue 的 renderer(渲染器)模块处理。在浏览器环境中,renderer 的 patch 函数对比新旧 VNode 树(Diff 算法),最小化地增删改真实 DOM 节点,并同步更新组件实例的 $el 引用。

这一阶段属于“VNode 的消费”,而非“生成”,但它是整个路径闭环的关键落点。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2703

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5863

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6830

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6558

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

943

5

vue2.0和3.0区别
vue2.0和3.0区别

vue2.0和3.0区别:vue2的响应式原理是利⽤“Object.defineProperty()”对数据进⾏劫持结合发布订阅模式的⽅式来实现,vue3中使⽤了es6的proxy API对数据代理,实现对数据的监控。本专题为大家提供vue2.0和3.0区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.17

1714

5

vue3的生命周期有哪些
vue3的生命周期有哪些

vue3的生命周期:1、beforecreate;2、created;3、beforemount;4、mounted;5、beforeupdate;6、updated;7、beforedestroy;8、destroyed;9、activated;10、deactivated等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

12322

5

Vue3组合式API与组件开发实战
Vue3组合式API与组件开发实战

本专题讲解 Vue 3 组合式 API 的核心概念与应用技巧,深入分析响应式系统、生命周期管理、组件设计与复用策略。通过完整项目案例,指导前端开发者实现高性能、结构清晰的 Vue 应用,提升开发效率与代码可维护性。

2026.02.10

316

23

vue.js为什么报错
vue.js为什么报错

vue.js报错的原因:1、语法错误;2、组件使用不当;3、数据绑定问题;4、生命周期钩子使用不当;5、插件或依赖问题;6、路由配置错误;7、异步操作处理不当等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.11

2947

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app快速上手
uni-app快速上手

共0课时 | 0人学习

Vue 教程
Vue 教程

共42课时 | 17.3万人学习