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拥有相同的报文头部 重要字段解…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
