Vue3.5新增的baseWatch让watch函数和Vue组件彻底分手

news2024/11/17 19:34:20

前言

Vue 3.5.0-beta.3版本中新增了一个base watch函数,这个函数用法和我们熟知的watch API一模一样。区别就是我们之前用的watch API是和Vue组件以及生命周期是一起实现的,他们是深度绑定的。而Vue3.5新增的base watch函数是一个新的函数,他的实现和Vue组件以及生命周期没有一毛钱关系。

加入欧阳的高质量vue源码交流群、欧阳平时写文章参考的多本vue源码电子书

@vue/runtime-core

vue3是模块化设计,他将核心功能拆分为多个独立的模块,如下图:
modules

比如reactivity模块中就是响应式的核心代码、runtime-core模块就是运行时相关的核心代码、compiler-core模块就是编译相关的核心代码。

并且这些模块还被单独当作npm包进行发布,命名规则是@vue+模块名。比如reactivity模块对应的npm包就是@vue/reactivity。如下图:
npm

所以如果我们只需要vue的响应式功能,理论上只需要导入@vue/reactivity包即可。比如我之前的文章: 涨见识了!脱离vue项目竟然也可以使用响应式API,在这篇文章中我就介绍了如何脱离Vue项目,在node.js项目中使用vue的响应式API。

但是不知道你有没有注意到,在demo中我是require("vue"),而不是require("@vue/reactivity")

因为watch不是由@vue/reactivity中导出的,而是由@vue/runtime-core中导出的,如果我只引入@vue/reactivity就会报错了。

const { ref, watch, watchEffect } = require("vue");

const count = ref(0);

// 模拟count变量的值修改
setInterval(() => {
  count.value++;
}, 1000);

watch(count, (newVal) => {
  console.log("触发watch", newVal);
});

watchEffect(
  () => {
    console.log("触发watchEffect", count.value);
  },
  {
    flush: "sync",
  }
);

watch的实现是和vue组件以及生命周期深度绑定的,而vue组件以及生命周期明显是和响应式无关的。他们的实现是在runtime-core模块中,而非reactivity模块中,这也就是为什么watch的实现是放在runtime-core模块中。
runtime

据说性能是 Taro 10 倍的小程序框架 vuemini 底层也是依靠@vue/reactivity实现的,但是由于watch是由@vue/runtime-core中提供的,小程序框架却只引入了@vue/reactivity,所以作者不得不手写了一个watch函数。
vue-mini

重构watch函数

智子在写Vue Vapor时又拆了一个新的模块,叫做runtime-vapor。如果你不了解Vue Vapor,可以看看我之前的文章: 没有虚拟DOM版本的vue(Vue Vapor)。
vue-vapor

他们遇到一个问题需要在runtime-vapor模块中使用watch函数,而watch函数是位于runtime-core模块中。但是又不应该在runtime-vapor模块中直接引用runtime-core模块,所以Vue Vapor团队的绚香音就将watch函数重构到了reactivity模块中,这样在runtime-vapor模块中直接使用reactivity模块中的watch函数就行了。

这也就是为什么需要重构watch函数到reactivity模块中。

在欧阳的个人看法中watch函数本来就是属于响应式中的一部分,他在runtime-core模块中反而不合理。在欧阳第一次看vue3源码时就在奇怪为什么没有在reactivity模块中找到watch函数的实现,而是在runtime-core模块中实现的。

当watch函数重构到reactivity模块后,小程序框架 vuemini 的作者也发了一篇帖子。
X

watch函数重构到reactivity模块后,小程序框架中手写的watch函数都不需要了,因为reactivity模块已经提供了。

看见完了!这下 Vue Mini 真成 @vue/reactivity 套壳了...这个评论后,对不起!杨明山大佬欧阳确实没忍住笑出了声。

总结

vue3.5版本中,Vue Vapor团队在reactivity模块中重构实现了一个watch函数。重构的这个watch函数和我们现在使用的watch函数用法是一样的,区别在于以前的watch函数的实现和Vue组件以及生命周期是深度绑定的,而重构的watch函数和Vue组件以及生命周期一毛钱关系都没有。

这个改动对于普通开发者可能没什么影响,但是对于下游项目,比如Vue mini来说还是很受益的。因为以前他们需要自己去手写watch函数,现在reactivity提供了后就不需要这些手写的watch函数了。

最后推荐一下欧阳自己写的开源电子书vue3编译原理揭秘,看完这本书可以让你对vue编译的认知有质的提升,并且这本书初、中级前端能看懂。完全免费,只求一个star。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

飞速(FS)400G SR4光模块概述

随着光网络领域新技术的不断涌现,数据传输的能力和效率也在持续提升。400G SR4光模块的出现不仅扩展了短距离光通信的可能性,还为未来迈向800G及更高带标准宽奠定了基础。本文深入探讨了飞速(FS)400G SR4光模块的特点和重要性&…

《计算机操作系统》(第4版)第10章 多处理机操作系统 复习笔记

第10章 多处理机操作系统 一、多处理机系统的基本概念 1. 多处理机系统的引入 (1)CPU 时钟频率接近极限。 (2)增加系统吞吐量。 (3)节省投资。 (4)提高系统可靠性。 2.多处理机系统的类型 (1)紧密耦合MPS 和松散耦合MPS ①紧密耦合MPS 紧密耦合通常是通过高速总线或高速交叉开…

页面设计任务 商品详情页(带评论区)

目录 效果图: 任务描述 源码: 详细讲解: 1.产品信息部分 2.用户评论区域 效果图: 任务描述 页面结构: 页面应包括一个标题部分、一个产品展示区和一个客户评价区。使用图片展示产品,并添加描述。客户评价区展示一…

删除Vue2残留配置文件解决异常:Cannot find module ‘@vue/babel-plugin-transform-vue-jsx‘

背景 完成Vue2代码升级为Vue3后,将新代码上传至代码库。在修改源代码库代码后,启动项目,提示:Cannot find module ‘vue/babel-plugin-transform-vue-jsx‘,尝试安装该第三方库后仍然无效。 解决方案: 删…

浅谈【数据结构】图-图的存储

目录 1、图的存储 2、邻接表 3、十字链表 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助,一起努力吧!!…

知识竞赛中情境答题环节竞赛规则有哪些设计方案

情境题通常会给出一个具体的情景或场景,然后要求选手在该情境下回答问题、提出建议、解决问题等。目的是考察选手在特定情境下的分析和解决问题能力。一般由评委进行打分。 1.情境题可以是视频题,也可以是表演题,由选手抽一个题,…

东南亚媒体发布:5种东南亚地区媒体发稿技巧

东南亚国家是一个具有丰富多彩的文化的特点和媒体环境中的地域。想要在这个地区取得成功营销推广产品和服务,掌握如何有效与东南亚地区媒体协作尤为重要。下面我们就详细介绍五种在东南亚媒体发稿技巧,可以帮助读者高效地吸引住目标群体。 1.掌握市场定位…

机械学习—零基础学习日志(如何理解概率论8)

随机变量的协方差与相关系数 来一道练习题: 要先求出,a的数值: 要求联合分布律: 再求期望: 计算相关数值: 最后得到结果: 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08…

DaxPay:一套开源支付网关系统【送源码】

项目介绍 DaxPay是一套开源支付网关系统,已经对接支付宝、微信支付、云闪付相关的接口。可以独立部署,提供接口供业务系统进行调用,不对原有系统产生影响 特色功能 封装各类支付通道的接口为统一的接口,方便业务系统进行调用&am…

yocto | 基于Linux的定制系统跑Qt app(第二集)bitbake工作流程

点击上方"蓝字"关注我们 01、bitbake简介 >>> bitbake是OpenEmbedded构建系统的引擎,通过解析一系列配置文件(主要为recipes,即bb/bbappend文件)来创建任务列表,并根据依赖关系依次执行。通过bitbake -c listtasks xxx(模块名或映像名)命令可以查看…

【工具】Windows 上安装 PostgreSQL(图文详情)

目录 0.背景 1.简介 2.安装步骤 1)下载地址 2)双击安装包进行下载【请以管理员身份打开并安装】 3)安装步骤 4)安装中 5)安装完成 0.背景 最近在学习大数据规模处理的相关课程,需要安装这个数据库以…

公园的客流统计意义何在,有哪些积极作用

随着城市化进程的加快,人们越来越重视休闲娱乐和亲近自然的机会。公园作为市民休闲放松的重要场所,其管理和维护的质量直接影响着市民的生活质量和城市的形象。客流统计在公园管理中扮演着重要角色,不仅可以帮助公园管理者更好地理解游客的行…

Ant Design Vue修改表格样式

原效果: 修改背景色和字体,包括表头和表体,要分开设置: :deep .ant-table-thead>tr>th {background: rgba(255, 255, 255, 0);//去掉表头背景color: rgb(100, 181, 220);font-weight: bold;border: none;//去掉表头边框}:d…

分组汇总后再根据数量拼上不同文字

Excel某表格有2列。 AB1Apples32Apples03Bananas14Bananas65Cantaloupe06Kiwis27Kiwis28Kiwis1 要求:按第1列分组,如果组内第2列大于0则对当前行进行计数,否则不计数;计数结果等于1则附加Occurrence,否则附加 Occurr…

连发3篇JHM !东北林业大学严善春教授和姜礅教授研究团队在重金属污染生态学与森林昆虫学交叉研究领域取得一系列新进展!

本文首发于“生态学者”微信公众号! 近日,东北林业大学森林生态系统可持续经营教育部重点实验室严善春教授和姜礅教授项目组在重金属污染生态学与森林昆虫学交叉研究领域取得新进展。相关结果以“Cd exposure confers β-cypermethrin tolerance in Lym…

World of Warcraft [RETAIL] [70][Freeblue] /console WorldTextScale 3

魔兽正式服,打怪伤害数字显示大小,调整命令/console WorldTextScale n(n 1,2,3,4,5,.....) /console WorldTextScale 1 /console WorldTextScale 2 /console WorldTextScale 3 /console WorldTextScale 4 /console WorldTextSca…

驱动 day1 --内核的编译

1 内核编译:Makefile (1)下载linux源码 解压:sudo tar -xvf (3)编译内容 条件编译: 在内核的Makefile中,你可以通过检查.config文件中定义的配置宏来决定是否编译某个模块或文件 obj-$(CONFIG_LED) xx1.o obj-$(CONFIG_XX2) xx2.o …

【计算机网络】名词解释--网络专有名词详解

在网络通信中,有许多专业术语和概念,它们共同构成了网络通信的基础。以下是一些常见的网络术语及其定义和相互之间的关系: 一、网络基础 1.1 电路交换:电路交换是一种在数据传输前建立专用通信路径的通信方式。在通信开始前&…

振动分析-21-从管道的刚性和柔性连接到设备的刚性和柔性支撑

刚性连接与柔性连接在管道连接方面的应用介绍。 1 管道的刚性连接 1.1 刚性连接的概念与特点 刚性连接指的是管道之间的连接点在受到外力时几乎不会发生位移或变形。刚性连接使管道各部分成为一个固定且坚固的整体,具有高强度和高稳定性,能够有效抵抗外力的作用。 刚性连…

WEB服务器-Nginx源码安装及相关配置

一、web服务概述 二、Nginx 概述 三、Nginx源码安装 直接下载压缩包到/home家目录进行操作 3.1 下载所需环境 dnf install gcc pcre-devel zlib-devel openssl-devel -y 源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection&#x…