Webpack Bundle Analyzer:深入分析與優化你的包

Webpack Bundle Analyzer是一個用于可視化的工具,它可以幫助你分析Webpack打包后的輸出文件,查看哪些模塊占用了最多的空間,從而進行優化。

2500G計算機入門到高級架構師開發資料超級大禮包免費送!

首先,你需要安裝Webpack Bundle Analyzer和Webpack本身:

npm install webpack webpack-cli --save-dev
npm install webpack-bundle-analyzer --save-dev

接下來,配置Webpack配置文件(webpack.config.js):

const path = require('path');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},plugins: [new BundleAnalyzerPlugin({analyzerMode: 'static',reportFilename: 'report.html',openAnalyzer: false, // 不自動打開瀏覽器}),],// 其他配置...
};

運行Webpack并生成分析報告:

npx webpack --mode production

這將在dist目錄下生成一個report.html文件,打開這個文件,你將看到一個交互式的圖表,顯示了你的包的大小分布。

為了進一步優化,你可以采取以下策略:

代碼分割(Code Splitting):

使用splitChunks配置項將大型庫或組件拆分為單獨的chunk,只在需要時加載。

module.exports = {// ...optimization: {splitChunks: {chunks: 'all',},},// ...
};
Tree Shaking:

啟用sideEffects屬性和ES模塊,讓Webpack刪除未使用的代碼。

// package.json
{"sideEffects": false
}
javascript
// 在Webpack配置中啟用ES模塊
module.exports = {// ...module: {rules: [{test: /\.m?js$/,resolve: {fullySpecified: false,},},],},// ...
};

使用壓縮插件:

使用TerserWebpackPlugin或其他壓縮工具減小文件大小。

const TerserWebpackPlugin = require('terser-webpack-plugin');module.exports = {// ...optimization: {minimize: true,minimizer: [new TerserWebpackPlugin(),],},// ...
};

加載器優化:

根據需要選擇合適的加載器,例如使用url-loaderfile-loader處理靜態資源,設置合適的閾值以避免不必要的轉換。

module.exports = {// ...module: {rules: [{test: /\.(png|jpg|gif)$/i,use: [{loader: 'url-loader',options: {limit: 8192, // 8KBfallback: 'file-loader',},},],},],},// ...
};

模塊懶加載(Lazy Loading)

對于大型應用,可以使用動態導入(import())實現模塊懶加載,只有在用戶需要時才加載相關模塊。

// Before
import SomeBigComponent from './SomeBigComponent';// After
const SomeBigComponent = () => import('./SomeBigComponent');

代碼預熱(Code Preheating)

對于頻繁使用的懶加載模塊,可以考慮預熱,提前加載,減少首次使用時的延遲。

// 在應用啟動時預加載組件
import('./SomeBigComponent').then(() => {console.log('SomeBigComponent preloaded');
});

提取公共庫(Common Chunks)

通過optimization.splitChunks配置,可以將多個模塊共享的庫提取到單獨的chunk中。

module.exports = {// ...optimization: {splitChunks: {cacheGroups: {vendors: {test: /[\\/]node_modules[\\/]/,priority: -10,chunks: 'initial',},common: {name: 'common',test: /[\\/]src[\\/]/,chunks: 'all',minChunks: 2,priority: -20,reuseExistingChunk: true,},},},},// ...
};

使用CDN引入庫

對于第三方庫,如果它們在所有頁面中都使用,考慮從CDN引入,減少服務器負載和首次加載時間。

// 在HTML模板中
<script src="https://cdn.example.com/jquery.min.js"></script>

圖片優化

使用image-webpack-loadersharp庫對圖片進行壓縮和優化。

module.exports = {// ...module: {rules: [{test: /\.(png|jpe?g|gif|svg)$/i,use: [{loader: 'image-webpack-loader',options: {bypassOnDebug: true, // webpack@4 compatibilitymozjpeg: {progressive: true,quality: 65,},optipng: {enabled: false,},pngquant: {quality: [0.65, 0.9],speed: 4,},gifsicle: {interlaced: false,},// the webp option will enable WEBPwebp: {quality: 75,},},},],},],},// ...
};

利用緩存

使用cache配置來緩存Webpack編譯結果,加快后續構建速度。

module.exports = {// ...cache: {type: 'filesystem',},// ...
};

避免重復的模塊

使用Module Federationexternals配置,避免在多個應用之間重復引入相同的庫。

Module Federation (Webpack 5+)

// 主應用 (Host App)
module.exports = {// ...experiments: {outputModule: true,},externals: {react: 'React','react-dom': 'ReactDOM',},// ...plugins: [new ModuleFederationPlugin({name: 'host_app',remotes: {remote_app: 'remote_app@http://localhost:3001/remoteEntry.js',},shared: ['react', 'react-dom'],}),],// ...
};// 遠程應用 (Remote App)
module.exports = {// ...experiments: {outputModule: true,},plugins: [new ModuleFederationPlugin({name: 'remote_app',filename: 'remoteEntry.js',exposes: {'./RemoteComponent': './src/RemoteComponent',},}),],// ...
};

externals配置

module.exports = {// ...externals: {react: 'React','react-dom': 'ReactDOM',},// ...
};

這將告訴Webpack這些庫已經在全局作用域中可用,避免重復打包。

使用Source Maps

在開發階段啟用Source Maps,便于調試。

module.exports = {// ...devtool: 'cheap-module-source-map',// ...
};

優化字體和圖標

對于圖標和字體,可以使用url-loaderfile-loader配合limit參數來決定是否內聯到CSS或單獨打包。

module.exports = {// ...module: {rules: [{test: /\.(woff|woff2|eot|ttf|otf|svg)$/,use: [{loader: 'url-loader',options: {limit: 10000,name: '[name].[ext]',outputPath: 'fonts/',},},],},],},// ...
};

避免全局樣式污染

使用CSS Modules或Scoped CSS,限制CSS作用域,防止樣式沖突。

// CSS Modules
import styles from './styles.module.css';// Scoped CSS
<style scoped>.myClass { /* ... */ }
</style>

優化HTML輸出

使用HtmlWebpackPlugin生成優化過的HTML模板,自動引入Webpack生成的腳本和樣式。

const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {// ...plugins: [new HtmlWebpackPlugin({template: './public/index.html',inject: 'body', // 將腳本注入到body底部}),],// ...
};

使用Webpack Dev Server

在開發環境中使用Webpack Dev Server,實現熱更新和快速迭代。

module.exports = {// ...devServer: {contentBase: './dist',hot: true,},// ...
};

2500G計算機入門到高級架構師開發資料超級大禮包免費送!

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

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

相關文章

IIC通信(STM32)

一、IIC概念 &#xff11;、兩根通信線&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09; 同步&#xff0c;半雙工 2、帶數據應答 3、支持總線掛載多設備&#xff08;一主多從、多主多從&#xff09;一般使用一主多從。一主多從的…

【深度學習】paddlets,時序數據預測

文章目錄 一、環境二、題目1三、題目2四、題目3五、函數參數 資料&#xff1a; https://paddlets.readthedocs.io/zh-cn/latest/source/api/paddlets.models.base.html#paddlets.models.base.BaseModel.recursive_predict https://aistudio.baidu.com/projectdetail/5866171?…

陪跑真正值錢的不是教程,是你遇到那個擋住你的問題時,身邊有個靠譜的人

今天分享兩個概念&#xff0c;一個是意識決定一切&#xff0c;一個是大道至簡&#xff0c;做項目就是按部就班的遵循事情發展規律去做。 先說第一個概念&#xff0c;意識決定一切。我們說的凡事預則立不預則廢&#xff0c;就是計劃了去做就會有結果。 給你們一個表&#xff0c;…

Linux簡單通過Minicom命令操作串口設備(linux串口操作命令)

Minicom是一個在Linux系統中廣泛使用的串行通信程序。它類似于Windows下的超級終端,允許用戶通過串口與外部硬件設備進行通信。Minicom不僅功能強大,而且完全免費,帶有源代碼,可以在大多數Unix系統下運行。 安裝Minicom 在大多數Linux發行版中,Minicom可能沒有預裝。可以…

【前端】面試八股文——BFC

面試八股文——BFC 在前端開發的面試中&#xff0c;BFC&#xff08;Block Formatting Context&#xff0c;塊級格式化上下文&#xff09;常常是一個高頻出現的考點。它不僅考察應聘者對CSS布局的理解深度&#xff0c;也是面試官判斷候選人解決實際問題能力的重要依據之一。因此…

python接口自動化測試中為什么用yaml文件進行用例管理而不是json文件

在Python接口自動化測試中&#xff0c;使用YAML文件進行用例管理而不是JSON文件&#xff0c;主要基于以下幾個原因&#xff1a; 可讀性&#xff1a;YAML文件使用縮進和冒號來表示層級結構&#xff0c;使得文件內容更加清晰易讀。相比之下&#xff0c;JSON文件則使用大括號和中…

MySQL——索引與事務

目錄 前言 一、索引 1.索引概述 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;索引作用 &#xff08;3&#xff09;索引特點 &#xff08;4&#xff09;適用場景 2.索引的操作 &#xff08;1&#xff09;查看索引 &#xff08;2&#xff09;創建索引…

LeetCode399觸發求值

題目描述 給你一個變量對數組 equations 和一個實數值數組 values 作為已知條件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每個 Ai 或 Bi 是一個表示單個變量的字符串。另有一些以數組 queries 表示的問題&#xff0c;其中 que…

文科論文,使用AI寫作時能夠提供實證數據嗎?

人工智能時代&#xff0c;為了撰寫論文提供思路及高效&#xff0c;利用AI撰寫論文已是常態&#xff0c;可撰寫文科論文通常研究中都需要實證數據&#xff0c;而AI撰寫論文時能夠提供這樣的數據嗎&#xff1f; 一、什么是實證數據 實證數據是指從研究報告、財務報表、新聞報道…

計算機網絡——TCP 協議的三次握手 / 四次揮手

簡述 TCP / UDP 協議都是傳輸層的協議。 UDP 是面向無連接的協議&#xff0c;就是說發送端不在乎消息數據是否傳輸到接收端了&#xff0c;所以會出現數據丟失的情況&#xff0c;所以可靠性也不高。 TCP 是面向連接的、可靠的、基于字節流的傳輸層協議。所謂面向連接的&#…

Flink-cdc更好的流式數據集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一種數據變更捕獲技術&#xff0c;用于從數據源&#xff08;如數據庫&#xff09;中捕獲和處理數據的變更事件。CDC技術允許實時地捕獲數據庫中的增、刪、改操作&#xff0c;將這些變更事件轉化為流式數據&#xff0c;并能夠…

Windows平臺C#版RTSP轉RTMP直播推送定制版

技術背景 前幾年我們發布了C版的多路RTMP/RTSP轉RTMP轉發官方定制版。在秉承低延遲、靈活穩定、低資源占用的前提下&#xff0c;客戶無需關注開發細節&#xff0c;只需圖形化配置轉發等各類參數&#xff0c;實現產品快速上線目的。 如監控類攝像機、NVR等&#xff0c;通過廠商…

【啟程Golang之旅】深入解析函數的奧秘與技巧

歡迎來到Golang的世界&#xff01;在當今快節奏的軟件開發領域&#xff0c;選擇一種高效、簡潔的編程語言至關重要。而在這方面&#xff0c;Golang&#xff08;又稱Go&#xff09;無疑是一個備受矚目的選擇。在本文中&#xff0c;帶領您探索Golang的世界&#xff0c;一步步地了…

【全開源】海報在線制作系統源碼(ThinkPHP+FastAdmin+UniApp)

打造個性化創意海報的利器 引言 在數字化時代&#xff0c;海報作為一種重要的宣傳媒介&#xff0c;其設計質量和效率直接影響著宣傳效果。為了滿足廣大用戶對于個性化、高效制作海報的需求&#xff0c;海報在線制作系統源碼應運而生。本文將詳細介紹海報在線制作系統源碼的特…

AbMole - 腫瘤發展與免疫器官的“舞蹈”:一場細胞層面的時間賽跑

在生物醫學領域&#xff0c;腫瘤與免疫系統之間的相互作用一直是研究的熱點話題。腫瘤細胞不是孤立存在的&#xff0c;它們與宿主的免疫系統進行著一場復雜的“舞蹈”。 最近&#xff0c;一項發表在《Molecular & Cellular Proteomics》雜志上的研究&#xff0c;為我們揭開…

【C++】二分查找算法

1.題目 2.算法思路 暴力解法&#xff1a;可以將數組遍歷一遍&#xff0c;就可以找到。時間復雜度為O(n)。不算太差&#xff0c;可以接受。 但是有更優秀的解法&#xff1a; 就是二分查找算法。 算法的特點&#xff1a;我們所查找的“數組”具有二段性。這里的二段性不一定有…

頭歌OpenGauss數據庫-L.應用開發(Python)-選做

第1關:簡單查詢 編程要求 正確使用 psycopg2 ,查詢金融應用場景數據庫 finance 的 client 表(客戶表)中郵箱不為空的客戶信息,列出客戶姓名,郵箱和電話.一個展示結果的示例如下(字體顏色不是編程要求): 注意:你要連接到finance數據庫上(后面第2-6關也是連接這個數據庫)…

【C/C++】詳解關聯容器map的使用

&#x1f517; 運行環境&#xff1a;Matlab &#x1f6a9; 撰寫作者&#xff1a;左手の明天 &#x1f947; 精選專欄&#xff1a;《python》 &#x1f525; 推薦專欄&#xff1a;《算法研究》 &#x1f510;#### 防偽水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

mpv常用快捷鍵

1 mpv mpv是Linux下的一個開源視頻播放器&#xff0c;使用Manjaro的話安裝方式如下&#xff1a; paru -S mpv2 常用快捷鍵 q&#xff1a;推出w/e&#xff1a;視頻縮放r/t&#xff1a;調整字幕位置u&#xff1a;開啟/關閉ass/ssa字幕覆蓋i&#xff1a;顯示當前播放的視頻信息…

Oracle 并行和 session 數量的

這也就是為什么我們指定parallel為4&#xff0c;而實際并行度為8的原因。 insert create index&#xff0c;發現并行數都是加倍的 Indexes seem always created with parallel degree 1 during import as seen from a sqlfile. The sql file shows content like: CREATE INDE…