VUE3.5版本解读
官网:Announcing Vue 3.5 | The Vue Point
2024年9月1日,宣布 Vue 3.5“天元突破:红莲螺岩”发布!
反应系统优化
在 3.5 中,Vue 的反应系统经历了另一次重大重构,在行为没有变化的情况下实现了更好的性能和显著改善的内存使用率(-56%)。重构还解决了 SSR 期间计算值挂起导致的过时计算值和内存问题。此 PR 重构了核心反应系统,以使用版本计数和受Preact 信号启发的双向链表数据结构。
此外,3.5 还优化了大型、深度反应阵列的反应性跟踪,在某些情况下可使此类操作速度提高 10 倍。
内存使用改进
给定一个有 1000 个引用 + 2000 个计算(1000 个链接对)+ 1000 个订阅最后一个计算的效果的测试用例,比较这些类实例使用的总内存:
- 之前(3.4.19):1426k
- 之后(此 PR):631k(-56%)
计算现在也仅在自身获得第一个订阅者时才延迟订阅 deps,并在失去所有订阅者时取消订阅。这意味着它们可以更可靠地进行垃圾收集,包括在 SSR 中。
响应式 Props 解构
在 Vue 3.5 中,响应式 props 的解构功能已经稳定下来,并且默认启用。这意味着在 <script setup> 中从 defineProps 解构的变量现在具有响应性。这一改进大大简化了使用默认值声明 props 的过程,并且利用了 JavaScript 的原生默认值语法。
<template><div><p>Name: {{ name }}</p><p>Age: {{ age }}</p><button @click="incrementAge">Age +1</button></div>
</template><script setup>
import { ref, watch } from 'vue';// 定义属性
const props = defineProps({name: {type: String,default: 'John'},age: {type: Number,default: 30}
});// 创建响应式数据
const age = ref(props.age);// 监听属性变化
watch(() => props.age, (newAge) => {age.value = newAge;
});// 更新年龄的方法
const incrementAge = () => {age.value++;
};
</script>
解构 props 变量(例如 count)的访问会被编译器自动编译成 props.count,从而保持响应性。这意味着当我们访问解构后的变量时,Vue 会自动对其进行跟踪。 如果需要在保留响应性的同时监视解构的 prop 变量或将其传递到可组合函数中,需要将其包装在 getter 中。这一改进使得处理 props 变得更加直观和高效。
这一改进大大简化了代码,使得 props 的声明和使用更加直观和简洁。我们不再需要使用 toRefs 或其他复杂的模式来保持响应性。
SSR 改进
在 Vue 3.5 中,服务器端渲染(SSR)得到了一些重要的改进,特别是在懒惰水合、useId() API 和 data-allow-mismatch 属性方面。这些改进旨在提高 SSR 的性能、稳定性和开发体验。
懒惰水合(Lazy Hydration)
控制水合策略
在 Vue 3.5 中,异步组件的水合策略可以通过 defineAsyncComponent API 的 hydrate 选项来控制。懒惰水合是指组件在首次渲染时不会立即进行水合(hydration),而是在某些条件满足时(例如组件可见时)才进行水合。
import { defineAsyncComponent } from 'vue';const LazyComponent = defineAsyncComponent({loader: () => import('./MyComponent.vue'),hydrate: {when: 'visible', // 仅在组件可见时进行水合},
});
核心 API 设计得较低级别,而 Nuxt 团队已在此特性的基础上构建了更高级别的语法糖,使得懒惰水合的实现更加简单和直观。
useId() API
useId() 是一个 API,可用于生成每个应用程序唯一的 ID。这些 ID 在服务器和客户端渲染过程中保持稳定,确保不会导致水合不匹配。
import { useId } from 'vue';const uniqueId = useId();
应用场景
这些唯一 ID 可用于生成表单元素和可访问性属性的 ID,确保在 SSR 应用程序中使用时不会导致水合不匹配。
data-allow-mismatch 属性
抑制水合不匹配警告,在某些情况下,客户端值不可避免地与服务器对应值不同(例如日期)。Vue 3.5 引入了 data-allow-mismatch 属性,用于抑制由此产生的水合不匹配警告。
<div data-allow-mismatch><!-- 内容 -->
</div>
还可以通过为 data-allow-mismatch 属性提供值来限制允许的不匹配类型。可能的值包括 text、children、class、style 和 attribute。
<div data-allow-mismatch="text"><!-- 内容 -->
</div>
自定义元素改进
在 Vue 3.5 中,自定义元素(Custom Elements)得到了显著的改进,修复了许多与 defineCustomElement API 相关的长期存在的问题,并添加了许多新功能。这些改进使得使用 Vue 创建自定义元素更加灵活和强大。
自定义元素的应用程序配置
通过选项支持自定义元素的应用程序配置,在 Vue 3.5 中,你可以通过 configureApp 选项来配置自定义元素的应用程序。这使得你可以在定义自定义元素时进行更细粒度的配置。
import { defineCustomElement } from 'vue';const MyElement = defineCustomElement({// 组件选项template: '<div>Hello, World!</div>',configureApp: (app) => {// 配置应用程序app.config.globalProperties.$myGlobal = 'global value';},
});customElements.define('my-element', MyElement);
访问宿主元素和影子根
添加 useHost()、useShadowRoot() 和 this.$host API,Vue 3.5 添加了 useHost() 和 useShadowRoot() 组合函数,以及 this.$host API,用于访问自定义元素的宿主元素和影子根。
import { defineCustomElement, useHost, useShadowRoot } from 'vue';const MyElement = defineCustomElement({setup() {const host = useHost();const shadowRoot = useShadowRoot();console.log('Host Element:', host.value);console.log('Shadow Root:', shadowRoot.value);return () => <div>Hello, World!</div>;},
});customElements.define('my-element', MyElement);
支持安装没有 Shadow DOM 的自定义元素
通过传递 shadowRoot: false 支持安装没有 Shadow DOM 的自定义元素,在 Vue 3.5 中,你可以通过传递 shadowRoot: false 选项来支持安装没有 Shadow DOM 的自定义元素。
import { defineCustomElement } from 'vue';const MyElement = defineCustomElement({template: '<div>Hello, World!</div>',shadowRoot: false, // 不使用 Shadow DOM
});customElements.define('my-element', MyElement);
支持提供 nonce 选项
支持提供一个 nonce 选项,该选项将附加到 <style> 自定义元素注入的标签上,Vue 3.5 支持提供一个 nonce 选项,该选项将附加到 <style> 自定义元素注入的标签上,以增强安全性。
import { defineCustomElement } from 'vue';const MyElement = defineCustomElement({template: '<div>Hello, World!</div>',nonce: 'my-nonce-value', // 设置 nonce 值
});customElements.define('my-element', MyElement);
仅自定义元素选项
通过第二个参数传递仅自定义元素选项,在 Vue 3.5 中,你可以通过第二个参数传递仅自定义元素选项,以进一步定制自定义元素的行为。
import { defineCustomElement } from 'vue';const MyElement = defineCustomElement({template: '<div>Hello, World!</div>',},{shadowRoot: false, // 不使用 Shadow DOMnonce: 'my-nonce-value', // 设置 nonce 值}
);customElements.define('my-element', MyElement);
其他显著特点
useTemplateRef() API
获取模板引用的新方法
Vue 3.5 引入了一种通过 useTemplateRef() API 获取模板引用的新方法。这种方法通过运行时字符串 ID 匹配引用,因此支持动态引用绑定到变化的 ID。
<template><div><input ref="inputRef" type="text" /></div>
</template><script setup>
import { useTemplateRef } from 'vue';const inputRef = useTemplateRef('inputRef');console.log(inputRef.value); // 获取 input 元素的引用
</script>
与旧方法的对比
在 3.5 之前,我们建议使用变量名与静态 ref 属性匹配的普通引用。旧方法要求 ref 属性可由编译器分析,因此仅限于静态 ref 属性。相比之下,useTemplateRef() 通过运行时字符串 ID 匹配引用,因此支持动态引用绑定到变化的 ID。
语言工具支持
@vue/language-tools 2.1 还实现了对新语法 useTemplateRef() 的特殊支持,因此在使用时您将根据 ref 模板中存在的属性获得自动完成和警告。
延迟传送(Deferred Teleport)
内置 <Teleport> 组件的限制
内置 <Teleport> 组件的一个已知限制是,其目标元素必须在传送组件挂载时存在。这阻止用户在传送后将内容传送到 Vue 渲染的其他元素。
引入 defer prop
在 Vue 3.5 中,我们引入了一个 defer prop,用于在当前渲染周期之后挂载 <Teleport>,因此现在可以正常工作:
<template><div><Teleport to="#target" defer><div>Teleported Content</div></Teleport></div>
</template><script setup>
import { Teleport } from 'vue';
</script>
默认行为
此行为需要 defer prop,因为默认行为需要向后兼容。
onWatcherCleanup() API
在观察者中注册清理回调
Vue 3.5 引入了一个全局导入的 API onWatcherCleanup(),用于在观察者中注册清理回调。
import { watch, onWatcherCleanup } from 'vue';watch(() => someValue,(newValue, oldValue, onCleanup) => {const cleanup = () => {// 清理逻辑};onWatcherCleanup(cleanup);}
);
应用场景
onWatcherCleanup() 可以在观察者中注册清理回调,确保在观察者被停止或重新运行时执行清理逻辑,避免内存泄漏和其他潜在问题。
相关文章:
VUE3.5版本解读
官网:Announcing Vue 3.5 | The Vue Point 2024年9月1日,宣布 Vue 3.5“天元突破:红莲螺岩”发布! 反应系统优化 在 3.5 中,Vue 的反应系统经历了另一次重大重构,在行为没有变化的情况下实现了更好的性能…...
spark计算引擎-架构和应用
一Spark 定义:Spark 是一个开源的分布式计算系统,它提供了一个快速且通用的集群计算平台。Spark 被设计用来处理大规模数据集,并且支持多种数据处理任务,包括批处理、交互式查询、机器学习、图形处理和流处理。 核心架构&#x…...
VUE 开发——AJAX学习(二)
一、Bootstrap弹框 功能:不离开当前页面,显示单独内容,供用户操作 步骤: 引入bootstrap.css和bootstrap.js准备弹框标签,确认结构通过自定义属性,控制弹框显示和隐藏 在<head>部分添加:…...
机器学习-KNN分类算法
1.1 KNN分类 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法。它是概念极其简单,而效果又很优秀的分类算法。1967年由Cover T和Hart P提出。 KNN分类算法的核心思想:如果一个样本在特征空间中的k个最…...
云计算 Cloud Computing
文章目录 1、云计算2、背景3、云计算的特点4、云计算的类型:按提供的服务划分5、云计算的类型:按部署的形式划分 1、云计算 定义: 云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可…...
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(上篇)
【ps】本篇有 9 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)全排列 .1- 题目解析 .2- 代码编写 2)子集 .1- 题目解析 .2- 代码编写 3)找出所有子集的异或总和再求和 .1- 题目解析 .2- 代码编写 4)全排列 II…...
怎么绕开华为纯净模式安装软件
我是标题 众所周不知,华为鸿蒙系统自带纯净模式,而且 没法关闭 : ) 我反正没找到关闭键 以前或许会有提示,无视风险,“仍要安装”。但我这次遇到的问题是,根本没有这个选项,只有“应用市场”和“取消”&…...
CentOS7 离线部署docker和docker-compose环境
一、Docker 离线安装 1. 下载docker tar.gz包 下载地址: Index of linux/static/stable/x86_64/ 本文选择版本:23.0.6 2.创建docker.service文件 vi docker.service文件内容如下: [Unit] DescriptionDocker Application Container Engi…...
Vue 自定义组件实现 v-model 的几种方式
前言 在 Vue 中,v-model 是一个常用的指令,用于实现表单元素和组件之间的双向绑定。当我们使用原生的表单元素时,直接使用 v-model 是很方便的,但是对于自定义组件来说,要实现类似的双向绑定功能就需要一些额外的处理…...
Python Pandas数据处理效率提升指南
大家好,在数据分析中Pandas是Python中最常用的库之一,然而当处理大规模数据集时,Pandas的性能可能会受到限制,导致数据处理变得缓慢。为了提升Pandas的处理速度,可以采用多种优化策略,如数据类型优化、向量…...
最大正方形 Python题解
最大正方形 题目描述 在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形,输出边长。 输入格式 输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100),接…...
ubuntu中软件的进程管理-结束软件运行
在Ubuntu系统中,当某个运行中的软件无法正常退出时,可以通过以下几种方法强制结束该软件: 方法一:使用系统监视器(System Monitor)–小白专属 这个相当于win上的资源管理器 打开系统监视器 可以通过点击屏…...
Windows环境部署Oracle 11g
Windows环境部署Oracle 11g 1.安装包下载2. 解压安装包3. 数据库安装3.1 执行安装脚本3.2 电子邮件设置3.3 配置安装选项3.4 配置系统类3.5 选择数据库安装类型3.6 选择安装类型3.7 数据库配置3.8 确认安装信息3.9 设置口令 Oracle常用命令 2023年10月中旬就弄出大致的文章&…...
C语言进阶【8】--联合体和枚举(联合体和枚举这么好用,你不想了解一下吗?)
本章概述 联合体类型的声明联合体的特点联合体的大小的计算枚举类型的声明枚举类型的优点枚举类型的使用枚举类型的大小彩蛋时刻!!! 联合体类型的声明 概述:联合体的关键字为 union。它的结构和结构体是一样的。进行展示…...
Android OTA升级
针对Android系统OTA升级,MTK平台有相关介绍文档:https://online.mediatek.com/apps/faq/detail?faqidFAQ27117&listSW 概念一:OTA包的构建 AOSP full build:Android原生提供的全量包的构建,意思就是可以从任何一…...
【项目经验分享】深度学习自然语言处理技术毕业设计项目案例定制
以下毕业设计是与深度学习自然语言处理(NLP)相关的毕业设计项目案例,涵盖文本分类、生成式模型、语义理解、机器翻译、对话系统、情感分析等多个领域: 实现案例截图: 基于深度学习的文本分类系统基于BERT的情感分析系…...
一觉醒来,YOLO11 冷不丁就来了
🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 前言:一觉醒来,YOLO11 冷不丁就来了ultralytics 版本更新…...
智能编辑器、版本控制与自动化脚本
在繁忙的工作中,每个开发者都渴望拥有一个“秘密武器”,帮助自己提升效率、减少错误,从而更快地完成任务。那么,在众多编程工具中,哪一款能够成为你的工作效率翻倍的“秘密武器”呢?本文将探讨智能的代码编…...
jenkinsfile实现镜像构建、发布
实现代码打包编译 容器镜像构建 jenkins编译采用docker构建。 遇到问题: 1.需要限制docker 容器的内存和cpu docker { image ‘ccr.ccs.tencentyun.com/libary/maven:3.6.3-jdk-8’ args “-v ${WORKSPACE}:/workspace --memory‘2048m’ --cpus‘1’” } 2.jenkins构建需要限制…...
OSPF路由计算
关于OSPF路由的基础概述可以看看这篇博客 动态路由---OSPF协议基础https://blog.csdn.net/ZZZCY2003/article/details/141335261 区域内路由计算 LSA概述 LSA是OSPF进行路由计算的关键依据OSPF的LSU报文可以携带多种不同类型的LSA各种类型的LSA拥有相同的报文头部 重要字段解…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
