涨见识了!脱离vue项目竟然也可以使用响应式API
前言
vue3的响应式API大家应该都特别熟悉,比如ref、watch、watchEffect等。平时大家都是在vue-cli或者vite创建的vue项目里面使用的这些响应式API,今天欧阳给大家带来一些不一样的。脱离vue项目,在node.js项目中使用vue的响应式API。
关注公众号:【前端欧阳】,给自己一个进阶vue的机会
直接上代码
话不多说,直接上代码。这个是我在本地新建的一个最简单的node.js项目,如下图:

从上图可以看到我们的node.js项目依赖只有一个:vue。并且提供了一个名为dev的脚本命令,这个脚本命令实际是在node环境内执行index.js文件。
我们来看index.js文件,代码如下:
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",
}
);
为了标明index.js文件是在node.js环境中运行的,所以这里我特地使用require去导入vue导出的ref、watch、watchEffect这三个响应式API。
并且我们还模拟了修改count响应式变量值的操作,使用setInterval每隔一秒让count的值+1。
在vue项目中一样使用watch和watchEffect去监听count变量的值。
在终端执行yarn dev,也就是执行node index.js,如下图:

从上图中可以看到在node.js中的执行结果和预期是一模一样的。
为什么可以这样写呢?
前面的那个例子是一个node.js项目,项目中我们并没有像vue项目那样去创建一个vue组件,然后在组件里面去使用响应式API。而是直接在一个普通的node.js文件中使用vue暴露出来的响应式API,并且watch和watchEffect在监听的值改变后同样触发了对应的watch回调,那么这个又是怎么做到的呢?
这得益于vue3优秀的模块化设计,他将核心功能拆分为多个独立的模块,如下图:

比如reactivity模块中就是响应式的核心代码、compiler-core模块就是编译相关的核心代码。
并且这些模块还被单独当作npm包进行发布,命名规则是@vue+模块名。比如reactivity模块对应的npm包就是@vue/reactivity。如下图:

得益于模块化的设计,响应式相关的API和vue组件并没有强关联的关系,所以我们可以在node.js应用中去直接使用响应式API。
这里使用到了三个响应式API,分别是:ref、watch和watchEffect。在vue组件中的响应式的实现原理大家多多少少都有所听闻,其实在node.js项目中实现原理也是一样的,接下来我们讲讲是如何实现响应式的。
在我们这个demo中count是一个ref的响应式变量,当我们对count变量进行读操作时会触发get拦截。当我们对count变量进行写操作时会触发set拦截。
在我们这里使用watch和watchEffect的代码是下面这样的:
watch(count, (newVal) => {
console.log("触发watch", newVal);
});
watchEffect(
() => {
console.log("触发watchEffect", count.value);
},
{
flush: "sync",
}
);
当代码首次执行到watch和watchEffect时都会对count变量进行读操作,并且watch和watchEffect都传入了一个回调函数。
由于对count变量进行读操作了,所以就会触发get拦截。在get拦截中会将当前watch的回调函数作为依赖收集到count变量中。收集的方式也很简单,因为count变量是一个对象,所以使用对象的dep属性进行依赖收集。因为dep属性是一个集合,所以可以收集多个依赖。
在我们这里watch和watchEffect都触发了count变量的get拦截,所以watch和watchEffect的回调函数都被count变量进行了依赖收集。
当修改count变量的值时会触发set拦截,在set拦截中做的事情也很简单。将count变量收集到的依赖全部取出来,然后执行一遍。这里收集的依赖是watch和watchEffect的回调函数,所以当count变量的值改变时会导致watch和watchEffect的回调函数重新执行。
这个是整个流程图:

从流程图可以看到响应式的实现原来完全不依赖vue组件,所以我们可以在node.js项目中使用vue的响应式API,这也是vue的设计奇妙之处。
总结
这篇文章讲了我们可以脱离vue项目,直接在node.js项目中使用vue的响应式API。接着讲了响应式的实现原理其实就是依靠get拦截进行依赖收集,set拦截进行依赖触发。
搞清楚响应式原理后,我们发现响应式完全不依赖vue组件,所以我们可以在node.js项目中使用vue的响应式API,这也是vue的设计奇妙之处。
关注公众号:【前端欧阳】,给自己一个进阶vue的机会

涨见识了!脱离vue项目竟然也可以使用响应式API的更多相关文章
- 【Vue高级知识】细谈Vue 中三要素(响应式+模板+render函数)
[Vue高级知识]细谈Vue 中三要素(响应式+模板+render函数):https://blog.csdn.net/m0_37981569/article/details/93304809
- vue项目使用vue-amap调用高德地图api详细步骤
想要的效果如下 : 高德地图 && 信息窗体 步骤一: 申请高德key 高德开放平台 | 高德地图API (amap.com) (可参考博客: [996]如何申请高德地图用户Key ...
- 【Vue源码学习】响应式原理探秘
最近准备开启Vue的源码学习,并且每一个Vue的重要知识点都会记录下来.我们知道Vue的核心理念是数据驱动视图,所有操作都只需要在数据层做处理,不必关心视图层的操作.这里先来学习Vue的响应式原理,V ...
- Vue.2.0.5-深入响应式原理
大部分的基础内容我们已经讲到了,现在讲点底层内容.Vue 最显著的一个功能是响应系统 -- 模型只是普通对象,修改它则更新视图.这会让状态管理变得非常简单且直观,不过理解它的原理以避免一些常见的陷阱也 ...
- Vue.js学习 Item12 – 内部响应式原理探究
深入响应式原理 大部分的基础内容我们已经讲到了,现在讲点底层内容.Vue.js 最显著的一个功能是响应系统 —— 模型只是普通对象,修改它则更新视图.这让状态管理非常简单且直观,不过理解它的原理也很重 ...
- 读Vue源码二 (响应式对象)
vue在init的时候会执行observer方法,如果value是对象就直接返回,如果对象上没有定义过_ob_这个属性,就 new Observer实例 export function observe ...
- 深入浅出Vue基于“依赖收集”的响应式原理(转)
add by zhj: 文章写的很通俗易懂,明白了Object.defineProperty的用法 原文:https://zhuanlan.zhihu.com/p/29318017 每当问到VueJS ...
- vue新增属性是否会响应式更新?
原文地址 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. 根据官 ...
- 项目总结一:响应式之CSS3 媒体查询
1.<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scala ...
- vue源码解析之响应式原理
关于defineReactive等使用细节需要自行了解 一些关键知识点 $mount时 会 new Watcher 把组件的 updateComponent 方法传给watcher 作为getter ...
随机推荐
- FreeSWITCH使用soundtouch进行变声
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 FreeSWITCH里面有个mod_soundtouch模块,支持通话实时变声,今天整理下CentOS 7环境下 ...
- 鸿蒙HarmonyOS实战-ArkTS语言基础类库(通知)
前言 移动应用中的通知是指应用程序发送给用户的一种提示或提醒消息.这些通知可以在用户设备的通知中心或状态栏中显示,以提醒用户有关应用程序的活动.事件或重要信息. 移动应用中的通知可以分为两种类型:本地 ...
- SpringBoot系列(二) 环境搭建,创建我的第一个程序HelloWord。
环境准备: jdk1.8:java version "1.8.0_231",详见链接 maven3.x:maven3.3以上版本,详见链接 IDEA2021:IntelliJ ID ...
- Vue TypeScript 实战:掌握静态类型编程
title: Vue TypeScript 实战:掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境 ...
- CentOS 7 Graylog 安装和卸载
CentOS 7 安装 Graylog #主体思路1.安装JDK8.2.安装mongodb.3.安装Elasticsearch,并修改elasticsearch.yml 文件 .4.安装Graylog ...
- Flashcat与出行科技企业一起实践多云可观测
当前架构 某出行科技企业从单个公有云往多云转型,依托于国内领先的公有云提供商,采用多云架构,在可用性.弹性.成本.供应商依赖方面,拥有了显著的优势. 相应的,多云架构也给技术团队带来了一定的复杂度和技 ...
- disabled 和 readonly 都是 HTML 表单元素的属性,它们有一些相同点和不同点。
disabled 和 readonly 都是 HTML 表单元素的属性,它们有一些相同点和不同点. 相同点: disabled 和 readonly 属性都可以用于表单中的输入框.文本域等元素,用于控 ...
- Css var 的基础使用
Css var 语法 var(custom-property-name, value) - custom-property-name 必须 变量必须以 --开头 后面可以是英文.数字连接符,区分大小写 ...
- linux解压缩,复制,重命名,删除,目录按更新时间排序,grep递归搜索文档
linux解压缩,复制,重命名,删除,目录按更新时间排序,grep递归搜索文档 1.解压缩压缩命令 zip -p -r mymail-1026.zip mymail/ 解压命令 unzip mymai ...
- 日常Bug排查-改表时读数据不一致
前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 线上连续两天出现NP异常,而且都是凌晨低峰期才出现,在凌晨的流量远没有白天高 ...