「Vue3面试系列」Vue3.0的设计目标是什么?做了哪些优化?

在这里插入图片描述

文章目录

    • 一、设计目标
      • 1.1 更小
      • 1.2 更快
      • 1.3更友好
    • 二、优化方案
      • 2.1 源码
        • 2.11源码管理
        • 2.22 TypeScript
      • 2.2 性能
      • 2.3 语法 API
        • 2.31逻辑组织
        • 2.32 逻辑复用
    • 参考文献

一、设计目标

不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问题

  • 随着功能的增长,复杂组件的代码变得越来越难以维护
  • 缺少一种比较「干净」的在多个组件之间提取和复用逻辑的机制
  • 类型推断不够友好
  • bundle的时间太久了

Vue3 经过长达两三年时间的筹备,做了哪些事情?

我们从结果反推

  • 更小
  • 更快
  • TypeScript支持
  • API设计一致性
  • 提高自身可维护性
  • 开放更多底层功能

一句话概述,就是更小更快更友好了

1.1 更小

Vue3移除一些不常用的 API

引入tree-shaking,可以将无用模块“剪辑”,仅打包需要的,使打包的整体体积变小了

1.2 更快

主要体现在编译方面:

  • diff算法优化
  • 静态提升
  • 事件监听缓存
  • SSR优化

下篇文章我们会进一步介绍

1.3更友好

vue3在兼顾vue2options API的同时还推出了composition API,大大增加了代码的逻辑组织和代码复用能力

这里代码简单演示下:

存在一个获取鼠标位置的函数

import { toRefs, reactive } from 'vue';
function useMouse(){const state = reactive({x:0,y:0});const update = e=>{state.x = e.pageX;state.y = e.pageY;}onMounted(()=>{window.addEventListener('mousemove',update);})onUnmounted(()=>{window.removeEventListener('mousemove',update);})return toRefs(state);
}

我们只需要调用这个函数,即可获取xy的坐标,完全不用关注实现过程

试想一下,如果很多类似的第三方库,我们只需要调用即可,不必关注实现过程,开发效率大大提高

同时,VUE3是基于typescipt编写的,可以享受到自动的类型定义提示

二、优化方案

vue3从很多层面都做了优化,可以分成三个方面:

  • 源码
  • 性能
  • 语法 API

2.1 源码

源码可以从两个层面展开:

  • 源码管理
  • TypeScript
2.11源码管理

vue3整个源码是通过 monorepo的方式维护的,根据功能将不同的模块拆分到packages目录下面不同的子目录中

在这里插入图片描述

这样使得模块拆分更细化,职责划分更明确,模块之间的依赖关系也更加明确,开发人员也更容易阅读、理解和更改所有模块源码,提高代码的可维护性

另外一些 package(比如 reactivity 响应式库)是可以独立于 Vue 使用的,这样用户如果只想使用 Vue3的响应式能力,可以单独依赖这个响应式库而不用去依赖整个 Vue

2.22 TypeScript

Vue3是基于typeScript编写的,提供了更好的类型检查,能支持复杂的类型推导

2.2 性能

vue3是从什么哪些方面对性能进行进一步优化呢?

  • 体积优化
  • 编译优化
  • 数据劫持优化

这里讲述数据劫持:

vue2中,数据劫持是通过Object.defineProperty,这个 API 有一些缺陷,并不能检测对象属性的添加和删除

Object.defineProperty(data, 'a',{get(){// track},set(){// trigger}
})

尽管Vue为了解决这个问题提供了 setdelete实例方法,但是对于用户来说,还是增加了一定的心智负担

同时在面对嵌套层级比较深的情况下,就存在性能问题

default {data: {a: {b: {c: {d: 1}}}}
}

相比之下,vue3是通过proxy监听整个对象,那么对于删除还是监听当然也能监听到

同时Proxy 并不能监听到内部深层次的对象变化,而 Vue3 的处理方式是在getter 中去递归响应式,这样的好处是真正访问到的内部对象才会变成响应式,而不是无脑递归

2.3 语法 API

这里当然说的就是composition API,其两大显著的优化:

  • 优化逻辑组织
  • 优化逻辑复用
2.31逻辑组织

一张图,我们可以很直观地感受到 Composition API在逻辑组织方面的优势

在这里插入图片描述

相同功能的代码编写在一块,而不像options API那样,各个功能的代码混成一块

2.32 逻辑复用

vue2中,我们是通过mixin实现功能混合,如果多个mixin混合,会存在两个非常明显的问题:命名冲突和数据来源不清晰

而通过composition这种形式,可以将一些复用的代码抽离出来作为一个函数,只要的使用的地方直接进行调用即可

同样是上文的获取鼠标位置的例子

import { toRefs, reactive, onUnmounted, onMounted } from 'vue';
function useMouse(){const state = reactive({x:0,y:0});const update = e=>{state.x = e.pageX;state.y = e.pageY;}onMounted(()=>{window.addEventListener('mousemove',update);})onUnmounted(()=>{window.removeEventListener('mousemove',update);})return toRefs(state);
}

组件使用

import useMousePosition from './mouse'
export default {setup() {const { x, y } = useMousePosition()return { x, y }}
}

可以看到,整个数据来源清晰了,即使去编写更多的hook函数,也不会出现命名冲突的问题

参考文献

  • https://juejin.cn/post/6850418112878575629#heading-5
  • https://vue3js.cn/docs/zh

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

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

相关文章

做题总结 242. 有效的字母异位词

242. 有效的字母异位词 我的答案思路优化出错的知识点(Java)1、String相关(1)String转换成char数组(2)String不能直接用下标访问 2、HashMap 相关(1)初始化(2&#xff09…

vue导出element表格,xlsx和xlsx-style生成xlsx文件并修改样式

1.下载依赖 npm install xlsx --save npm install file-saver --save npm install xlsx-style --save2.先修改xlsx-style的源码,一旦引入xlsx-style则会报错 xlsx-style使用中常见问题及解决办法: xlsx-style使用中常见问题及解决办法-CSDN博客 在\n…

Office批量打印助手绿色版 Excel批量打印 Word 批量打印软件-供大家学习研究参考

功能亮点 批量打印Word文件和Excel工作簿。 请确保已安装.NET Framework 4.0或.NET Framework 4.0 Client Profile。 可以批量打印Word文件和Excel工作簿。交互逻辑简化。 支持WPS文档和WPS表格的打印。 使用系统默认的文档和表格打开方式打印,避免出现RPC服务…

MyBatis的查询方法!!!

准备工作:1.创建一个maven工程,然后将pojo类导入到项目中去。 2.导入依赖到pom.xml文件中 3.在resources中创建log4j.properites和mybatis-config.xml 4.创建UserMapper接口和UserMapper.xml文件 5.创建测试类MyBatisTest 1.创建Maven工程,还…

TensorFlow 2 和 Keras 之间的区别总结

1、什么是TensorFlow 2 TensorFlow 2是谷歌开源的一款深度学习框架,于2019年发布,并且在同年10月1日发布了TensorFlow 2.0.0正式稳定版。这款框架被很多企业与创业公司广泛用于自动化工作任务和开发新系统。 TensorFlow 2在分布式训练支持、可扩展的生…

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后,不能直接运行,需要进行npm install安装node_modules文件夹里面的内容,因为在git上传的时候,一般都会过滤到node_modules中的依赖文件。 安装依赖以后,启动通过npm run serve启动项目出错。…

LoadRunner-Controller

Controller场景设计Controller打开方式Design设计场景 Run-场景运行介绍简单图表分析虚拟用户图表事务响应时间 Controller场景设计 之所以把脚本放到Controller是因为vug没有一个性能指标的监控;而且你要达到持续模拟多个用户你得通过修改运行次数达到这种多用户的…

SD-WAN组网案例:异地组网跨境访问

根据业务的发展和公司的扩张,越来越多企业开始设立分公司或者开设海外办事处,这时候异地网络访问成为一个令人头痛的问题。本文将通过一个案例展示如何利用SD-WAN组网解决异地组网和跨境访问的问题。 背景: 该客户在三个相距较远的地区设有工…

全国国控监测点点位数据,shp/excel格式,已可视化

基本信息. 数据名称: 全国国控监测点点位数据 数据格式: shpexcel 时间版本:2023年 数据几何类型: 点 数据精度:全国 数据坐标系: WGS84 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1province省名称2city城市…

性能测试-LoadRunner

一. Load Runner 脚本录制 1.1 了解 WebTours系统 (1)WebTours如何启动 在浏览器中输入ip端口号/WebTours就可以访问到了 (2)WebTours 配置 在 conf 中的 http.conf 中可以看到端口号:1080 1.2 脚本录制 1. 创建一个脚本 2. …

腾讯云debian服务器的连接与初始化

目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后,只需要在防火墙里面添加一个白名单(ip 或者域名)就能访问了。 防火墙添加本机WLAN的IPv4白名单,本地用一个远程工具连接&#xff…

JavaEE:线程池精讲

目录 一.什么是线程池 二.线程池的实现原理 🎈为什么要有工厂模式? 三.线程池的构造方法解读 🎈线程池的拒绝策略 四.自己实现一个线程池 一.什么是线程池 简单来说,线程池就好比一块鱼塘,鱼塘中的每条鱼就是一个线程…