Webpack與Vite熱更新差異對比

来源:https://www.cnblogs.com/dengyao-blogs/archive/2022/09/15/16697332.html
-Advertisement-
Play Games

隨著項目的日漸迭代,項目整體的代碼量也會越來越多,從而導致項目體積越來越大;在Webpack時代,很多人會對歷史項目(巨型項目)感到頭疼,因為往往巨型項目在本地開發調試的時候會因為本地代碼的修改觸發HMR熱更新重載頁面,然而這一過程在Webpack的運行機制中顯得很慢,並且是隨著項目越大,熱更新的速 ...


      隨著項目的日漸迭代,項目整體的代碼量也會越來越多,從而導致項目體積越來越大;在Webpack時代,很多人會對歷史項目(巨型項目)感到頭疼,因為往往巨型項目在本地開發調試的時候會因為本地代碼的修改觸發HMR熱更新重載頁面,然而這一過程在Webpack的運行機制中顯得很慢,並且是隨著項目越大,熱更新的速度也會越慢;

      Webpack熱更新慢的問題可以通過 babel-plugin-dynamic-import-node 插件來得到明顯改善,或者通過手動實現動態按需載入(修改entry為當前項目中需要編譯的部分或模塊)亦可大幅提升熱更新速度;

       熱更新構建主要流程

Webpack-dev-server

     在Webpack中,我們的每一次ctrl+s操作,都會觸發熱更新;此時熱更新構建的一個過程應該是此時的終端顯示Compiling......執行重新構建並打包,並生成新的hash值,啟動Webpack-dev-server服務與瀏覽器通過WebSocket建立連接;此時的hash值會作為下一次編譯生成的文件的首碼,以此類推;每次修改會觸發重新編譯,然後發出兩次請求;

     首先看json文件,發出請求返回的結果中有一個c參數和一個h參數,c代表的是本次熱更新要對應的是c模塊,h代表的是本次熱更新重新編譯的過程中新生成的hash值,將作為下一次熱更新請求編譯後生成的文件首碼使用;

     js文件,是修改之後重新編譯生成打包後的代碼,重新對文件進行下載及網路資源載入;

    Vite中熱更新構建過程也是類似,Vite是在本地啟動Vite Server服務,通過WebSocket與瀏覽器進行連接通信,並加入了WebSocket的定時心跳檢測機制,拿到已修改更新的文件路徑以及時間戳標識,然後再次帶上這個時間戳作為參數去重新請求該文件修改後的版本,防止緩存;

 

 

       熱更新邊界

        熱更新邊界即熱更新邊緣,定義了處於極值或者特殊情況的時候該如何去處理熱更新;

       正常來說我們Vue文件會正常熱更新,因為Vue底層部分對熱更新進行了自定義邏輯處理,重新定義了熱更新的處理方式;但是當我們修改js文件或者ts文件,並且這個js或者ts文件剛好被.vue文件所引用,這個時候會怎麼處理?

       js或者ts文件修改之後,Vite會去對這個vue文件進行熱更新,並重新載入該組件;此時,.vue文件就是熱更新邊界;

       當js或者ts文件被修改之後,會沿著依賴樹一直往上尋找依賴關係,直到查找到最近的一個可以熱更新的模塊,這個最近的一個熱更新模塊叫熱更新邊界;

       但是又有一種特殊情況,比如我們修改main.ts或者main.js的時候,因為是入口文件,找不到最近的可以熱更新的模塊,這個時候Vite就不知道如何去執行熱更新了,只能是通過刷新頁面來解決;

 

       Vite熱更新為什麼比Webpack熱更新快?

        Webpack熱更新運行機制:

        Webpack會遍歷你的應用程式中的所有文件,並啟動一個開發伺服器(Webpack-dev-server),然後將整個代碼渲染到開發環境中。從entry入口文件開始,將其依賴的資源文件通過loader打包成一個文件夾,然後通過server傳遞到客戶端運行;也正是因為這樣的運行機制,也必將導致項目代碼量增多,應用體積增大之後,Webpack熱更新需要等待較久的時間才能反映到瀏覽器中;

 

        Vite熱更新運行機制:

        Vite會在本地啟動一個Vite Server服務,對於第三方依賴使用了速度更快的esbuild預構建,對於業務代碼使用原生的ESM,訪問這個服務,現代瀏覽器基本都已支持的import/export等語法可用來直接載入對應模塊的服務端資源,繞過了構建打包過程,對請求的模塊進行實時按需編譯,熱更新時僅需重新請求改動過的模塊即可,繞過了Webpack熱更新全局依賴與業務代碼全部重新編譯的過程;

 

       使用keep-alive組件導致熱更新對ts文件失效,如何解決?

       使用keep-alive組件實現頁面級緩存,會導致熱更新失效;個人理解是:因為vue框架底層源碼部分對Vite熱更新有特殊處理邏輯(import.meta.hot.accept Api用於傳入一個回調函數,來定義該模塊修改後,需要怎麼去熱更新,此Api一般提供給框架或者工具庫的作者使用,業務代碼中可不用關註),而ts文件是沒有熱更新邏輯的,所以會沿著依賴樹一直往上尋找,往上找到一個可以熱更新的模塊對其進行熱更新即可;keep-alive頁面緩存和熱更新概念衝突,在開發環境中我們可以判斷捨棄掉keep-alive緩存,而在生產環境中我們可以捨棄熱更新,達到解決問題的目的;

        解決方案:

 

     Vite劣勢:

     有好必有壞,Vite目前的機制是會大幅提高熱更新的速度,解決Webpack機制中的巨型項目熱更新等待過久的問題,提高開發效率;但是同時也正是因為Vite的運行機制,直接瀏覽器按需向服務端請求資源,這就造成了Vite項目的首屏載入沒有Webpack快,因為Vite首屏的時候會發出大量的請求去拿到資源文件從而渲染頁面,而Webpack不需要;同時懶載入性能方面,Vite也沒有Webpack好;但是首屏渲染這個問題只是第一次載入的時候會比較慢,Vite對第三方依賴做了緩存處理,第二次之後的頁面載入速度提升很多;總體來說,Vite是優大於劣;

  作者:有夢想的鹹魚前端 出處:https://www.cnblogs.com/dengyao-blogs/ 本文版權歸作者和博客園共有,歡迎轉載,但必須給出原文鏈接,並保留此段聲明,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 更多技術交流、求職機會,歡迎關註位元組跳動數據平臺微信公眾號,回覆【1】進入官方交流群 1.前言 埋點設計文檔面向開發的埋點需求說明書,目的是讓開發理解需要在什麼情況下做哪些埋點採集,以及具體需要的屬性參數類型、取值,確保採集的準確性和完善性。為實現整體指標體系,數據產品落地、使用,需要對開發進行埋點 ...
  • 摘要: HetuEngine作為MRS服務中互動式分析&多源統一SQL引擎,親自全程體驗其如何實現多數據源的跨源跨域分析能力。 本文分享自華為雲社區《MRS HetuEngine體驗跨源跨域分析【玩轉華為雲】》,作者:龍哥手記。 HetuEngine作為MRS服務中互動式分析&多源統一SQL引擎,親 ...
  • 用戶觸達:可以簡單理解為通過某種方式將消息傳遞給用戶的行為;觸達的特定消息從功能上可分展示、引導落地兩層。用戶觸達作為一種產品運營方式,已經融入我們日常生產活動的方方面面。在移動互聯網的世界里,我們的產品離不開觸達,用戶活動也離不開觸達。 ...
  • IOS開發工具官網地址 http://www.applicationloader.net/ 最新版本已經優化了沒支付688給apple的賬號登錄流程,無需再安裝其他軟體。 立即下載最新版本 在appuploader官網首頁下載,如果您是windows電腦,則選擇點擊 windows版,如果是mac ...
  • 最近,“你這背景太假了”席卷全網。由於身後風景太優美,被網友質疑背景太假,某主播為了自證,直接把手裡的桶扔進了背後的水裡。短短幾天時間播放量幾十億,引發了全網P圖狂潮,網友在短視頻App里將其人像摳出來,替換了不同的背景,各類創意視頻很快衝上熱搜。 現如今,視頻人像摳圖有著廣泛應用。在直播App里可 ...
  • 自適應佈局和響應式佈局的區別? 1.響應式的概念覆蓋了自適應,但響應式包含的東西更多,響應式的佈局可以根據屏幕的大小自動調整頁面的展示方式 2.自適應有一個致命缺點:如果屏幕尺寸太小,即使網頁能夠根據屏幕大小進行適配,也會感覺在小屏幕上查看,內容過於擁擠 3.響應式解決了自適應佈局的問題,響應式能自 ...
  • 一、this指向 點擊打開視頻講解更加詳細 this隨處可見,一般誰調用,this就指向誰。this在不同環境下,不同作用下,表現的也不同。 以下幾種情況,this都是指向window 1、全局作用下,this指向的是window console.log(window); console.log(t ...
  • SSO介紹 背景 隨著企業的發展,一個大型系統里可能包含 n 多子系統, 用戶在操作不同的系統時,需要多次登錄,很麻煩,我們需要一種全新的登錄方式來實現多系統應用群的登錄,這就是單點登錄。 web 系統 由單系統發展成多系統組成的應用群,複雜性應該由系統內部承擔,而不是用戶。無論 web 系統內部多 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...