Webpack性能優化:構建速度與體積優化策略

一、構建速度優化

1、??升級Webpack和Node.js??

  • ??優化效果??:Webpack 4比Webpack 3構建時間降低60%-98%。
  • ??原因??:
    • V8引擎優化(for of替代forEachMap/Set替代Object)。
    • 默認使用更快的md4哈希算法。
    • AST直接從Loader傳遞,減少解析時間。
# 示例:Webpack 3 vs Webpack 4構建時間對比
Webpack 3: Time: 54263ms
Webpack 4: Time: 26563ms

2、??多進程/多實例構建??

  • ??方案選擇??:
    • thread-loader(官方推薦,Webpack 4+)。
    • HappyPack(Webpack 3,已逐漸被替代)。
  • ??原理??:將模塊解析分配給Worker線程并行處理。
// thread-loader 配置示例
module.exports = {module: {rules: [{test: /\.js$/,use: ['thread-loader', 'babel-loader']}]}
};

??3、并行壓縮代碼??

  • ??推薦插件??:
    • terser-webpack-plugin(Webpack 4默認,支持ES6)。
    • uglifyjs-webpack-plugin(開啟parallel參數)。
// terser-webpack-plugin 并行壓縮
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {optimization: {minimizer: [new TerserPlugin({ parallel: 4 })]}
};

?4、??縮小構建目標??

  • ??關鍵配置??:
    • 限制babel-loader作用范圍(排除node_modules)。
    • 優化resolve配置,減少文件搜索范圍。
module.exports = {module: {rules: [{ test: /\.js$/, exclude: /node_modules/, use: 'babel-loader' }]},resolve: {modules: [path.resolve(__dirname, 'node_modules')], // 限定模塊搜索路徑extensions: ['.js'], // 減少后綴嘗試alias: { react: path.resolve(__dirname, './node_modules/react/dist/react.min.js') } // 別名縮短路徑}
};

?

??5、緩存優化??

  • ??策略??:
    • babel-loader開啟cacheDirectory
    • terser-webpack-plugin啟用緩存。
    • 使用hard-source-webpack-plugin為模塊提供中間緩存。
// babel-loader 緩存示例
use: [{loader: 'babel-loader',options: { cacheDirectory: true }
}]

?二、構建體積優化

1、??代碼分包(減少主包體積)??

  • ??方案1:設置Externals??
    通過CDN引入基礎庫(如React),不打包進Bundle。
const HtmlWebpackExternalsPlugin = require('html-webpack-externals-plugin');
plugins: [new HtmlWebpackExternalsPlugin({externals: [{ module: 'react', entry: '//cdn.url/react.min.js', global: 'React' }]})
];
  • ???方案2:SplitChunksPlugin分包??

分離公共模塊與業務代碼。

optimization: {splitChunks: {chunks: 'all',cacheGroups: {vendors: { test: /[\\/]node_modules[\\/]/, name: 'vendors' }}}
}

?

2、Tree Shaking??

  • ??條件??:必須是ES6模塊語法(import/export)。
  • ??生效方式??:
    • Webpack生產模式默認開啟。
    • 確保.babelrc中設置"modules": false

3、圖片與字體優化??

  • ??壓縮圖片??:image-webpack-loader集成imagemin
rules: [{test: /\.(png|jpg)$/,use: [{ loader: 'file-loader', options: { name: 'img/[name][hash:8].[ext]' } },{ loader: 'image-webpack-loader', options: { mozjpeg: { quality: 65 } } }]
}]
  • ???小資源內聯??:url-loader將小文件轉為Base64。
use: [{ loader: 'url-loader', options: { limit: 10240 } }] // 小于10KB的文件內聯

4、??刪除無用代碼??

  • ??CSS清理??:purgecss-webpack-plugin移除未使用的CSS。
const PurgecssPlugin = require('purgecss-webpack-plugin');
plugins: [new PurgecssPlugin({ paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }) })
];
  • ??動態Polyfill服務??:按需加載Polyfill(如polyfill.io)。
<script src="https://polyfill.io/v3/polyfill.min.js?features=Promise,Map"></script>

?三、高級分析與監控

??1、構建速度分析??

  • ??工具??:speed-measure-webpack-plugin
  • ??效果??:輸出每個Loader和插件的耗時。
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
const smp = new SpeedMeasurePlugin();
module.exports = smp.wrap({ /* webpack配置 */ });

?2、體積分析??

  • ??工具??:webpack-bundle-analyzer
  • ??效果??:可視化分析各模塊大小。
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
plugins: [new BundleAnalyzerPlugin()];

3、??日志優化??

  • ??工具??:friendly-errors-webpack-plugin
  • ??效果??:精簡控制臺輸出,突出錯誤和警告。
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin');
plugins: [new FriendlyErrorsPlugin()];
stats: 'errors-only' // 僅顯示錯誤
四、總結
??優化方向????關鍵技術????效果??
構建速度多進程/緩存/縮小目標減少60%+構建時間
體積優化代碼分包/Tree Shaking/圖片壓縮減少30%-50% Bundle大小
開發體驗熱更新/日志優化快速定位問題,減少刷新
長期維護ESLint規范/CI集成提升代碼質量和團隊協作效率

核心原則??:

  1. ??優先使用高版本Webpack??(內置優化更多)。
  2. ??并行與緩存是速度優化的關鍵??。
  3. ??按需加載與死代碼刪除是體積優化的核心??。
  4. ??通過可視化分析工具量化優化效果??。

?

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

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

相關文章

ajax學習手冊

Ajax 通俗易懂學習手冊 目錄 Ajax 基礎概念XMLHttpRequest 詳解Fetch API (現代方式)處理不同數據格式錯誤處理和狀態碼Ajax 高級技巧實戰項目案例最佳實踐 Ajax 基礎概念 什么是 Ajax&#xff1f; Ajax Asynchronous JavaScript And XML 通俗解釋&#xff1a; Ajax 就像…

人工智能學習02-安裝環境

人工智能學習概述—快手視頻 人工智能學習02-安裝—快手視頻 Python安裝 Python安裝分為兩種方法&#xff0c;一是從官網(https://www.python.org/)下載Python工具(比如python-2.7.msi)進行安裝&#xff0c;并設置Path環境變量&#xff1b;二是下載工具Anaconda集成環境進行安…

電腦開不了機,主板顯示67碼解決過程

文章目錄 現象分析內存條問題BIOS設置問題其它問題 解決清理內存條金手指所需工具操作步驟注意事項 電腦在運行過程中&#xff0c;顯示內存不足&#xff0c;重啟電腦卻無法啟動。 現象 System Initialization 主板風扇是轉的&#xff0c;也有燈光顯示&#xff0c;插上屏幕&am…

在ubuntu等linux系統上申請https證書

使用 Certbot 自動申請 安裝 Certbot Certbot 是 Let’s Encrypt 官方推薦的自動化工具&#xff0c;支持多種操作系統和服務器環境。 在 Ubuntu/Debian 上&#xff1a; sudo apt update sudo apt install certbot申請證書 純手動方式&#xff08;不自動配置&#xff09;&…

springboot的test模塊使用Autowired注入失敗

springboot的test模塊使用Autowired注入失敗的原因&#xff1a; 注入失敗的原因可能是用了junit4的包的Test注解 import org.junit.Test;解決方法&#xff1a;再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解&#xff0c;就不用加上RunWith&…

Cursor Rules 使用

前言 最近在使用 Cursor 進行編程輔助時&#xff0c;發現 AI 生成的代碼風格和當前的代碼風格大相徑庭。而且有時它會輸出很奇怪的代碼&#xff0c;總是不符合預期。 遂引出本篇&#xff0c;介紹一下 Rules &#xff0c;它就可以做一些規范約束之類的事情。 什么是 Cursor R…

項目任務,修改svip用戶的存儲空間。

修改存儲空間 3GB->5GB&#xff0c;這是項目任務&#xff0c;首先有人任務就要去思考實現思路&#xff0c;首先存儲空間&#xff0c;也就是說不只是前端樣式3GB改一下就可以了&#xff0c;那用戶實際還是3GB&#xff0c;所以我們去網站看后端誰返回給我們了3GB&#xff0c;我…

【無標題】路徑問題的革命性重構:基于二維拓撲收縮色動力學模型的零點隧穿理論

路徑問題的革命性重構&#xff1a;基于二維拓撲收縮色動力學模型的零點隧穿理論 一、傳統路徑模型的根本缺陷 在經典正方形路徑問題中&#xff08;圖1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[無直接路徑] B -…

iview中的table組件點擊一行中的任意一點選中本行

<Table border ref"selection" size"small" on-row-click"onClickRow"></Table>// table組件點擊一行任意位置選中onClickRow(row, index) {this.$refs.selection.toggleSelect(index)}寫上toggleSelect(index)方法即可&#xff0c;…

前端工具庫lodash與lodash-es區別詳解

lodash 和 lodash-es 是同一工具庫的兩個不同版本&#xff0c;核心功能完全一致&#xff0c;主要區別在于模塊化格式和優化方式&#xff0c;適合不同的開發環境。以下是詳細對比&#xff1a; 1. 模塊化格式 lodash 使用 CommonJS 模塊格式&#xff08;require/module.exports&a…

算法-構造題

#include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; const ll N 5e5 10; int main() {ll n, k;cin >> n >> k; ll a[N] {0}; // 初始化一個大小為N的數組a&#xff0c;用于存儲排列// 構造滿足條件的排列for (l…

LeetCode--25.k個一組翻轉鏈表

解題思路&#xff1a; 1.獲取信息&#xff1a; &#xff08;1&#xff09;給定一個鏈表&#xff0c;每k個結點一組進行翻轉 &#xff08;2&#xff09;余下不足k個結點&#xff0c;則不進行交換 2.分析題目&#xff1a; 其實就是24題的變題&#xff0c;24題是兩兩一組進行交換&…

OC—UI學習-2

導航控制器和導航工具欄 導航控制器 UINAvigationController與UIViewController的關系 UIViewController是什么&#xff1f; 它是一個普通的視圖控制器&#xff0c;負責管理一個頁面 UINavigationController是什么&#xff1f; 它是一個容器控制器&#xff0c;專門用來管理一…

Microsoft前后端不分離編程新風向:cshtml

文章目錄 什么是CSHTML&#xff1f;基礎語法內聯表達式代碼塊控制結構 布局頁面_ViewStart.cshtml_Layout.cshtml使用布局 模型綁定強類型視圖模型集合 HTML輔助方法基本表單驗證 局部視圖創建局部視圖使用局部視圖 高級特性視圖組件依賴注入Tag Helpers 性能優化緩存捆綁和壓縮…

【SpringBoot+SpringCloud】Linux配置nacos踩坑大全

*建議在開發時使用Linux環境下搭建nacos 1.在nacos官網找到搭配SpringBoot和SpringCloud的版本 2.Nacos 依賴 Java 環境來運行&#xff0c;需要在linux系統中安裝JDK 1.8 3.按照Nacos官網步驟安裝&#xff0c;防火墻配置開放8848和9848端口 客戶端擁有相同的計算邏輯&…

如何在 Java 中優雅地使用 Redisson 實現分布式鎖

分布式系統中&#xff0c;節點并發訪問共享資源可能導致數據一致性問題。分布式鎖是常見的解決方案&#xff0c;可確保操作原子性。Redisson是基于Redis的Java分布式對象庫&#xff0c;提供多種分布式同步工具&#xff0c;包括分布式鎖。Redisson與Redis&#xff08;實時數據平…

pikachu靶場通關筆記20 SQL注入03-搜索型注入(GET)

目錄 一、SQL注入 二、搜索型注入 三、源碼分析 1、滲透思路1 2、滲透思路2 四、滲透實戰 1、滲透準備 2、SQL注入探測 &#xff08;1&#xff09;輸入百分號單引號 &#xff08;2&#xff09;萬能注入語句 3、獲取回顯列orderby 4、獲取數據庫名database 5、獲取…

mac:大模型系列測試

0 MAC 前幾天經過學生優惠以及國補17K入手了mac studio,然后這兩天親自測試其模型行運用能力如何&#xff0c;是否支持微調、推理速度等能力。下面進入正文。 1 mac 與 unsloth 按照下面的進行安裝以及測試&#xff0c;是可以跑通文章里面的代碼。訓練速度也是很快的。 注意…

A Survey on the Memory Mechanism of Large Language Model based Agents

目錄 摘要Abstract1. LLM-Based Agent的Memory1.1 基礎概念1.2 用于解釋Memory的例子1.3 智能體記憶的定義1.3.1 狹義定義(肯定不用這個定義)1.3.2 廣義定義 1.4 記憶協助下智能體與環境的交互過程1.4.1 記憶寫入1.4.2 記憶管理1.4.3 記憶讀取1.4.4 總過程 2. 如何實現智能體記…

搭建 Serverless 架構

? 一、理解 Serverless 架構核心概念 核心理念&#xff1a; 無需管理服務器&#xff1a;只需編寫業務邏輯&#xff0c;部署后由云平臺托管運行環境。 事件驅動&#xff08;Event-driven&#xff09; 按需計費&#xff08;按調用次數/資源消耗&#xff09; 高可擴展性與自動…