当前位置: 首页 > news >正文

Vue3.0的设计目标是什么?做了哪些优化

一、设计目标

不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下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为了解决这个问题提供了 set delete 实例方法,但是对于用户来说,还是增加了一定的心智负担

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

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

相关文章:

Vue3.0的设计目标是什么?做了哪些优化

一、设计目标 不以解决实际业务痛点的更新都是耍流氓,下面我们来列举一下Vue3之前我们或许会面临的问题 随着功能的增长,复杂组件的代码变得越来越难以维护缺少一种比较「干净」的在多个组件之间提取和复用逻辑的机制类型推断不够友好bundle的时间太久…...

Linux介绍 (什么是Linux)

Linux介绍 (什么是Linux) 目录 🍎一.Linux历史🍎 1.UNIX发展的历史 2.Linux发展历史 🍏二.开源🍏 🍑三.官网🍑 🍊四.企业应用现状🍊 1.Linux在服务器…...

Android中使用Java操作List集合的方法合集,包括判读是否有重复元素等

1、判断是否有重复元素 List<String> mList new ArrayList<>();//将List转为Set&#xff0c;通过比较大小是否一样&#xff0c;判断是否有重复元素 Set<String> stringSet new HashSet<>(mList); boolean isHasRepeat false; if (mTipBeanList.siz…...

Rabbitmq 的管理配置

1、Rabbitmq管理 1.1、多租户与权限 每一个RabbitMQ 服务器都能创建虚拟的消息服务器&#xff0c;我们称之为虚拟主机(virtual host) ,简称为vhost 。每一个vhost 本质上是一个独立的小型RabbitMQ 服务器&#xff0c;拥有自己独立的队列、交换器及绑定关系等&#xff0c;井且它…...

Linux性能优化--性能追踪2:延迟敏感的应用程序

11.0 概述 本章包含了一个例子&#xff1a;如何用Linux性能工具在延迟敏感的应用程序中寻找并修复性能问题。 阅读本章后&#xff0c;你将能够&#xff1a; 在延迟敏感的应用程序中用ltrace和oprofile弄清楚哪里产生了延迟。对“热点”函数的每个调用&#xff0c;用gdb生成栈…...

分类网络-类别不均衡问题之FocalLoss

有训练和测代码如下&#xff1a;(完整代码来自CNN从搭建到部署实战) train.py import torch import torchvision import time import argparse import importlib from loss import FocalLossdef parse_args():parser argparse.ArgumentParser(training)parser.add_argument(-…...

记录一下ComboBox在listview中的问题,后面再解决。

在listview的ComboBox&#xff0c;ViewModel类得不到ComboBox的 SelectedModeIndex 和 SelectionChanged事件。 问题描述&#xff1a; 1. 在listview中有ComboBox 2. 数据源类 InspectionInfo &#xff0c;其中有ComboBox的绑定数据源 ModelList&#xff0c;代码如下&#…...

手写一个PrattParser基本运算解析器1: 编译原理概述

点击查看 基于Swift的PrattParser项目 编译原理概述 编译原理是我们每一个程序猿必须要了解的技能, 编译原理实际上并没有啥高深的技术, 我们如果在做业务开发, 也很少会用到编译开发的知识, 但是编译原理又是我们必备的基础知识之一. 所以我们需要对编译原理的内容有一个大概的…...

ZKP3.2 Programming ZKPs (Arkworks Zokrates)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 3: Programming ZKPs (Guest Lecturers: Pratyush Mishra and Alex Ozdemir) 3.3 Using a library ( tutorial) R1CS Libraries A library in a host language (Eg: Rust, OCaml, C, Go, …)Key type: constraint system Mai…...

mysqld: File ‘./binlog.index‘ not found (OS errno 13 - Permission denied) 问题解决

问题背景 Centos7 安装Mysql 8后启动时遇到的问题&#xff0c;看了好几个博客方案无效&#xff0c;搞了半小时才找到正解&#xff0c;在此次进行记录。 在此假设你已经修改了对应目录的权限&#xff0c;比如配置的mysql data目录初始化后已经执行了chown -R mysql:mysql /XXX/…...

Python 环境构建最佳实践:Mamba + Conda + PIP

此前,我们单独介绍过 PIP 和 Conda,在后续的实际应用中,还是遇到了不少 Python 环境构建的问题,特别是在 Windows 系统上,最突出的表现是:虽然PIP的包依赖解析和下载都很快,但在 Windows 上经常会因为缺失底层依赖的程序库(例如某些dll文件)而导致 Python 程序启动时报…...

华为OD 最多团队(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

2023“龙芯杯”信创攻防赛 | 赛宁网安技术支持

2023年10月19日&#xff0c;为深入贯彻国家网络强国战略思想&#xff0c;宣传国家网络安全顶层设计&#xff0c;落实《网络安全法》《数据安全法》等法律法规。由大学生网络安全尖锋训练营主办&#xff0c;龙芯中科技术股份有限公司承办&#xff0c;山石网科通信技术股份有限公…...

代码随想录算法训练营第五十八天| 583. 两个字符串的删除操作 72. 编辑距离

今日学习的文章链接和视频链接 两个字符串的删除操作 https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html 编辑距离 https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB…...

leetcode做题笔记191. 位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…...

Git基本命令和使用

文章目录 1、Git本地库命令1.1、初始化本地库1.2、设置用户签名1.3、查看本地库状态1.4、将工作区的修改添加到暂存区1.5、将暂存区的修改提交到本地库1.6、历史版本1.7、取消commit1.8、取消暂存文件 2、分支操作2.1、查看分支2.2、创建分支2.3、分支合并时产生冲突 3、Gitee远…...

50springboot私人健身与教练预约管理系统

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…...

测试Android webview 加载本地html

最近开发一个需要未联网功能的App, 不熟悉使用Java原生开发界面&#xff0c;于是想使用本地H5做界面&#xff0c;本文测试了使用本地html加载远程数据。直接上代码&#xff1a; MainActivity.java package com.alex.webviewlocal;import androidx.appcompat.app.AppCompatAct…...

ubuntu安装pgsql

ubuntu安装postgresSQL 官网地址&#xff1a; https://www.postgresql.org/download/ 1.安装 # 添加源 sudo sh -c echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list # 安装数字签名 w…...

利用ArcGIS获取每一个冰川的中心位置经纬度坐标:要素转点和要素折点转点的区别

问题概述&#xff1a;下图是天山地区的冰川的分布&#xff0c;我们可以看到每一条冰川是一个面要素&#xff0c;要求得到每一个冰川&#xff08;面要素&#xff09;的中心经纬度坐标。 1.采用要素转点功能 选择工具箱的【数据管理工具】-【要素】-【要素转点】。完成之后再采用…...

别再死记硬背了!用这3个Excel模板搞定PMP 49个过程的ITTO(附下载)

用Excel动态模板高效掌握PMP 49个过程的ITTO 备考PMP认证的考生们常常被49个项目管理过程的输入、工具与技术、输出&#xff08;ITTO&#xff09;搞得焦头烂额。传统的死记硬背不仅效率低下&#xff0c;还容易混淆不同过程组之间的关联。本文将介绍如何通过Excel动态模板系统化…...

如何快速掌握res-downloader:网络资源批量下载的完整指南

如何快速掌握res-downloader&#xff1a;网络资源批量下载的完整指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在手动…...

ncmdumpGUI:解锁网易云音乐NCM格式的C开源解决方案

ncmdumpGUI&#xff1a;解锁网易云音乐NCM格式的C#开源解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐下载了心爱的歌曲&…...

从崩溃到从容:我用百考通AI搞定毕业论文的实战经验分享

告别熬夜与焦虑&#xff0c;一个工具如何让论文写作回归正轨 又到了一年一度的毕业季&#xff0c;深夜的图书馆、凌晨的宿舍灯、满桌的参考文献和空空如也的Word文档&#xff0c;这些场景是否正发生在你身上&#xff1f;面对导师的“再改一稿”和学校严格的格式要求&#xff0c…...

围棋AI分析工具LizzieYzy:从入门到精通的终极指南

围棋AI分析工具LizzieYzy&#xff1a;从入门到精通的终极指南 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy 还在为围棋复盘找不到问题而烦恼吗&#xff1f;LizzieYzy可能是你正在寻找的完美解决方…...

20251219_105921_0基础如何转行学习网络安全?怎么开始?

网络安全学习全攻略&#xff1a;零基础到高薪&#xff0c;收藏这份攻防教程就够了 文章详细分析了网络安全的就业环境、学习路径和前期准备。就业方面&#xff0c;网络安全行业人才缺口大、薪资高&#xff0c;初级岗位年薪10-20万&#xff0c;高级可达百万。学习分为四个阶段&…...

9天掌握PyTorch深度学习:高效实战指南

1. 课程概览与学习价值这个9天PyTorch深度学习迷你课程是我在指导数百名学员后提炼出的高效学习路径。不同于传统教材按部就班的讲解方式&#xff0c;我们采用"问题驱动即时实践"的教学方法&#xff0c;每天聚焦一个核心主题&#xff0c;通过3-4个典型代码案例贯穿知…...

k-Means聚类算法优化实战:从初始化到核技巧

1. k-Means算法回顾与常见痛点分析k-Means作为无监督学习中最经典的聚类算法之一&#xff0c;其简洁性和高效性使其成为数据分析的入门必修课。算法通过迭代计算样本点到聚类中心的距离&#xff0c;不断调整中心点位置&#xff0c;最终实现数据的分组。但正是这种简洁性&#x…...

神经网络核心原理与工程实践:从基础到深度模型

1. 极简神经网络解析&#xff1a;40秒入门深度模型核心原理刚接触深度学习时&#xff0c;我被那些动辄上百层的神经网络结构图吓到过。直到后来发现&#xff0c;无论多复杂的模型&#xff0c;核心运作机制都能用简单的逻辑链条说清楚。今天我们就用咖啡萃取的类比&#xff0c;拆…...

Fillinger智能填充:Adobe Illustrator图形自动分布的革命性解决方案

Fillinger智能填充&#xff1a;Adobe Illustrator图形自动分布的革命性解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 在平面设计工作中&#xff0c;你是否曾为在复杂形状…...