記錄--Vue使用CDN引入,響應式失效?

来源:https://www.cnblogs.com/smileZAZ/archive/2023/12/05/17877862.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 最近心血來潮,想要在本地開發時,也用CDN的方式引入 Vue,想著既然通過CDN引入了,那麼在項目中就沒必要再 import Vue,然後把項目中引入 Vue 的地方都刪掉,結果改完後,界面看似正常運行,但數據變更後,界面沒有重新渲 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

背景

最近心血來潮,想要在本地開發時,也用CDN的方式引入 Vue,想著既然通過CDN引入了,那麼在項目中就沒必要再 import Vue,然後把項目中引入 Vue 的地方都刪掉,結果改完後,界面看似正常運行,但數據變更後,界面沒有重新渲染。經過一番折騰,終於定位到問題。

vue版本:Vue2.7+;打包工具:Vite;核心插件:@vitejs/plugin-vue2;

在解決這個問題之前,我們需要先搞清楚兩個事情:1)@vitejs/plugin-vue2的作用;2)@vitejs/plugin-vue2的工作原理。

@vitejs/plugin-vue2的作用

vite不做贅述,具體內容看官網

在聊@vitejs/plugin-vue2的作用之前,我們必須搞清楚什麼是單文件組件

Vue 的單文件組件 (即 *.vue 文件,英文 Single-File Component,簡稱 SFC) 是一種特殊的文件格式,使我們能夠將一個 Vue 組件的模板、邏輯與樣式封裝在單個文件中。

很明顯,這是 Vue 自己定義並實現的組件模板,不能直接在瀏覽器中運行,在實際項目中,我們一般會使用集成了 SFC 編譯器的構建工具,比如 Vite 或者 Vue CLI (基於 webpack)。本文只討論使用 Vite 的情況。

@vitejs/plugin-vue2 就是提供對 Vue 2.7 的單文件組件支持。如果大家的Vue項目是使用 Vite ,下麵這段代碼應該不陌生:

// vite.config.js
import vue from '@vitejs/plugin-vue2'

export default {
  plugins: [vue()]
}

想要*.vue 文件能正常在瀏覽器中運行,我們就需要做以上配置。

@vitejs/plugin-vue2的工作原理

扒了一下這個插件的源碼,發現一行至關重要的代碼,如下圖:

這個插件在工作時,要依賴 Vue,上面紅色框標註的部分,就是它如何去查找 Vue 的邏輯。如果我們在配置文件中,配置了 Vue alias,則會使用配置的alias,否則預設使用本地安裝的 Vue。如何使用alias,參加vite文檔alias

這裡可以先記住這個邏輯,後面有用。

問題分析

我們先看看復現問題的路徑:1. 在 index.html 直接引入 Vue CDN;2. 刪除項目中import Vue 的代碼。

然後本地Run起來,界面看起來很正常,但是,修改數據後,發現界面沒有重新渲染。為什麼呢?

我們先看經過 @vitejs/plugin-vue2 處理之後生成的代碼是什麼樣的,如下圖:

因為我在項目中,沒有為 Vue 配置 alias,所以**@vitejs/plugin-vue2直接使用了我本地安裝的 Vue**。原因見@vitejs/plugin-vue2的工作原理

但問題是,我在項目中刪除了 import Vue 的代碼,這個時候界面之所以能正常運行,是因為我在index.html引入的 Vue 有正常初始化,這裡就產生了一個衝突:

最後@vitejs/plugin-vue2處理的產物中,是使用本地 Vue 導出的 Ref 來處理響應式變數,但真正執行 Vue 初始化動作依賴的卻是 CDN。這會帶來什麼問題?

也就是說,數據變化後,能正常執行響應式邏輯,但是 notify 的時候,卻找不到可通知對象(此時,是觸發了 本地安裝 Vue 的代碼邏輯),因為初始化的時候,收集依賴關係時,執行的是 CDN 導入的 Vue 代碼邏輯,這兩者之間沒有正確建立聯繫,導致數據變了,但是界面沒有重新渲染。

如果看不懂,可能需要瞭解一下 Vue 初始化時 幹了啥,主要是要知道如何收集依賴,並觸發DOM更新,要理解Watcher是如何工作的。

如何解決

很簡單,我們只要保證初始化 和 最後數據變化執行 的代碼邏輯 來自同一個源就可以,而不是一個來自 本地安裝的 Vue,一個來自CDN。

最簡單的方法,就是在項目中手動import Vue,這個時候,初始化的時候,就會走 本地安裝的 Vue 的代碼邏輯。

不過這樣的話,還是會載入兩次 Vue,不是特別優雅。也可以使用 CDN 載入的 Vue,也得在項目中 import Vue,只不過引入的 路徑要變化。

import Vue from '具體的 Vue 路徑'

可以通過配置 alias,簡化 from 後面的路徑,變成 import Vue from 'Vue'。

本文轉載於:

https://juejin.cn/post/7295694519185440777

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。一個請求會遵循以下步驟: 1 客戶端向服務端發送命令分四步(發送命令→命令排隊→命令執行→返回結果),並監聽Socket返回,通常以阻塞模式等待服務端響應。 2 服務端處理命令,並將結果返回給客戶端。 上述兩步稱為:Roun ...
  • 課程中,第二章是MySQL環境搭建,因為我是網上找的博客,下載zip,直接安裝的,就沒看視頻,所以沒有第二章筆記。這裡給出MySQL社區版下載地址。 C-03.基本的SELECT語句 1.SQL概述 1.1 SQL背景知識 1974年,IBM研究員發佈了一篇揭開資料庫技術的論文《SEQUEL:一門結 ...
  • SQL CREATE DATABASE 語句 SQL CREATE DATABASE 語句用於創建一個新的 SQL 資料庫。 語法 CREATE DATABASE 資料庫名稱; 示例 以下 SQL 語句創建了一個名為 "testDB" 的資料庫: CREATE DATABASE testDB; 通過 ...
  • 單體架構下鎖的實現方案 1. ReentrantLock全局鎖 ReentrantLock(可重入鎖),指的是一個線程再次對已持有的鎖保護的臨界資源時,重入請求將會成功。 簡單的與我們常用的Synchronized進行比較: ReentrantLock Synchronized 鎖實現機制 依賴AQ ...
  • 如今,大規模、高時效、智能化數據處理已是“剛需”,企業需要更強大的數據平臺,來應對數據查詢、數據處理、數據挖掘、數據展示以及多種計算模型並行的挑戰,湖倉一體方案應運而生。 《實時湖倉實踐五講》是袋鼠雲打造的系列直播活動,將圍繞實時湖倉的建設趨勢和通用問題,邀請奮戰於企業數字化一線的核心產品&技術專家 ...
  • 隨著業務飛速發展,某汽車製造企業業務系統數量、複雜度和數據量都在呈幾何級數的上漲,這就對於企業IT能力和IT架構模式的要求越來越高。加之企業大力發展數字化營銷、新能源車等業務,希望通過持續優化客戶體驗,創造可持續發展的數字化轉型之路。 為更好應對數字化變革所帶來的挑戰,現有的豎井架構的數據體系難以滿 ...
  • 大家好,我是獨孤風,從本周開始,爭取每周為大家帶來一個優秀的開源項目推薦。 開源項目不僅促進了技術的發展和普及,還為全球範圍內的開發者和用戶社區建立了一個共用知識、協作和創新的平臺。站在巨人的肩膀上才能看的更遠,我們平時也應該多多關註開源項目,不僅學習其豐富的知識,也要找機會為開源事業做出自己的貢獻 ...
  • 蘋果在 iPhone 14 Pro 及 iPhone 14 Pro MAX 上推出了靈動島,是一次交互玩法的革新。本文從靈動島的展現形式、場景限制、適配情況和遠程通知更新數據幾個方面全面帶你走進靈動島 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...