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