Vue 原理详解

Vue 原理详解

Vue.js 是一个渐进式框架,它通过数据驱动视图更新和响应式编程使得前端开发变得更加简单高效。在 Vue 的内部实现中,编译过程和响应式机制是两个至关重要的组成部分。本文将详细介绍 Vue.js 的编译器、响应式系统和运行时的工作原理,帮助你更好地理解 Vue 背后的实现。

Compiler 编译器

Vue 的编译器负责将模板(<template>)转换为渲染函数,并且优化模板以提高性能。编译器是 Vue 中非常核心的部分,包含了多个步骤。

template 模板解析

Vue.js 的模板解析过程首先将模板转化为抽象语法树(AST),然后根据 AST 编译出渲染函数。

1. 模板解析过程

Vue 使用一个自定义的 HTML 解析器来将模板字符串转换为抽象语法树(AST)。这一过程会分析模板中的 HTML 标签、指令、事件和表达式。模板解析的步骤如下:

  1. 标记解析:Vue 会解析模板中的所有 HTML 标签、属性、事件绑定、指令等,构建一个表示 HTML 结构的 AST。
  2. 指令解析:Vue 会识别并解析模板中的指令(如 v-bindv-modelv-if 等),并将其转换成 AST 中的特定节点。
  3. 事件绑定解析:对于模板中的事件绑定(如 @click),Vue 会将其转换为相应的事件处理节点。
2. 抽象语法树(AST)

AST 是 Vue 用来表示模板结构的数据结构。它抽象了模板中的元素,并用树形结构来表达元素之间的关系。AST 节点可以表示标签、指令、文本等。

3. 静态优化

在编译过程中,Vue 会对静态内容进行优化。例如,如果某个部分是静态的(不会随着数据变化而改变),Vue 会标记这些部分为静态节点。这样在更新视图时,就可以跳过这些静态部分,从而提高渲染效率。

style 样式解析

Vue 组件的 <style> 标签包含了样式部分。在 Vue 编译过程中,<style> 标签的内容会被处理为全局样式或作用域样式。Vue 提供了 scoped 特性来为组件内的样式添加作用域,避免样式冲突。

1. 全局样式 vs 作用域样式
  • 全局样式:如果组件中没有添加 scoped,则该样式会作为全局样式生效。
  • 作用域样式:当使用 scoped 时,Vue 会为该组件的样式添加独特的类名,使得这些样式仅作用于该组件内部的元素。
2. 样式作用域的实现

Vue 使用一个构建工具(如 Vue CLI 或 Vite)来处理作用域样式。通过给每个组件的根元素添加唯一的属性(如 data-v-xxxx),并将样式的选择器做相应的修改,确保样式只作用于当前组件的元素。

3. CSS 预处理

Vue 还支持 CSS 预处理器,如 Sass、Less 等。如果 <style> 标签的 lang 属性指定了某个预处理器(如 lang="scss"),Vue 会使用相应的预处理器来编译样式代码。

script 脚本解析

Vue 单文件组件中的 <script> 标签用于定义组件的 JavaScript 逻辑。Vue 编译器会解析 <script> 部分,提取并生成对应的 JavaScript 代码。

1. 组件选项对象

Vue 会从 <script> 中提取出组件的选项对象,常见的选项包括:

  • data:组件的数据。
  • methods:组件的方法。
  • computed:计算属性。
  • props:传递给组件的属性。
  • 生命周期钩子:如 createdmountedupdated 等。
2. ES6 模块化

Vue 单文件组件支持 ES6 模块化,可以使用 importexport 来导入和导出模块。Vue 会解析 <script> 中的 import 语句,自动引入依赖的模块,并在构建时进行打包。

3. TypeScript 支持

Vue 还支持在 <script> 标签中使用 TypeScript。通过 lang="ts" 属性,Vue 会解析 TypeScript 代码,并使用相应的工具(如 ts-loaderbabel)将 TypeScript 转换为 JavaScript。

Reactivity 响应式

Vue 的响应式系统是 Vue.js 的核心之一,负责自动跟踪组件的数据变化并更新视图。

Proxy

Vue 3 使用 Proxy 来实现响应式。Proxy 是 JavaScript 中的一个新特性,它允许你通过代理对象来定义对象属性的行为。Vue 使用 Proxy 来拦截对象的读取和修改操作,从而实现响应式数据的追踪。

1. 数据代理

通过 Proxy,Vue 可以拦截对数据的读取、修改等操作,并在数据变化时自动更新视图。

const state = new Proxy({}, {get(target, key) {// track data accessconsole.log(`Getting ${key}`);return target[key];},set(target, key, value) {// trigger update when data changesconsole.log(`Setting ${key} to ${value}`);target[key] = value;return true;}
});

Reflect

Reflect 是 JavaScript 中的另一个新特性,它是对 Proxy 操作的底层处理的封装。Vue 在使用 Proxy 时,会结合 Reflect 来执行对象的默认行为。例如,使用 Reflect 来读取或修改对象的属性时,Proxy 会通过 Reflect 调用原对象的操作,从而确保对象操作的正确性。

track、trigger

  • track:当组件的模板中访问了某个响应式数据时,Vue 会通过 track 函数将该数据与视图关联。track 会记录哪些组件依赖于哪些响应式数据。
  • trigger:当响应式数据发生变化时,Vue 会通过 trigger 函数触发视图更新。trigger 会通知所有依赖该数据的组件重新渲染。

Runtime 运行时

Vue 的运行时部分负责将模板编译成渲染函数并执行这些渲染函数来更新视图。

指令的处理

Vue 使用指令(如 v-ifv-forv-bind 等)来操作 DOM。当 Vue 在渲染过程中遇到指令时,会根据指令的类型执行相应的操作。

1. 指令的生命周期

Vue 会在不同的阶段执行指令的钩子函数,包括:

  • bind:指令与元素绑定时调用。
  • inserted:元素被插入到 DOM 中时调用。
  • update:数据更新时调用。
  • unbind:指令与元素解绑时调用。

DOM 渲染

在 Vue 中,DOM 渲染分为以下几个步骤:

  1. 初始渲染:Vue 会通过渲染函数(由模板编译而来)生成虚拟 DOM,并将其映射到实际的 DOM 元素上。
  2. 数据变化:当数据发生变化时,Vue 会通过虚拟 DOM 比对(即 DOM diff 算法)计算出哪些部分需要更新,然后更新实际 DOM。

总结

Vue.js 的工作原理分为多个部分,其中编译器、响应式系统和运行时是最核心的组成部分。通过编译器,Vue 将模板解析为渲染函数,并优化静态内容;通过响应式系统,Vue 能够高效地追踪数据变化,并在变化时更新视图;而在运行时,Vue 会处理 DOM 渲染和指令执行,使得组件能够根据数据自动更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PS的功能学习

背景差色较大&#xff0c;就魔棒 魔棒的连续就是倒水点的跨越问题 魔棒的容差的选择就有点看经验了&#xff0c;看颜色的统一程度选择 Ctrl D 取消当前所有的选区 至于快速选择工具&#xff0c;和对象选择工具也差不多&#xff0c;只不过控制范围变成了一块一块的&#x…

深度学习实验--初步探索数据增强、优化器对模型的影响

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这次主要是探究&#xff0c;优化器、数据增强对模型训练的影响&#xff1b;基础篇还剩下几个, 后面的难度会逐步提升;越学&#xff0c;越觉得这个东西很…

新型大语言模型的预训练与后训练范式,谷歌的Gemma 2语言模型

前言&#xff1a;大型语言模型&#xff08;LLMs&#xff09;的发展历程可以说是非常长&#xff0c;从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初&#xff0c;LLM的训练过程只关注预训练&#xff0c;但后来逐步扩展到了包括预训练和后训练在内的完整…

SQL Server管理员sa登录失败原因

文章目录 一、开启混合登录模式二、启用sa三、更改密码四、登录sa一、开启混合登录模式 用Windows身份登录数据库服务。 在连接名上右键→属性。 在安全性选项卡下,选择【SQL Server和Windows身份验证模式】,点击【确定】,提示需要重启服务。 Win+R,输入指令:services.ms…

logminer挖掘日志归档查找问题

--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…

如何监控Elasticsearch集群状态?

大家好&#xff0c;我是锋哥。今天分享关于【如何监控Elasticsearch集群状态&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何监控Elasticsearch集群状态&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 监控 Elasticsearch 集群的状态对于确保…

C# 集合(Collection)

文章目录 前言一、动态数组&#xff08;ArrayList&#xff09;二、哈希表&#xff08;Hashtable&#xff09;三、排序列表&#xff08;SortedList&#xff09;四、堆栈&#xff08;Stack&#xff09;五、队列&#xff08;Queue&#xff09;六、点阵列&#xff08;BitArray&…

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

【Redis】Redis介绍

目录 1.Redis是什么? 2. Redis特性 2.1 速度快 2.2 基于键值对的数据结构服务器 2.3 丰富的功能 2.4 简单稳定 2.5 客户端语言多 2.6 持久化 2.7 主从复制 2.8 高可用和分布式 3. Redis使用场景 3.1 缓存(Cache) 3.2 排行榜系统 3.3 计数器应用 3.4 社交网络 …

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…

STM32 ADC --- 多通道序列采样

STM32 ADC — 序列通道采样 文章目录 STM32 ADC --- 序列通道采样CubeMX配置代码编写总结 CubeMX配置 使用cubeMX生成HAL工程 扫描模式在配置多个通道时会自动变为Enable&#xff0c;这里需要注意的是需要将连续转换模式配置为Disable&#xff0c;将结束转换选择选择为每个通道…

C语言数据结构——详细讲解《队列》

C语言数据结构——详细讲解《队列》 前言一、队列的概念二、队列的操作&#xff08;一&#xff09;定义队列结构&#xff08;二&#xff09;初始化队列&#xff08;三&#xff09;入队列操作&#xff08;四&#xff09;出队列操作&#xff08;五&#xff09;获取队头元素&#…

【游资悟道】-作手新一悟道心法

作手新一经典语录节选&#xff1a; 乔帮主传完整版&#xff1a;做股票5年&#xff0c;炼成18式&#xff0c;成为A股低吸大神&#xff01;从小白到大神&#xff0c;散户炒股的六个过程&#xff0c;不看不知道自己水平 围着主线做&#xff0c;多研究龙头&#xff0c;研究涨停&am…

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

使用pymupdf提取PDF文档中的文字和其颜色

最近我在捣鼓一个PDF文件&#xff0c;想把它里面的文字和文字颜色给提取出来。后来发现有个叫pymupdf的库能搞定这事儿。操作起来挺简单的&#xff0c;pymupdf的示例文档里就有现成的代码可以参考。 how-to-extract-text-with-color 我本地的测试代码如下&#xff1a; impor…

STM32 + CubeMX + 串口 + IAP升级

这篇文章分享一个简单的串口IAP Demo&#xff0c;实现使用串口更新我们自己的App程序。 目录 一、IAP简介二、Stm32CubeMx配置三、Boot代码及配置1、代码2、配置 四、App代码及配置1、代码2、配置 五、效果展示 一、IAP简介 IAP介绍可以在网上找找&#xff0c;相关资料很多&am…

A051-基于Spring Boot的网络海鲜市场系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

《String类》

目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法&#xff1a;按照字典序比较 4.1.3 int compareTo(Strin…

探讨播客的生态系统

最近对播客发生了兴趣&#xff0c;从而引起了对播客背后的技术&#xff0c;生态的关注。本文谈谈播客背后的技术生态系统。 播客很简单 播客&#xff08;podcast&#xff09;本质上就是以语音的方式发布信息。它和博客非常类似。如果将CSDN 网站上的文字加一个语音播报。CSDN …