前端面試寶典---webpack面試題

webpack 的 tree shaking 的原理

Webpack 的 Tree Shaking 過程主要包含以下步驟:

  1. 模塊依賴分析:Webpack 首先構建一個完整的模塊依賴圖,確定每個模塊之間的依賴關系。
  2. 導出值分析:通過分析模塊之間的 import 和 export,Webpack 識別出哪些導出值被其他模塊引用。
  3. 未使用代碼識別:通過對比模塊的導出值和引用情況,Webpack 可以確定哪些代碼是未被使用的"死代碼"。
  4. 代碼移除:最后,Webpack 會從構建包中移除這些未使用的代碼,從而減小最終文件的大小。

webpack 構建流程

  1. 初始化各種參數,讀取配置文件,進行解析。各種merge…,形成標準化的配置
  2. 開始編譯:complier 對象初始化,注冊所有的配置插件,執行run方法開始編譯
  3. 從 entry 開始,讀取所有的依賴樹,形成 AST。不斷地遞歸下去進行處理。
  4. 文件編譯:根據文件正則匹配對應的 loader,進行文件轉換
  5. 形成一個整體的資源樹,完成模塊的編譯
  6. 輸出資源:根據入口和模塊的關系,組成一個個的chunk,再把每個 chunk 轉換成單獨的文件,準備輸出。
  7. 輸出完成,根據 output 配置的內容,把文件最后,寫入到磁盤。
  8. webpack的hooks:中間不同時段會有不同的plugin執行

loader 和 plugin 的區別?

loader: 轉換器,核心是解析.
webpack 沒有 loader 的話,只能打包基礎的 cjs的 js 文件,對于 css,靜態資源 是無法實現打包的,這時候就需要引入 一些 loader 來進行文件的處理,更多的是,文件的轉換器

plugin: 插件,主要是擴展webpack 的功能,在 webpack 的運行周期里,會有一些 hooks 對外暴露,所以在webpack 打包編譯的過程中, plugin 會根據這些 hooks 執行一些自定義的操作,來實現對輸出結果的干預的增強。

區別:
loader 更專注于 文件的轉換,是轉換器,讓 webpack 處理非JS 模塊plugin 更專注于 流程的擴展,是擴展器。讓輸出資源的能力更豐富。

webpack中hash、chunkhash和contenthash的區別

  1. hash:一整個項目,一次打包,只有一個hash值
  2. chunkhash:一個入口打包出來的文件所得到的是同一個chunkhash
    • 從入口entry出發,到它的依賴,以及依賴的依賴,依賴的依賴的依賴,等等,一直下去,所打包構成的代碼塊(模塊的集合)叫做一個chunk,也就是說,入口文件和它的依賴的模塊構成的一個代碼塊,被稱為一個chunk。
    • 所以,一個入口對應一個chunk,多個入口,就會產生多個chunk
    • 所以,單入口文件,打包后chunkhash和hash值是不同的,但是效果是一樣的
  3. contenthash:該哈希只會和文件內容有關,是控制力度最細的

如何提高 webpack 的打包速度

  • 使用多進程打包: 使用 thread-loader,happypack 等工具,將構建的流程分解為多個進程或線程去處理。esbuild,swc 相關。
  • 使用 dllPlugin 將第三方庫預先進行打包,減少構建;
  • 使用 HardSourceWebpackPlugin, 緩存一些中間文件,加速后續的構建流程
  • 使用 tree shaking
  • 移除不需要的loader和不必要的插件
  • cache-loader:開啟Cache-loader 實現打包緩存,對于之前讀過文件進行緩存,而不需要再去讀系統文件

如何減小 webpack 打包后的體積/性能優化

  1. code spliting:非首屏加載的數據,先排除掉。
  2. tree shaking:沒用的,先干掉
  3. 壓縮代碼:css 壓縮、JS 壓縮
  4. 圖片壓縮:gzip
  5. 按需引入:例如組件庫
  6. CDN加速:react,vue,比較大的第三方

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

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

相關文章

VUE3_ref和useTemplateRef獲取組件實例,ref獲取dom對象

舊寫法 ref的字符串需要跟js中ref定義的變量名稱一樣 類型丟失&#xff0c;無法獲取到ref定義的title類型 <template><div><h1 ref"title">Hello Vue3.5</h1></div> </template><script setup>import { ref, onMounted } …

知識圖譜(KG)與大語言模型(LLM)

知識圖譜&#xff08;KG&#xff09;以其結構化的知識表示和推理能力&#xff0c;為大語言模型&#xff08;LLM&#xff09;的“幻覺”、知識更新滯后和可解釋性不足等問題提供了有力的解決方案。反過來&#xff0c;LLM的強大文本理解和生成能力也為KG的構建、補全、查詢和應用…

MySQL數據庫設計

1. 如何設計數據庫 設計數據庫步驟 2. E-R圖的使用 我們在日常設計的數據庫多為“一對多”和“多對一” 3. 設計數據庫三大范式? 第一范式&#xff08;1st NF&#xff09;&#xff1a;確保每列的原子性 第二范式&#xff08;2st NF&#xff09;&#xff1a;每個表只描述一件事…

C#中Action的用法

Action 是 C# 中委托的一種&#xff0c;用于封裝無返回值的方法。它引用的方法不能有返回值&#xff0c;但可以有零個或多個參數。相比delegate委托&#xff0c;Action 委托的優點是不必顯式定義封裝無參數過程的委托&#xff0c;使代碼更加簡潔和易讀。 1、delegate-委托 先…

計算機視覺與深度學習 | matlab實現EMD-CNN-LSTM時間序列預測(完整源碼、數據、公式)

EMD-CNN-LSTM 一、完整代碼實現二、核心公式說明1. **經驗模態分解(EMD)**2. **1D卷積運算**3. **LSTM門控機制**4. **損失函數**三、代碼結構解析四、關鍵參數說明五、性能優化建議六、典型輸出示例以下是用MATLAB實現EMD-CNN-LSTM時間序列預測的完整方案,包含數據生成、經…

mybatis-plus實操

如何生成完全看項目&#xff0c;有的人是用管理系統生成&#xff0c;還有其他人可能是.....。博主這里是用插件生成 我是插件的話&#xff0c;先在ide連接上數據源&#xff0c;然后對表右鍵&#xff0c;直接來到下面這個步驟&#xff0c; 第一次是新增6個文件&#xff0c;我們…

Mergekit——任務向量合并算法Ties解析

Mergekit——高頻合并算法 TIES解析 Ties背景Ties 核心思想具體流程總結 mergekit項目地址 Mergekit提供模型合并方法可以概況為三大類&#xff1a;基本線性加權、基于球面插值、基于任務向量&#xff0c;今天我們來刷下基于任務向量的ties合并方法&#xff0c;熟悉原理和代碼。…

YOLOv8 在單片機上部署的缺點和應對方案

YOLOv8 在單片機上部署的主要挑戰與缺陷 將 YOLOv8 部署到單片機上確實面臨諸多技術挑戰&#xff0c;主要源于單片機有限的計算資源與 YOLOv8 模型的高復雜度之間的矛盾。以下是具體的缺陷和限制&#xff1a; 1. 計算資源嚴重不足 算力限制&#xff1a;典型單片機&#xff0…

搭建一個永久免費的博客

搭建永久免費的博客&#xff08;1&#xff09;基本介紹 HugoStackGitHub GitHub GitHub GitHub Build and ship software on a single, collaborative platform GitHub 下載安裝git Git - Downloads Edge插件authenticator 2fa client Settings->Password and auth…

基于SpringBoot的小型民營加油站管理系統

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

推薦一個Winform開源的UI工具包

從零學習構建一個完整的系統 推薦一個開源、免費的適合.NET WinForms 控件的套件。 項目簡介 Krypton是一套開源的.Net組件&#xff0c;用于快速構建具有豐富UI交互的WinForms應用程序。 豐富的UI控件&#xff0c;提供了48個基礎控件&#xff0c;如按鈕、文本框、標簽、下拉…

社交平臺推出IP關聯機制:增強用戶體驗與網絡安全的新舉措

社交平臺為我們提供與親朋好友保持聯系、分享生活點滴的便捷渠道&#xff0c;還成為了信息傳播、觀點交流的重要平臺。然而&#xff0c;隨著社交平臺的普及&#xff0c;網絡空間中的虛假信息、惡意行為等問題也日益凸顯。為了應對這些挑戰&#xff0c;許多社交平臺相繼推出IP關…

系統架構設計(八):三層架構

什么是三層架構&#xff08;Three-Tier Architecture&#xff09; 三層架構是將系統分為三大邏輯層&#xff1a;表示層&#xff08;Presentation&#xff09;、業務邏輯層&#xff08;Business Logic&#xff09;、數據訪問層&#xff08;Data Access&#xff09;&#xff0c;…

C語法備注01

&#xff08;1&#xff09;char 字符類 char 既可以是 整數 類型&#xff0c;也可以是 字符 類型。z字符 類型可以轉化為對應的ASC2值。 int main(){char c;char e;c 1;char d 1;e A;printf("c %d\n", c);printf("d %d\n", d);printf("e %d\n…

CVE-2015-2183 Zeuscart SQL注入漏洞

CVE-2015-2183 Zeuscart SQL注入漏洞 主頁 訪問/admin/進行登錄 訪問&#xff1a;http://192.168.1.3/admin/?doeditcurrency&cid1 單引號測試&#xff0c;發現頁面發生變化&#xff0c;進一步測試 order by 5 &#xff0c;頁面正常&#xff0c;order by 6時頁面發生變…

Go 語言即時通訊系統開發日志-日志day2-5:架構設計與日志封裝

Go語言即時通訊系統開發日志day2 計劃&#xff1a;學習go中MySQL&#xff0c;Redis的使用&#xff0c;使用MySQL和Redis完成一個單聊demo。 總結&#xff1a;現在每天下午用來開發這個項目&#xff0c;如果有課的話可能學習時間只有3-4個小時&#xff0c;再加上今天的學習效率不…

對盒模型的理解

對CSS盒模型的深入理解 CSS盒模型是網頁布局的基礎概念&#xff0c;它描述了HTML元素在頁面中所占的空間以及如何計算這些空間。以下是關于盒模型的全面解析&#xff1a; 1. 盒模型的基本組成 每個HTML元素都被視為一個矩形的盒子&#xff0c;這個盒子由內到外由四部分組成&…

RV1126多線程獲取SMARTP的GOP模式數據和普通GOP模式數據

通過代碼的方式同時獲取SMARTP模式的VENC碼流數據和普通GOP模式的VENC碼流數據&#xff0c;并進行對比畫質。 一.RV1126 VI采集攝像頭數據并同時編碼SMARTP模式和普通GOP模式的編碼碼流流程 RV1126利用多線程同時獲取普通GOP的VENC碼流數據和SMARTP的碼流數據一般如上圖&#…

在Ubuntu使用 Ansible 配置 Azure 資源的動態清單

使用 Ansible 配置 Azure 資源的動態清單 簡介1.安裝pipx2.通過 pipx 安裝 Ansible3.安裝azure.azcollection4.安裝集合所需的依賴項5.生成動態庫存 簡介 在主機變化不定的云環境中&#xff0c;Ansible 的動態清單功能可以消除維護靜態清單文件的負擔 本教程將帶你使用 Azure…

車載診斷架構 ---車載總線對于功能尋址的處理策略

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…