記錄--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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...