Vue3詳解

vite和webpack區別

vite

vite使用原生ES模塊進行開發,無需在編譯時將所有代碼轉換為JS打包,從而提供了更快的熱更新和自動刷新功能;
vite在開發模式下沒有打包步驟,而是利用瀏覽器的ES Module Imports特性實現按需編譯,這種模式極大的提高了開發環境的相應速度,在生產模式下,vite使用Rollup進行打包,提供更好的tree-shaking和代碼壓縮。
由于ES Module需要高版本瀏覽器支持,所以本地編譯選用使用高版本瀏覽器

webpack

webpack擁有豐富的插件系統和高度可配置性,但由于全量的熱更新策略導致編譯速度慢;
webpack將所有模塊打包為一個或多個文件,初次加載速度較慢
webpack插件生態非常成熟,使得在大型復雜項目中具有很高的靈活性

webpack會先打包,然后啟動開發服務器,請求服務器時直接給予打包結果。而vite是直接啟動開發服務器,請求哪個模塊再對該模塊進行實時編譯。由于現代瀏覽器本身就支持ES Module,會自動向依賴的Module發出請求。vite充分利用這一點,將開發環境的模塊文件,就作為瀏覽器要執行的文件,而不是像webpack那樣進行打包合并。由于vite再啟動時候不需要打包,也就意味著不需要分析模塊的依賴、不需要編譯,因此啟動速度非常快。當瀏覽器請求某個模塊時候,再根據需要對模塊內容進行編譯。這種按需動態編譯的方式,極大的縮減了編譯的時間,項目越復雜、模塊越多、vite的優勢越明顯。
在HMR方面,當改動了一個模塊后,僅需讓瀏覽器重新請求該模塊即可,不像webapck那樣需要把該模塊的相關依賴模塊全部編譯一次,效率更高。
當需要打包到生產環境時,vite使用傳統的rollup進行打包,因此vite的主要優勢在開發階段,由于vite使用的是ES Module,因此在代碼中不可以使用CommonJS

watchEffect watch computed區別

  • watchEffect
function watchEffect(/*要運行的副作用函數。用來注冊清理回調。清理回調會在該副作用的下一次執行前被調用,可以用來清理無效的副作用*/effect: (onCleanup: OnCleanup) => void,/*可以用來調整副作用的刷新時機或調試副作用的依賴。默認情況下,偵聽器在組件渲染之前執行,設置flust: 'post'將會使偵聽器延遲到組件渲染之后再執行。在某些特殊情況(列如要使緩存失效),可能有必要在響應式依賴放生改變時立即出發偵察器,可以使用flush: 'sync'當多個屬性同時更新時,這將會導致一些性能和數據一致性的問題*/options?: WatchEffectOptions
): StopHandletype OnCleanup = (cleanupFn: () => void) => voidinterface WatchEffectOptions {flush?: 'pre' | 'post' | 'sync' // 默認:'pre'onTrack?: (event: DebuggerEvent) => voidonTrigger?: (event: DebuggerEvent) => void
}type StopHandle = () => voidconst count = ref(0)
watchEffect(() => console.log(count.value))
// -> 輸出 0
count.value++
// -> 輸出 1// 副作用清除
watchEffect(async (onCleanup) => {const { response, cancel } = doAsyncWork(id.value)// `cancel` 會在 `id` 更改時調用// 以便取消之前// 未完成的請求onCleanup(cancel)data.value = await response
})//停止偵聽器:
const stop = watchEffect(() => {})// 當不再需要此偵聽器時:
stop()
  • watch
  • computed

vue3的效率提升主要表現在哪些方面

  • 靜態提升
  • 預字符串化
  • 緩存事件處理函數
  • PatchFlag

在這里插入圖片描述

上圖中會對h1,h2標簽做靜態提升,在render函數外定義_hoisted_1,_hoisted_1 在render函數中可以重復使用;
當存在連續大量的(測試元素數量>10)靜態元素時候,vue3會進行預字符串化,通過_createStaticVNode生成字符串;
當有事件處理時vue3會讀取render中_cache緩存,而不需要每次都重新創建一個事件;
vue2中不會區分節點是動態的還是靜態的,需要層層比較,而vue3中會在_createElementVNode中對節點進行標記,動態節點標記為1,靜態節點標記為-1

 _createElementVNode(type, props, children, patchFlag, dynamicChildren, shapeFlag, hooks, data){/**type:組件的構造函數、選項式組件的 VNode 數據對象或者 HTML 標簽字符串。props:一個對象,包含 (可能是 reactive 的) 屬性,這些屬性會被傳遞到組件。children:子 VNode 或者靜態內容的數組。patchFlag:用于優化渲染的標記位。dynamicChildren:動態子 VNode 的數組,用于動態 children。shapeFlag:標記 VNode 的形狀信息,比如是否是元素、文本、Fragment 等。hooks:生命周期鉤子對象。data:VNode 數據對象,包含了與平臺相關的屬性,比如 props、attrs、on。*/
}export const enum PatchFlags {TEXT = 1,// 1 動態的文本節點CLASS = 1 << 1,  // 2 動態的 classSTYLE = 1 << 2,  // 4 動態的 stylePROPS = 1 << 3,  // 8 動態屬性,不包括類名和樣式FULL_PROPS = 1 << 4,  // 16 動態 key,當 key 變化時需要完整的 diff 算法做比較HYDRATE_EVENTS = 1 << 5,  // 32 表示帶有事件監聽器的節點STABLE_FRAGMENT = 1 << 6,   // 64 一個不會改變子節點順序的 FragmentKEYED_FRAGMENT = 1 << 7, // 128 帶有 key 屬性的 FragmentUNKEYED_FRAGMENT = 1 << 8, // 256 子節點沒有 key 的 FragmentNEED_PATCH = 1 << 9,   // 512  表示只需要non-props修補的元素 (non-props不知道怎么翻才恰當~)DYNAMIC_SLOTS = 1 << 10,  // 1024 動態的soltDEV_ROOT_FRAGMENT = 1 << 11, //2048 表示僅因為用戶在模板的根級別放置注釋而創建的片段。 這是一個僅用于開發的標志,因為注釋在生產中被剝離。//以下兩個是特殊標記HOISTED = -1,  // 表示已提升的靜態vnode,更新時調過整個子樹BAIL = -2 // 指示差異算法應該退出優化模式
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38369.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入分析 Android HTTPS 證書管理策略:設置本地證書、使用系統默認證書和忽略證書

深入分析 Android HTTPS 證書管理策略&#xff1a;設置本地證書、使用系統默認證書和忽略證書 在 Android 應用開發中&#xff0c;確保 HTTPS 請求的安全性至關重要。為實現這一目標&#xff0c;我們可以通過不同的方式來管理 HTTPS 證書。本文將詳細探討三種常見的證書管理策…

【ajax實戰08】分頁功能

本文章目標&#xff1a;點擊上/下一頁按鈕&#xff0c;實現對應頁面的變化 實現基本步驟&#xff1a; 一&#xff1a;保存并設置文章總條數 設置一個全局變量&#xff0c;將服務器返回的數據返回給全局變量 二&#xff1a;點擊下一頁&#xff0c;做臨界值判斷&#xff0c;并…

Firefox 編譯指南2024 Windows10篇- 編譯Firefox(三)

1.引言 在成功獲取了Firefox源碼之后&#xff0c;下一步就是將這些源碼編譯成一個可執行的瀏覽器。編譯是開發流程中的關鍵環節&#xff0c;通過編譯&#xff0c;我們可以將源代碼轉換為可執行的程序&#xff0c;測試其功能&#xff0c;并進行必要的優化和調試。 對于像Firef…

git命令含有中文,終端輸出中文亂碼的問題

目錄 1、[當前代碼頁] 的936 (ANSI/OEM - 簡體中文 GBK) 是導致中文亂碼的原因 2、這樣會導致什么問題呢&#xff1f; (1) 問題一: 【屬性】選項的【字體】無法識別自定義文字樣式&#xff0c;【默認值】選項可選自定義字體樣式&#xff0c;卻無法覆蓋【屬性】選項 (2) 問題…

品牌推廣怎么樣?掌握正確做法,讓品牌大放異彩!

品牌推廣對于初創公司來說是一項至關重要的任務。在市場眾多品牌中&#xff0c;如何脫穎而出&#xff0c;是每個品牌方都要考慮的問題。 作為一名手工酸奶品牌的創始人&#xff0c;目前全國復制了100多家門店&#xff0c;我來分享下&#xff0c;如何推廣&#xff0c;可以讓品牌…

通過shell腳本創建MySQl數據庫

通過shell腳本創建數據庫 #!/bin/bashserverIP10.1.1.196 SERVER_NAMEecho $serverIP | cut -d . -f4cat<<EOF>db.sql drop database if exists ${SERVER_NAME}_scheduler; drop database if exists ${SERVER_NAME}_kms; drop database if exists ${SERVER_NAME}_uim…

Unity 粒子特效(下)

11、Size over Lifetime(生命周期內大小) 主要用于定義粒子從發射到消亡的整個生命周期內&#xff0c;其大小如何隨時間發生變化。通過該模塊&#xff0c;可以創建出如煙霧擴散、火焰膨脹等。Separate Axes&#xff1a;當勾選此選項時&#xff0c;可以分別控制粒子在X軸、Y軸和…

自定義控件動畫篇(四)ObjectAnimator的使用

ObjectAnimator 是 Android 屬性動畫框架中的一個重要組件&#xff0c;它允許你針對特定屬性的值進行動畫處理。與 ValueAnimator 相比&#xff0c;ObjectAnimator 更專注于 UI 組件&#xff0c;可以直接作用于視圖的屬性&#xff0c;如位置、尺寸、透明度等&#xff0c;而無需…

詳細闡述 Spring Boot 的核心概念、優勢、開發流程、常見配置以及最佳實踐

Spring Boot 是一種基于 Java 的框架&#xff0c;它簡化了基于 Spring 的應用開發。通過自動配置和嵌入式服務器等技術&#xff0c;Spring Boot 使得開發者可以快速搭建并運行 Spring 應用。下面&#xff0c;我將詳細闡述 Spring Boot 的核心概念、優勢、開發流程、常見配置以及…

閉包的不同形式

定義 **閉包&#xff08;closure&#xff09;**是一個函數以及其捆綁的周邊環境狀態&#xff08;lexical environment&#xff0c;詞法環境&#xff09;的引用的組合。換而言之&#xff0c;閉包讓開發者可以從內部函數訪問外部函數的作用域。在 JavaScript 中&#xff0c;閉包…

【Jetpack】ViewModel使用技巧

ViewModel的基本使用方法&#xff0c;這里不再講解 ViewModel優點 可以在屏幕旋轉之后&#xff0c;仍然保持之前的狀態&#xff0c;這樣就不用刻意去處理屏幕旋轉事件可以輕松實現作用域內的單例模式可以輕松在作用域內進行數據共享 ViewMode使用注意 不能將Activity作為Co…

Centos7修改yum源

安裝好系統后&#xff0c;網絡能通信&#xff0c;源也沒有配置&#xff0c;但是安裝軟件失敗。 解決辦法&#xff1a;配置阿里yum源 # curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # yum clean all # yum make cache再次安裝軟…

AI安全研究滯后?清華專家團來支招

在21世紀的科技浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;無疑是最為耀眼的一抹亮色。隨著技術的不斷突破&#xff0c;AI正以前所未有的速度融入我們的日常生活&#xff0c;重塑著社會、經濟乃至人類文明的面貌。然而&#xff0c;在這股洶涌澎湃的發展洪流中&#…

二分查找1

1. 二分查找&#xff08;704&#xff09; 題目描述&#xff1a; 算法原理&#xff1a; 暴力解法就是遍歷數組來找到相應的元素&#xff0c;使用二分查找的解法就是每次在數組中選定一個元素來將數組劃分為兩部分&#xff0c;然后因為數組有序&#xff0c;所以通過大小關系舍棄…

七天速通javaSE:第五天 數組基礎

文章目錄 前言一、認識數組二、數組的聲明和創建1. 聲明數組變量2. 創建數組3. 變量的初始化&#xff08;賦值&#xff09;3.1 靜態初始化3.2 動態初始化 3. 示例 三、數組的使用1. 循環1.1 普通for循環1.2 For-Each 循環 2. 數組作為函數的參數和返回值 前言 本文將為大家介紹…

Win11 Python3.10 安裝pytorch3d

0&#xff0c;背景 Python3.10、cuda 11.7、pytorch 2.0.1 閱讀【深度學習】【三維重建】windows10環境配置PyTorch3d詳細教程-CSDN博客 1&#xff0c;解決方法 本來想嘗試&#xff0c;結果發現CUB安裝配置對照表里沒有cuda 11.7對應的版本&#xff0c;不敢輕舉妄動&#x…

0051__win - RegisterWaitForSingleObject的例子

win - RegisterWaitForSingleObject的例子_registerwaitforsingleobject msdn-CSDN博客

DP:子序列問題

文章目錄 什么是子序列子序列的特點舉例說明常見問題 關于子序列問題的幾個例題1.最長遞增子序列2.擺動序列3.最長遞增子序列的個數4.最長數對鏈5.最長定差子序列 總結 什么是子序列 在計算機科學和數學中&#xff0c;子序列&#xff08;Subsequence&#xff09;是指從一個序列…

c語言的燙燙燙燙燙??

當初學習C語言時&#xff0c;對于一些特殊的打印輸出可能會感到困惑&#xff0c;比如會出現一堆亂碼燙燙燙的情況。其實這是因為在C語言中&#xff0c;對于字符類型和數字類型之間的隱式轉換可能會導致打印輸出的結果不符合預期。這并不意味著程序員"燙"&#xff0c;…

[激光原理與應用-96]:激光器研發與生產所要的常見設備(大全)與儀器(圖解)

目錄 一、激光器制造設備 二、測試與校準設備 2.1 光功率計&#xff1a; 1、工作原理 2、主要功能 3、應用場景 4、測量方法 5、總結 2.2. 激光束質量分析儀&#xff1a; 1、概述 2、主要功能和特點 3、工作原理 4、常見品牌和型號 5、應用領域 6、總結 2.3 光…