詳解如何在nodejs項(xiàng)目中使用Vue的響應(yīng)式API
前言
vue3的響應(yīng)式API大家應(yīng)該都特別熟悉,比如ref
、watch
、watchEffect
等。平時(shí)大家都是在vue-cli
或者vite
創(chuàng)建的vue項(xiàng)目里面使用的這些響應(yīng)式API,今天歐陽給大家?guī)硪恍┎灰粯拥?。脫離vue項(xiàng)目,在node.js
項(xiàng)目中使用vue的響應(yīng)式API。
直接上代碼
話不多說,直接上代碼。這個(gè)是我在本地新建的一個(gè)最簡(jiǎn)單的node.js
項(xiàng)目,如下圖:
從上圖可以看到我們的node.js
項(xiàng)目依賴只有一個(gè):vue
。并且提供了一個(gè)名為dev的腳本命令,這個(gè)腳本命令實(shí)際是在node環(huán)境內(nèi)執(zhí)行index.js
文件。
我們來看index.js
文件,代碼如下:
const { ref, watch, watchEffect } = require("vue"); const count = ref(0); // 模擬count變量的值修改 setInterval(() => { count.value++; }, 1000); watch(count, (newVal) => { console.log("觸發(fā)watch", newVal); }); watchEffect( () => { console.log("觸發(fā)watchEffect", count.value); }, { flush: "sync", } );
為了標(biāo)明index.js
文件是在node.js
環(huán)境中運(yùn)行的,所以這里我特地使用require
去導(dǎo)入vue導(dǎo)出的ref
、watch
、watchEffect
這三個(gè)響應(yīng)式API。
并且我們還模擬了修改count
響應(yīng)式變量值的操作,使用setInterval
每隔一秒讓count
的值+1
。
在vue項(xiàng)目中一樣使用watch
和watchEffect
去監(jiān)聽count
變量的值。
在終端執(zhí)行yarn dev
,也就是執(zhí)行node index.js
,如下圖:
從上圖中可以看到在node.js
中的執(zhí)行結(jié)果和預(yù)期是一模一樣的。
為什么可以這樣寫呢
前面的那個(gè)例子是一個(gè)node.js
項(xiàng)目,項(xiàng)目中我們并沒有像vue項(xiàng)目那樣去創(chuàng)建一個(gè)vue組件,然后在組件里面去使用響應(yīng)式API。而是直接在一個(gè)普通的node.js
文件中使用vue暴露出來的響應(yīng)式API,并且watch
和watchEffect
在監(jiān)聽的值改變后同樣觸發(fā)了對(duì)應(yīng)的watch回調(diào),那么這個(gè)又是怎么做到的呢?
這得益于vue3優(yōu)秀的模塊化設(shè)計(jì),他將核心功能拆分為多個(gè)獨(dú)立的模塊,如下圖:
比如reactivity
模塊中就是響應(yīng)式的核心代碼、compiler-core
模塊就是編譯相關(guān)的核心代碼。
并且這些模塊還被單獨(dú)當(dāng)作npm包進(jìn)行發(fā)布,命名規(guī)則是@vue+模塊名
。比如reactivity
模塊對(duì)應(yīng)的npm包就是@vue/reactivity
。如下圖:
得益于模塊化的設(shè)計(jì),響應(yīng)式相關(guān)的API和vue組件并沒有強(qiáng)關(guān)聯(lián)的關(guān)系,所以我們可以在node.js
應(yīng)用中去直接使用響應(yīng)式API。
這里使用到了三個(gè)響應(yīng)式API,分別是:ref
、watch
和watchEffect
。在vue組件中的響應(yīng)式的實(shí)現(xiàn)原理大家多多少少都有所聽聞,其實(shí)在node.js
項(xiàng)目中實(shí)現(xiàn)原理也是一樣的,接下來我們講講是如何實(shí)現(xiàn)響應(yīng)式的。
在我們這個(gè)demo中count
是一個(gè)ref的響應(yīng)式變量,當(dāng)我們對(duì)count
變量進(jìn)行讀操作時(shí)會(huì)觸發(fā)get
攔截。當(dāng)我們對(duì)count
變量進(jìn)行寫操作時(shí)會(huì)觸發(fā)set
攔截。
在我們這里使用watch
和watchEffect
的代碼是下面這樣的:
watch(count, (newVal) => { console.log("觸發(fā)watch", newVal); }); watchEffect( () => { console.log("觸發(fā)watchEffect", count.value); }, { flush: "sync", } );
當(dāng)代碼首次執(zhí)行到watch
和watchEffect
時(shí)都會(huì)對(duì)count
變量進(jìn)行讀操作,并且watch
和watchEffect
都傳入了一個(gè)回調(diào)函數(shù)。
由于對(duì)count
變量進(jìn)行讀操作了,所以就會(huì)觸發(fā)get
攔截。在get
攔截中會(huì)將當(dāng)前watch的回調(diào)函數(shù)作為依賴收集到count
變量中。收集的方式也很簡(jiǎn)單,因?yàn)?code>count變量是一個(gè)對(duì)象,所以使用對(duì)象的dep
屬性進(jìn)行依賴收集。因?yàn)?code>dep屬性是一個(gè)集合,所以可以收集多個(gè)依賴。
在我們這里watch
和watchEffect
都觸發(fā)了count
變量的get攔截,所以watch
和watchEffect
的回調(diào)函數(shù)都被count
變量進(jìn)行了依賴收集。
當(dāng)修改count
變量的值時(shí)會(huì)觸發(fā)set
攔截,在set
攔截中做的事情也很簡(jiǎn)單。將count
變量收集到的依賴全部取出來,然后執(zhí)行一遍。這里收集的依賴是watch
和watchEffect
的回調(diào)函數(shù),所以當(dāng)count
變量的值改變時(shí)會(huì)導(dǎo)致watch
和watchEffect
的回調(diào)函數(shù)重新執(zhí)行。
這個(gè)是整個(gè)流程圖:
從流程圖可以看到響應(yīng)式的實(shí)現(xiàn)原來完全不依賴vue組件,所以我們可以在node.js
項(xiàng)目中使用vue的響應(yīng)式API,這也是vue的設(shè)計(jì)奇妙之處。
總結(jié)
這篇文章講了我們可以脫離vue項(xiàng)目,直接在node.js
項(xiàng)目中使用vue的響應(yīng)式API。接著講了響應(yīng)式的實(shí)現(xiàn)原理其實(shí)就是依靠get
攔截進(jìn)行依賴收集,set
攔截進(jìn)行依賴觸發(fā)。
搞清楚響應(yīng)式原理后,我們發(fā)現(xiàn)響應(yīng)式完全不依賴vue組件,所以我們可以在node.js
項(xiàng)目中使用vue的響應(yīng)式API,這也是vue的設(shè)計(jì)奇妙之處。
到此這篇關(guān)于詳解如何在nodejs項(xiàng)目中使用Vue的響應(yīng)式API的文章就介紹到這了,更多相關(guān)nodejs使用Vue響應(yīng)式API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js基于socket.io快速實(shí)現(xiàn)一個(gè)實(shí)時(shí)通訊應(yīng)用
這篇文章主要介紹了node.js基于socket.io快速實(shí)現(xiàn)一個(gè)實(shí)時(shí)通訊應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Pycharm配置Node.js運(yùn)行js代碼詳細(xì)過程
在PyCharm中寫JavaScript代碼并進(jìn)行調(diào)試是非常方便的,但是有些用戶可能對(duì)如何在PyCharm中準(zhǔn)確地運(yùn)行JavaScript代碼感到困惑,這篇文章主要給大家介紹了關(guān)于Pycharm配置Node.js運(yùn)行js代碼的相關(guān)資料,需要的朋友可以參考下2023-11-11nodejs+express+multer搭建文件上傳文件預(yù)覽功能
Express 是一個(gè)簡(jiǎn)潔而靈活的 node.js Web應(yīng)用框架, 提供了一系列強(qiáng)大特性幫助你創(chuàng)建各種 Web 應(yīng)用,和豐富的 HTTP 工具,今天給大家分享nodejs+express+multer搭建文件上傳文件預(yù)覽功能,感興趣的朋友一起看看吧2025-03-03微信小程序搭載node.js服務(wù)器的簡(jiǎn)單教程
小程序是一種全新的連接用戶與服務(wù)的方式,它可以在微信內(nèi)被便捷地獲取和傳播,同時(shí)具有出色的使用體驗(yàn),下面這篇文章主要給大家介紹了關(guān)于微信小程序搭載node.js服務(wù)器的簡(jiǎn)單教程,需要的朋友可以參考下2022-12-12Node.js API詳解之 vm模塊用法實(shí)例分析
這篇文章主要介紹了Node.js API詳解之 vm模塊用法,結(jié)合實(shí)例形式分析了Node.js API中vm模塊基本功能、函數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-05-05淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件
這篇文章主要介紹了淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09史上無敵詳細(xì)的Node.Js環(huán)境搭建步驟記錄
Node.js是一個(gè)事件驅(qū)動(dòng)I/O服務(wù)端JavaScript環(huán)境,由于其擁有異步非阻塞、環(huán)境搭建簡(jiǎn)單、實(shí)踐應(yīng)用快等特性,使得其在新一代編程開發(fā)中更為流行,下面這篇文章主要給大家介紹了關(guān)于Node.Js環(huán)境搭建步驟記錄的相關(guān)資料,需要的朋友可以參考下2023-03-03利用node.js實(shí)現(xiàn)反向代理的方法詳解
在實(shí)際工程開發(fā)中,會(huì)有前后端分離的需求。為了平滑的完成前端請(qǐng)求到后端各個(gè)獨(dú)立服務(wù),需要一個(gè)中間件實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)的功能,利用Nginx可以實(shí)現(xiàn),在這里使用nodejs實(shí)現(xiàn)一個(gè)反向代理服務(wù)器。本文主要介紹了關(guān)于利用node.js實(shí)現(xiàn)反向代理的相關(guān)資料,需要的朋友可以參考下。2017-07-07