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

在这里插入图片描述

文章目录

    • 一、设计目标
      • 更小
      • 更快
      • 更友好
    • 三、优化方案
      • 源码
        • 源码管理
        • TypeScript
      • 性能
      • 语法 API
        • 逻辑组织
        • 逻辑复用
    • 参考文献

一、设计目标

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

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

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

我们从结果反推

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

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

更小

Vue3移除一些不常用的 API

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

更快

主要体现在编译方面:

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

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

更友好

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

源码

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

  • 源码管理
  • TypeScript
源码管理

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

在这里插入图片描述

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

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

TypeScript

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

性能

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 中去递归响应式,这样的好处是真正访问到的内部对象才会变成响应式,而不是无脑递归

语法 API

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

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

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

在这里插入图片描述

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

逻辑复用

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Cocos Creator】vscode 保存代码自动编译

使用Cocos Creator的时候,之前每次修改代码,都要到编辑器界面点击刷新按钮,感觉有些麻烦,搜索引擎上找到的解决方案都比较麻烦, 最后在vscode,刚好找到一款插件–Cocos Creator Devtools。 cocos-creator-…

盲盒扭蛋机小程序,科技与传统的完美结合

盲盒扭蛋具有着较大的粉丝群体,成为一大商业模式。扭蛋机与盲盒具有一样的特征,不确定性、未知性,深深吸引着消费者。 传统的扭蛋机一般活跃于各大商场中,深受不同年龄层人的喜欢。但随着互联网技术的完善,相对于线下…

Kafka消息延迟和时序性详解(文末送书)

目录 一、概括1.1 介绍 Kafka 消息延迟和时序性1.1.1 什么是 Kafka 消息延迟?1.1.2 为什么消息延迟很重要?1.1.3 什么是 Kafka 消息时序性?1.1.4 消息延迟和时序性的关系 1.2 延迟的来源1.2.1 Kafka 内部延迟 二、衡量和监控消息延迟2.1 延迟…

解决 Hbuilder打包 Apk pad 无法横屏 以及 H5 直接打包 成Apk

解决 Hbuilder打包 Apk pad 无法横屏 前言云打包配置 前言 利用VUE 写了一套H5 想着 做一个APP壳 然后把 H5 直接嵌进去 客户要求 在pad 端 能够操作 然后页面风格 也需要pad 横屏展示 云打包 配置 下面是manifest.json 配置文件 {"platforms": ["iPad"…

docker consul容器的自动发现与注册

目录 什么叫做微服务(容器)注册于发现 docker consul数据流程图 服务注册于发现的优点 什么是consul? consul的主要特点 Consul部署和服务发现 架构 docker1 docker2 实现管理配置自动化 作用 自动化更新配置文件 配置template并…

01|LangChain系统安装和快速入门

01|LangChain系统安装和快速入门 什么是大语言模型 大语言模型是一种人工智能模型,通常使用深度学习技术,比如神经网络,来理解和生成人类语言。这些模型的“大”在于它们的参数数量非常多,可以达到数十亿甚至更多&am…

漏洞复现-iDocview doc/upload接口存在任意文件读取漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

虾皮Shopee商品详情API:电商实时数据获取的关键

随着互联网的普及和电子商务的快速发展,电商行业已经成为全球范围内最具影响力和前景的产业之一。在电商行业中,商品详情API接口是实现快速、准确获取商品信息的关键技术之一。本文将介绍获得虾皮Shopee根据ID取商品详情 API在电商行业里的重要性&#x…

通话状态监听-Android13

通话状态监听-Android13 1、Android Telephony 模块结构2、监听和广播获取通话状态2.1 注册2.2 通话状态通知2.3 通话状态 3、通知状态流程* 关键日志 frameworks/base/core/java/android/telephony/PhoneStateListener.java 1、Android Telephony 模块结构 Android Telephony…

智能水印相机微信小程序源码 简单易上手

水印相机前端源码,该程序无需后端支持,只需直接导入前端即可使用,未添加流量主功能,如有需要可自行开通并添加。 请注意在小程序后台进行隐私权限设置,用户需授权后才能使用。 利用真实的时间和地点信息拍摄照片&…

〖Python网络爬虫实战㊸〗- 极验滑块介绍(五)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

一级浪涌保护器的行业应用解决方案

一级浪涌保护器是防雷系统中最重要的一环,它主要用于建筑物总配电柜、低压变压器进线柜等位置,防止浪涌电压直接从外部传导进入内部,使系统设备免遭雷击损坏。一级浪涌保护器的规范要求、应用、作用和原理以及国标,本文将分别进行…

隆道姚锐:数字技术赋能企业采购和供应链管理

12月15日,“2023龙江数实融合发展大会”在黑龙江省哈尔滨市举办,北京隆道网络科技有限公司总裁助理姚锐出席本次会议的“数字生物医药创新发展论坛”,并分享以数字技术赋能企业采购和供应链管理的实践经验。 本届大会以“聚数智力量 创万物互…

智能优化算法应用:基于风驱动算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于风驱动算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于风驱动算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.风驱动算法4.实验参数设定5.算法结果6.参考文…

Domino 14.0消灭密码(一)

大家好,才是真的好。 今天的篇幅会有点长,因为涉及到的概念有点多,总而言之就是为了安全系统登陆为目的,来讲述Domino 14中的新功能:无密码登录。 需求要从很早的时候说起,在网络中为了保证安全和识别用户…

如何搭建企业管理系统Odoo并远程访问管理界面【内网穿透】

文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…

chatchat知识库对话接口修改成sse流式输出方案

在chatchat结合chatGLM搭建的私有化知识库中,使用原生的webUI画面是可以流式输出的,而直接调用api接口,不管stream为true还是false,都是阻塞式输出的,也就是一口气返回给接口。 我们的解决方案是修改StreamingRespons…

【面向对象】C++/python/java的多态比较

一、面向对象的主要特点 封装:封装是把数据和操作数据的方法绑定在一起,对数据的访问只能通过已定义的接口。这可以保护数据不被外部程序直接访问或修改,增强数据的安全性。继承:继承是一种联结类的层次模型,并且允许…

记录 | 安装Qt6的方法

安装 Qt6 的方法 # 安装依赖 sudo apt install libxcb-xinerama0清华源 Qt6 下载器链接: https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/qt-unified-linux-x64-online.run # 安装 > 用下面的命令 ./qt-unified-linux-x64-onli…

设计模式-单例设计模式详解

生命无罪,健康万岁,我是laity。 我曾七次鄙视自己的灵魂: 第一次,当它本可进取时,却故作谦卑; 第二次,当它在空虚时,用爱欲来填充; 第三次,在困难和容易之…