Webpack 知識點整理

?

1. 對 webpack 的理解?解決了什么問題?

Webpack 是前端工程化領域的核心工具,其核心定位是模塊打包器(Module Bundler),通過將各類資源(JS、CSS、圖片等)視為模塊并進行智能整合,解決了傳統前端開發中的多維度問題

解決問題:
1. 模塊化開發與依賴管理

  • 傳統痛點:早期前端依賴全局變量和手動< script>標簽管理代碼,易命名沖突和依賴混亂
  • Webpack 方案: 支持 ES Module、CommonJS等模塊化語法,自動構建依賴圖,實現模塊的精準加載與隔離

2. 多類型資源整合

  • 傳統痛點:CSS 、圖片等 非 JS 資源需單獨處理,缺乏統一管理
  • Webpack 方案: 通過 Loader (如 css-loader、file-loader)將非 JS資源轉換為 JS可識別模塊,實現"一切皆模塊"

3.性能優化與工程化

  • 傳統痛點:全量打包導致首屏加載慢,代碼冗余
  • Webpack 方案
    • Code Splitting:按需分割代碼塊(如路由級拆分),減少首屏體積
    • Tree Shaking:靜態分析剔除未使用的代碼,減少打包體積
    • 緩存優化:文件名哈希策略(文件指紋),實現長效緩存

4.開發體驗提升

  • 傳統痛點:手動刷新、調試困難
  • Webpack方案:
  • HMR(熱模塊替換):局部更新模塊、保留應用狀態
  • DevServer:內置開發服務器,支持代理、Mock數據

2. webpack 構建流程?

Webpack 的構建流程可分為 三大階段,涵蓋 10+ 關鍵步驟

  1. 初始化階段

    • 讀取配置:合并命令行參數與 webpack.config.js,確定入口 (Entry)、輸出(Output)等
    • 創建 Compiler:全局單例對象,管理生命周期和插件調度
    • 注冊插件:調用各插件的 apply 方法,掛載到 Compiler 鉤子(如 beforeRun、compile)
  2. 編譯構建階段

    • 模塊解析:從Entry 出發,遞歸解析依賴,生成 Module 對象
    • Loader 轉換:調用匹配的 loader 處理文件內容
    • AST 分析: 使用 acorn 生成抽象語法樹,提取依賴關系
  3. 輸出階段

    • Chunk 生成:根據依賴圖將 Module合并為 Chunk (如按入口或者動態導入拆分)
    • 資源優化:執行插件(如 TerserPlugin)壓縮代碼,應用 Tree Shaking
    • 文件寫入:將 Chunk 轉換為最終文件,輸出至 dist 目錄

3. Webpack 中常見的 Loader ?解決了什么問題?

Loader 是 Webpack 的核心模塊處理器,用于將非 Javascript 文件(如 css、圖片、字體等)轉換為 Webpack 可識別的有效模塊,解決如下關鍵問題:

  1. 模塊化兼容:將各類資源統一視為模塊,支持 import/require 語法引入
  2. 資源轉換:編譯預處理語言(如 Sass、Typescript )、壓縮圖片、轉譯 ES6+ 語法等,擴展 Webpack 處理能力
  3. 性能優化:減少 HTTP 請求(如 Base64 內聯小文件)、代碼分割 與 Tree Shaking 支持
    Loader 本質是個函數。

4. Webpack 中常見的 Plugin ? 解決了什么問題?

Plugin 通過【基于tapable】擴展構建流程的生命周期鉤子,解決了以下核心問題:
- 自動化資源管理:如 HTML 生成、CSS提取、靜態文件復制等;
- 性能優化: 代碼壓縮、分包、緩存控制
- 開發體驗增強:環境變量注入、構建進度反饋
- 深度分析:可視化報告輔助優化決策

賦予 Webpack 各種靈活的功能,例如打包優化、資源管理、環境變量注入等,他們會運行在 Webpack 的不同階段(鉤子/ 生命周期),貫穿了 webpack 整個編譯周期,目的在于解決 loader 無法實現的其他事。
Plugin 本質是一個類。

5. Webpack 說說 Loader 和 Plugin 的區別? 編寫 Loader 、Plugin 思路?

Loader

  • 本質是文件轉換器,用于處理單個文件。Webpack原生只能解析 JavaScript ,而Loader 負責將其他類型文件(如 CSS、圖片、Typescript)轉換為 Webpack 可識別的模塊,例如 將ES6+ 轉換為 ES5、將 CSS注入到 HTML 的< style>標簽等;
  • 在模塊加載階段運行,配置在 module.rules 中,通過 test 匹配文件類型,use 指定處理順序(從右到左執行)。例如處理 CSS 時的順序為 css-loader => style.loader
    Plugin
  • 本質是功能擴展器,作用域整個構建流程。Plugin 通過監聽 Webpack 生命周期中的事件(如編譯完成、資源輸出),實現復雜任務,例如代碼壓縮、生成 HTML文件、分析打包體積等
  • 貫穿 Webpack 整個編譯周期,配置在 Plugin 數組中,需實例化并注冊到 Webpack 的鉤子(Hooks)上。例如 HtmlWebpackPlugin 在構建完成后生成 HTML。

編寫思路:

  • loader:導出一個函數,接收源文件內容,返回處理后的內容,可以時同步返回(直接返回)或異步(通過 this.async 回調)
  • Plugin: 導出一個類,需定義 apply 方法,通過 compiler 和 compilation 對象訪問 Webpack 內部數據,并綁定生命周期鉤子(如 emit、done)

6. Webpack 的熱更新是如何做到的? 原理是什么?

HMR ( Hot Module Replacement )

原理:

通過 webpack-dev-server 創建兩個服務器: 提供靜態資源的服務( Express )和 Socket 服務
Express server 負責直接提供靜態資源的服務 ( 打包后資源直接被瀏覽器請求和解析)
Socket server 是一個 websocket 的長連接,雙方可以互相通信
當 socket server監聽到對應的模塊發生變化時,會生成兩個文件 .json ( manifest 文件 ) 和 .js ( unpdate chunk )
通過長連接,socket server 可以直接將這兩個文件主動發送給客戶端 ( 瀏覽器)
瀏覽器拿到兩個新的文件后,通過 HMR runtime 機制,加載這兩個文件,并且針對修改的模塊進行更新

7. Webpack proxy 工作原理? 為什么能跨域?

proxy 工作原理: 實質利用 http-proxy-middleware 這個 http 代理中間件,實現請求轉發給其他服務器

跨域:( 服務器和服務器之間請求數據并不會存在跨域行為,跨域行為是瀏覽器安全策略限制 )

在開發階段, webpack-dev-server 會啟動一個本地開發服務器,所以我們的應用在開發階段是獨立運行在 localhost 的一個端口上,而后端服務器有事運行在另外一個地址上。所以在開發階段中,由于瀏覽器同源策略的原因,當本地訪問后端就會出現跨域請求。

解決跨域: 當本地發送請求的時候,代理服務器響應該請求,并將請求轉發到目標服務器上,目標服務器響應數據后再將數據返回給代理服務器,最終再由代理服務器將數據響應給本地。

8. 如何借助 Webpack 來優化前端性能

優化方向核心策略工具/配置
代碼體積Tree Shaking、代碼分割、壓縮TerserPlugin、SplitChunks
加載性能懶加載、CDN、預加載import()、externals、preload
構建效率緩存、多進程、Webpack 5 升級cache: filesystem、thread-loader
長期緩存Content Hash、文件系統緩存[contenthash]、Webpack 5 緩存配置

9.如何提高 Webpack 的構建速度?

主要可以從優化搜索時間、縮小文件搜索范圍、減少不必要的編譯等方面入手

優化 loader 配置 ( 通過配置 include、exclude、test屬性來匹配文 )
合理使用 resolve.extensions
優化 resolve.modules ( 第三方模塊的絕對路徑,以減少尋找 )
優化 resolve.alias ( alias給一些常用的路徑起一個別名,例如:@)
使用 DLLPlugin 插件
使用 cache-loader
terser 啟動多線程
合理使用 sourceMap

10. 與 Webpack 類似的工具還有哪些

Rollup ( Vue、React 和 Three.js )
Parcel ( 零配置、傻瓜式 )
Snowpack ( 閃電般快速,較為復雜、Webpack 和 Parcel 的替代方案)
Webpack 的優勢:

智能解析: 對 CommonJS、AMD、ES6 的語法做了兼容
萬物模塊: 對 js、css、圖片等資源文件都支持打包
開箱即用: 集成 HRM、Tree-Shaking 等功能
代碼分割: 可以將代碼切割成不同的 chunk,實現按需加載,降低了初始化時間
插件系統: 具有強大的 Plugin 接口,具有更好的靈活性和擴展性
易于調試:支持 ScoureUrls 和 ScoureMap
快速運行: Webpack 使用異步 IO 并具有多級緩存,這使得 Webpack 很快且在增量編譯上更加快
生態環境好:社區更豐富,出現問題更容易解決

11. webpack 常用字段

main:定義了 npm 包的入口文件
mudule: 定義了 npm 包的 ESM 規范的入口文件
browser: 定義了 npm 包在 browser 環境下的入口文件

12. Webpack 常用插件

  1. webpack、webpack-cli 、webpack-dev-server
  2. html-webpack-plugin ( 打包 html 文件 )
  3. clean-webpack-plugin ( 打包前刪除輸出目錄 )
  4. webpack-merge ( 合并 webpack 配置)
  5. optimize-css-assets-webpack-plugin ( css 壓縮 )
  6. style-loader ( 將 css 插入到 html )
  7. postcss-loader ( 處理 css 的兼容性 ) 和 autoprefixer 一起用
  8. file-loader ( 處理圖片文件 )
  9. url-loader ( 將圖片轉換成 base64 格式 )
  10. mini-css-extract-plugin ( 將 css 單獨打包成一個文件 )
  11. terser-webpack-plugin ( 壓縮 JS 代碼 )
  12. @babel/perset-env ( 處理 js 的瀏覽器兼容問題 )

?

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

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

相關文章

[Hello-CTF]RCE-Labs超詳細WP-Level13Level14(PHP下的0/1構造RCE命令簡單的字數限制RCE)

Level 13 源碼分析 這題又回到了 PHP重點關注preg_match("/[A-Za-z0-9\"%*,-.\/:;>?[\]^|]/", $cmd)禁用了所有數字, 并且回到了 PHP, 沒辦法用上一關的方法進行繞過但是比起上一關, 給我們少繞過了 &, ~, _似乎有其他方法 解題分析 利用 $(()) 和 …

Qt 控件概述 QWdiget 1.1

目錄 qrc機制 qrc使用 1.在項目中創建一個 qrc 文件 2.將圖片導入到qrc文件中 windowOpacity&#xff1a; cursor 光標 cursor類型 自定義Cursor font tooltip focusPolicy styleSheet qrc機制 之前提到使用相對路徑的方法來存放資源&#xff0c;還有一種更好的方式…

【eNSP實戰】將路由器配置為DHCP服務器

拓圖 要求&#xff1a; 為 office100 和 office200 分別配置地址池 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.100.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 192.168.200.1 255.255.255.0 AR1路由器上創建office100地址池 [AR1…

數據結構——順序表seqlist

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介紹了數據結構——順序表部分的內容 目錄 一、線性表的定義 二、線性表的基本操作 三.順序表 1.定義 2. 存儲結構 3. 特點 四 順序表操作 4.1初始化 4.2 插入 4.2.1頭插 4.2.2 尾插 4.2.3 按位置插 4.3 …

OSPF | LSDB 鏈路狀態數據庫 / SPF 算法 / 實驗

注&#xff1a;本文為 “OSPF | LSDB / SPF ” 相關文章合輯。 LSDB 和 SPF 算法 瀟湘浪子的蹋馬骨湯 發布 2019-02-15 23:58:46 1. 鏈路狀態數據庫 (LSDB) 鏈路狀態協議除了執行洪泛擴散鏈路狀態通告&#xff08;LSA&#xff09;以及發現鄰居等任務外&#xff0c;其第三個任…

前端---CSS(前端三劍客)

1.基本語法規范 選擇器 {?條/N條聲明} ? 選擇器決定針對誰修改 (找誰) ? 聲明決定修改啥. (?啥) ? 聲明的屬性是鍵值對. 使? ; 區分鍵值對, 使? : 區分鍵和值 比如&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta…

【C++】 —— 筆試刷題day_6

刷題day_6&#xff0c;繼續加油哇&#xff01; 今天這三道題全是高精度算法 一、大數加法 題目鏈接&#xff1a;大數加法 題目解析與解題思路 OK&#xff0c;這道題題目描述很簡單&#xff0c;就是給我們兩個字符串形式的數字&#xff0c;讓我們計算這兩個數字的和 看題目我…

todolist docker 小工具

參考鏈接 前排提示 沒有中文&#xff0c;可使用瀏覽器 翻譯 前提 安裝docker安裝docker-compose 下載倉庫 git clone https://github.com/JordanKnott/taskcafe進行安裝 cd taskcafe docker-compose -p taskcafe up -d服務啟動后會監聽在 3333 端口上&#xff0c;通過瀏覽器…

Unity--GPT-SoVITS接入、處理GPTAPI的SSE響應流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;兩者對模型文件具有兼容&#xff09; 點擊后 會進入新的游覽器網頁 ----- 看了一圈&#xff0c;發現主要問題集中在模型的訓練很需要CPU&#xff0c;也就是模型的制作上&#xff0c;問題很多&#xff0c;如果有現有…

《TypeScript 快速上手:類型、編譯與嚴格模式的簡明教程》

一、TypeScript介紹 在引入編程社區 20 多年后&#xff0c;JavaScript 現在已成為有史以來應用最廣泛的跨平臺語言之一。JavaScript 最初是一種用于向網頁添加微不足道的交互性的小型腳本語言&#xff0c;現已發展成為各種規模的前端和后端應 用程序的首選語言。雖然用 JavaSc…

ROS2 系統架構

1.操作系統層 ros2是基于Linux、Windows、macOS系統建立的&#xff0c;這一層為ros2提供了各種基礎的硬件驅動&#xff0c;比如網卡驅動&#xff0c;常用USB驅動和常用攝像頭驅動等。 2.DDS實現層 ros2的核心通信是采用第三方的通信組件來實現的&#xff0c;這個第三方就是數…

【HTML】二、列表、表格

文章目錄 1、列表1.1 無序列表1.2 有序列表1.3 定義列表 2、表格2.1 定義2.2 表格結構標簽2.3 合并單元格 1、列表 列表分為&#xff1a; 無序列表有序列表定義列表&#xff1a;一個標題下有多個小分類 1.1 無序列表 ul嵌套li&#xff0c;ul是無序列表&#xff0c;li是列表…

redis zset基本介紹以及底層實現

ZSet&#xff08;Sorted Set&#xff09;有序集合 介紹 Redis 中的有序集合(Sorted Set)是在集合(Set)的基礎上,為每個成員關聯了一個分數(score)。這個分數可以用來對集合中的成員進行排序。 有序集合保留了集合不能有重復成員的特性&#xff08;成員不能重復&#xff0c;分值…

政策助力,3C 數碼行業數字化起航

政策引領&#xff0c;數字經濟浪潮來襲 在當今時代&#xff0c;數字經濟已成為全球經濟發展的核心驅動力&#xff0c;引領著新一輪科技革命和產業變革的潮流。我國深刻洞察這一發展趨勢&#xff0c;大力推進數字化經濟發展戰略&#xff0c;為經濟的高質量發展注入了強大動力。 …

IntelliJ IDEA 快捷鍵系列:重命名快捷鍵詳解

目錄 引言一、默認重命名快捷鍵1. Windows 系統?2. Mac 系統? 二、操作步驟與技巧1. 精準選擇重命名范圍?2. 智能過濾無關內容? 三、總結 引言 在代碼重構中&#xff0c;?重命名變量、類、方法? 是最常用的操作之一。正確使用快捷鍵可以極大提升開發效率。本文針對 ?Ma…

文檔搜索引擎

首先獲取很多網頁(爬蟲->一個http客戶端,發送http請求獲取http響應結果(就是網站))(批量化的獲取很多的頁面) 再根據用戶輸入的查詢詞,在網頁中進行查找 用戶輸入查詢詞之后,如何讓查詢詞和當前這些網頁進行匹配 ->使用倒排索引 倒排索引 1.文檔: 每個待搜索的網頁(被爬…

開源工具利器:Mermaid助力知識圖譜可視化與分享

在現代 web 開發中&#xff0c;可視化工具對于展示流程、結構和數據關系至關重要。Mermaid 是一款強大的 JavaScript 工具&#xff0c;它使用基于 Markdown 的語法來呈現可定制的圖表、圖表和可視化。對于展示流程、結構和數據關系至關重要。通過簡單的文本描述&#xff0c;你可…

C# --- LINQ

C# --- LINQ 什么是LINQFluent Syntax 和 SQL-Like QueryLINQ Operations 什么是LINQ LINQ的全稱為Language Integrated Query, 為各種查詢(包括對象查詢&#xff0c;數據庫查詢&#xff0c;XML查詢) 提供了統一模型.LINQ源于SQL&#xff0c;但比SQL更加強大&#xff0c;更加靈…

【AI News | 20250316】每日AI進展

AI Repos 1、ReActMCP 將網絡搜索能力集成到AI助手中的一個MCP服務&#xff1a;ReActMCP Web Search&#xff0c;相當于給AI裝了個搜索引擎&#xff0c;可以實時查找最新的內容。它基于Exa API執行基本和高級網絡搜索&#xff0c;高級搜索比如限制搜索的網站范圍、指定日期范圍…

【VUE】day04-組件的生命周期、組件之間的數據共享、ref引用、購物車案例

【VUE】day04-組件的生命周期、組件之間的數據共享、ref引用、購物車案例 1. 組件之間的關系2. 使用組件的三個步驟3. vue.components全局注冊組件4. 自動生成右邊標簽插件5. 組件的props6. 結合v-bind使用自定義屬性7. props的默認default值8. type值類型9. 組件之間的樣式沖突…