Vue3跟Vue2比,性能真的有所提升吗?

答案是肯定的。 


说起Vue3的改进,很多人都会说出响应式的改变,与Vue2相比,Vue3采用了proxy的方式对响应式做了重写,而Vue2则是采用defineProperty的方式将对象的属性进行深度遍历,而这种方式想要实现响应式的前与后,就需要给每个属性添加settergetter。但Vue3做了改进,通过使用proxy的方式,则不需要深度遍历了,他实现了删除属性的监听数组索引的监听以及动态属性添加的监听

这些我发现很多人都是可以回答出来的,但这些回答远远是不够的,下面我们说一些在面试中需要更丰富的回答。

目录

1 源码体积有所减少

1.1 源码体积很重要?

1.2 做了哪些优化?

1.3 用代码举例子

2 开发以及编辑阶段

2.1 静态片段

2.2 动态事件的缓存

2.3 元素静态提升

2.4 diff算法的更新

3 Vue2的更新汇总一下

4 吐槽两句 


1 源码体积有所减少

1.1 源码体积很重要?

源码体积是一个非常重要的指标。较大的源码体积会增加应用程序的加载时间,导致性能下降,并可能影响用户体验。此外,对于移动端或者网络条件较差的用户来说,大体积的源码可能会导致加载过慢甚至加载失败的问题。

1.2 做了哪些优化?

Vue 3 在许多方面都进行了优化,其中之一就是源码体积的减小。这得益于更好的 Tree-shaking 支持、源码重写以及按需引入 API 等改进。

任何一个函数,如ref、reavtived、computed等,仅仅在用到的时候才打包,从而使打包的整体体积变小。

1.3 用代码举例子

即便你没有使用过Vue3,那么在回答问题的时候也应该有所体现,尤其是开发人员,代码体现很重要,你可以使用这面这段真实业务场景的代码示例,代码如下:

// vue3代码import { ref, reactive, computed } from 'vue';// 只有在使用时才会引入相关模块
const data = ref(0); // ref 模块
const obj = reactive({ value: 0 }); // reactive 模块
const double = computed(() => data.value * 2); // computed 模块console.log(data.value); // 打包时只包含 ref 相关的代码
console.log(obj.value); // 打包时只包含 reactive 相关的代码
console.log(double.value); // 打包时只包含 computed 相关的代码

2 开发以及编辑阶段

2.1 静态片段

如果你需要开发的组件中,静态HTML内容较多,或者已经达到一定的量级的时候,框架中有createStaticVNode在客户端去生成一个static node,也就是静态node片段,会被直接innerHTML到目标节点上,就不需要创建对象,然后根据对象渲染

编译前的代码片段

div><div><div><span>内容1</span></div></div>...  // 这里有N个内容<div><span>{{ contentMsg }}</span></div>
</div>

编译后的代码片段:

import { mergeProps as _mergeProps } from "vue"
import { ssrRenderAttrs as _ssrRenderAttrs, ssrInterpolate as _ssrInterpolate } from "@vue/server-renderer"export function ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {const _cssVars = { style: { color: _ctx.color }}_push(`<div${_ssrRenderAttrs(_mergeProps(_attrs, _cssVars))}><div><div><span>内容N</span></div></div>...<div><div><span>${_ssrInterpolate(_ctx.contentMsg )}</span></div></div>`)
}
2.2 动态事件的缓存

如果我们在一个元素上添加了click事件,那么这就会被认为是动态绑定的事件,势必会引起监听事件。在Vue3中,对这些动态事件做了监听缓存,有了缓存,那么再涉及到组件有所更新,涉及到diff算法的时候,就可以直接使用了。

例如这是一个组件:

<div><div><div><span @click = 'go2NewPage'>个人中心</span></div></div>
</div>

这里我们去除闲杂代码,展示关键代码,如下: 

export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_createVNode("span", {onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.go2NewPage(...args)))}, "个人中心")]))
}
2.3 元素静态提升

静态提升听着是不是很耳熟,JavaScript里的变量会有变量提升,对吧。那么在Vue3中,如果发现元素不涉及到更新,就可以只创建一次,然后做静态提升。再次更新渲染的时候拿来直接使用。这样做的优点就是避免多次创建,避免重复的操作。我们做开发不一直讲究复用嘛。

例如下面这个元素:

<div>标题一</div>

做了静态提升以后:

const title_1= _createVNode("div", null, "标题一", -1 )export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock(_Fragment, null, [title_1,], 64 ))
}
2.4 diff算法的更新

diff算法是Vue系列的核心之一,所以篇幅会比较长,但你面试的时候不能回答的像老太太裹脚布一样,要有一个明确的目标,首先你对自己要有信心,你需要把这个过程描述清楚,其次不能长篇大论,感觉自己整个面试半个小时都说不完,说不完就表明说不清。但毕竟这是一个复杂的过程,所以你要形象一些的描述,最好稍微体现一下代码功底,表明你至少读过源码即可,点到为止,要不面试官上头了,使劲儿的往下问,你说这可怎么整。

总的来说,Vue3的diff算法添加了静态标记。他的作用是为了会发生变化的地方添加一个静态的flag标记,下次发生变化的时候直接找该地方进行比较

3 Vue2的更新汇总一下

Vue2的更新过程其实已经问了很多年了,但难免还会有面试官非要问一问,不问他心里不舒服,而且这么多年,大家已经整理了无数次这个更新过程,五六年前,高级面试关于这个问题要回答一整篇才能过关呢,不过汇总一下大概就是:

我们创建了watcher实例,用来写业务,初次渲染的时候,会把组件、数据做标记,data也就是那个数据依赖发生变化了,然后触发setter,再通知实例变更。其实就是这么个过程。

 

4 吐槽两句 

其实你会发现,这年头开发人员工作不是那么好找了,但技术一直在进步。所以这就是让很多人很头疼,我这工作还没找到呢,你的框架又更新了,然后面试题也跟着更新了,合着我就别找工作了,一直在家背面试题,看你们更新玩吧。然后我好不容易找到工作了,背了那么多新特性,然后开始写代码了,发现团队还是Vue2。

这里给大家推荐一个优化简历的好东西,看了绝对让你的简历有很大改观,请看:打造优秀的开发求职简历,我也知道你背面试题觉得费时间,我也和很多朋友整理了一全套非常棒的面试题,请看:WEB前端最新面试题 - 又全又卷

有工作的稳住,没工作的加油,在这个环境有点差的时代,我们互相帮助才是重点。 

 

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

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

相关文章

【C语言】扫雷【附源码】

一、扫雷游戏规则 尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。点开的数字是几&#xff0c;则说明该数字旁边的8个位置中有几个雷&#xff0c;如果挖开的是地雷&#xff0c;则会输掉游戏。 二、代码思路&#xff1a; 宏定义&#xff1a; Row 和 Col 定义了棋盘的行数和…

VR在线招聘会在企业与毕业生间搭建沟通新平台

在数字化转型的浪潮中&#xff0c;VR在线招聘会作为一种创新的招聘方式&#xff0c;正逐步成为连接企业、学校和毕业生的重要桥梁。 一、VR在线招聘会的实际意义及其优势 VR技术的应用&#xff0c;让在线招聘会超越了传统线上招聘的局限&#xff0c;提供了更为生动、互动的招聘…

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

京东详情API接口请求代码源码(java)

京东详情API接口是用于获取京东商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于京东详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 京东详情API接口文档 接口地址&#x…

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题&#xff0c;旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征&#xff0c;将鸢尾花分成三个品种&#xff1a;山鸢尾&#xff08;setosa&#xff09;、变色鸢尾&#xff08;versicolor&#xff09;和维吉尼亚…

使用 Go-Ora 连接到 Oracle 数据库

前文 《 一鍵啓動 Oracle 23c Free 》 介绍了如何使用容器技术快速拉起 Oracle 23c 数据库。 这个开发者版本可以很便捷的拉起、测试、销毁&#xff0c;对开发者是非常友好的。 本文将介绍如何使用 Go 语言构建项目&#xff0c;并连接到 Oracle 数据库。 Go 环境配置 本文使用的…

【数据结构与算法】:归并排序和计数排序

1. 归并排序 归并排序是一种效率仅次于快速排序的排序算法。它有非递归和递归两种实现方式(本文只讲述递归实现&#xff0c;非递归实现以后有专门的文章)。 其实&#xff0c;归并排序也叫外排序。它不仅可以对内存中的数据进行排序&#xff0c;还能对文件里的数据排序。 比如&…

LeetCode 使数组连续的最少操作数

地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;困难 题目描述&#xff1a;给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 **任意 **整数。 如果 nums 满足以下条件&#xff0c;那么它是 连续的 &#x…

点击上传文件

一、页面样式&#xff1a; &#xff08;1&#xff09;点击前&#xff1a; &#xff08;2&#xff09;点击后&#xff1a; 设计&#xff1a;①自定义elementPlus图标&#xff1b;②使用Tooltip实现鼠标悬浮按钮上出现文字提示&#xff1b;③上传与更换的切换样式&#xff1b;…

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat&#xff08;VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff09;是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法&#xff1a;vmstat interval times 即每隔 interval 秒采…

从概念到实践:揭开枚举与联合体在数字化创新时代的神秘面纱

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 在编程的世界中&#xff0c;枚举和联合体是两种非常基础且重要的数据结构。它们各自具有独特的特点和用途&#xff0c;为程序员提供…

(一)基于IDEA的JAVA基础12

一维数组 为什么使用数组: 当我们需要存储一系列数据的时候&#xff0c;就需要用到数组&#xff0c;如果不使用数组&#xff0c;我们就要需要一个一个的去声明变量&#xff0c;这样浪费内存空间&#xff0c;同时效率低下。 什么是数组: 数组本身就是一个变量&#xff0c;只…

Redis从入门到精通(六)Redis实战(三)优惠券秒杀

↑↑↑下载测试项目原代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.1 数据表与实体类4.3.2 添加优惠券4.3.2.1 添加普通券代码4.3.2.2 添加秒杀券代码 4.3.3 实现秒杀下单4.3.3.1 秒杀下单逻辑分析4.3.3.2 获取秒杀订单ID4.3.3.3 获取用户ID4.3.3.4 实现秒杀下单 前言 Redis实战…

diffusion model(十五) : IP-Adapter技术小结

infopaperhttps://arxiv.org/pdf/2308.06721.pdfcodehttps://github.com/tencent-ailab/IP-Adapterorg.Tencent AI Lab个人博客地址http://myhz0606.com/article/ip_adapter 1 Motivation 为了对文生图diffusion model进行特定概念的定制&#xff0c;常用LoRA[1]、textual in…

JDK下载及安装说明

1&#xff0e;JDK下载 访问oracle官网&#xff1a;http://www.oracle.com 在首页点击Downloads&#xff0c;进入oracle软件下载页。 在下载页面&#xff0c;点击Java。 选择Java (JDK) for Developers&#xff0c;点击。 在 Java SE Downloads 页面&#xff0c;点击中间的DO…

装机指导。

everything winrar snipaste cmake git tortoisegit tortoisesvn inno setup vs2022 安装的时候注意sdk路径一定要默认&#xff01;&#xff01; 否则你会发现在你的sdk安装路径的根盘符下会多出一个Windows Kits&#xff0c;强迫症接受不了 默认的会跟已有的装在一起…

【Python系列】读取 Excel 第一列数据并赋值到指定列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux的学习之路:4、权限

一、Linux权限的概念 权限我们都熟悉&#xff0c;最常见的就是在看电视时需要vip这个就是权限&#xff0c;然后在Linux就是有两个权限&#xff0c;就是管理员也就是超级用户和普通的用户 命令&#xff1a;su [用户名] 功能&#xff1a;切换用户。 例如&#xff0c;要从root用户…

ZLMediaKit ubantu 下编译

1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu&#xff09;系统下安装依赖的方法&#xff1a; #除了…

Python-VBA函数之旅-ascii函数

ascii函数在Python中主要用于将对象(特别是字符和字符串)转换为它们的ASCII表示形式。这种转换在处理文本数据、调试代码以及确保文本以 ASCII 格式存储或传输时非常有用。常见应用场景有&#xff1a; 1、调试和文本处理&#xff1a;当处理包含非ASCII字符(如Unicode字符)的文…