優化webpack打包體積思路

Webpack 打包過大的問題通常會導致頁面加載變慢,影響用戶體驗。可以從代碼優化、依賴優化、構建優化等多個角度入手來減少打包體積:


  1. 代碼優化

(1)按需加載(代碼拆分)

① 路由懶加載

如果你的項目使用 Vue Router,可以使用動態 import() 進行路由懶加載:

const Home = () => import(’@/views/Home.vue’);
const About = () => import(’@/views/About.vue’);

const routes = [
{ path: ‘/’, component: Home },
{ path: ‘/about’, component: About },
];

這樣只會在需要時加載對應的頁面,而不是一次性加載所有路由組件。

② 組件懶加載

import { defineAsyncComponent } from ‘vue’;

const AsyncComponent = defineAsyncComponent(() =>
import(’@/components/HeavyComponent.vue’)
);

Vue 3 提供了 defineAsyncComponent,可以按需加載組件,避免一次性加載所有組件。

③ 動態導入依賴

對于某些不常用的庫,可以在使用時動態 import(),而不是一開始就加載:

button.addEventListener(‘click’, async () => {
const { heavyFunction } = await import(’@/utils/heavyModule’);
heavyFunction();
});

這樣不會在初始打包時包含該模塊,而是等用戶需要時才加載。


  1. 依賴優化

(1)移除不必要的依賴

可以用 webpack-bundle-analyzer 查看打包體積:

npm install -D webpack-bundle-analyzer

然后在 vue.config.js 或 webpack.config.js 中添加:

const BundleAnalyzerPlugin = require(‘webpack-bundle-analyzer’).BundleAnalyzerPlugin;

module.exports = {
plugins: [
new BundleAnalyzerPlugin(),
],
};

運行 npm run build 后,會生成一個可視化報告,看看哪些庫太大,可以考慮替換或刪除。

(2)使用更輕量的庫

Lodash 替換方案:

Tree Shaking:使用 lodash-es 代替 lodash,并確保只導入需要的方法:

import { debounce } from ‘lodash-es’;

第三方替代:如 just-debounce、just-throttle 等。

Moment.js 替換方案:

Moment.js 很大,可以換成 dayjs:

npm install dayjs

import dayjs from ‘dayjs’;
console.log(dayjs().format());

Element Plus/Ant Design Vue 按需加載 如果使用 UI 組件庫,不要全量引入,要改成按需引入:

import { Button } from ‘ant-design-vue’;
import ‘ant-design-vue/es/button/style’;


  1. 構建優化

(1)開啟 Tree Shaking

確保 package.json 中 “sideEffects” 設為 false,讓 Webpack 進行搖樹優化:

{
“sideEffects”: false
}

如果某些模塊有副作用(如樣式文件),可以單獨列出:

{
“sideEffects”: [".css", ".scss"]
}

(2)使用 ESBuild Loader 加速構建

ESBuild 比 Babel 更快,可以用來優化 TS/JS 解析:

npm install -D esbuild-loader

在 webpack.config.js 中:

module.exports = {
module: {
rules: [
{
test: /.ts$/,
loader: ‘esbuild-loader’,
options: {
loader: ‘ts’,
target: ‘esnext’,
},
},
],
},
};

(3)使用 Rspack 代替 Webpack

你已經有 Webpack 遷移到 Rspack 的經驗,可以考慮直接用 Rspack,它的構建速度更快,尤其適用于 Vue 3 項目。


  1. 靜態資源優化

(1)開啟 Gzip/Brotli 壓縮

開啟 Gzip:

npm install compression-webpack-plugin -D

const CompressionPlugin = require(‘compression-webpack-plugin’);

module.exports = {
plugins: [
new CompressionPlugin({
algorithm: ‘gzip’,
test: /.(js|css|html|svg)$/,
}),
],
};

Brotli 壓縮效果更好,可以用 brotli-webpack-plugin。

(2)圖片優化

使用 WebP:比 PNG/JPEG 體積小,加載更快。

SVG 優化:使用 svgo 或 unplugin-icons 讓 SVG 直接變 Vue 組件:

npm install -D unplugin-icons

import { OhVueIcon, addIcons } from ‘oh-vue-icons’;
import { BiGithub } from ‘oh-vue-icons/icons’;
addIcons(BiGithub);


  1. 緩存優化

(1)開啟瀏覽器緩存

在 webpack.config.js 中:

output: {
filename: ‘[name].[contenthash:8].js’,
chunkFilename: ‘[name].[contenthash:8].js’,
}

這樣文件名帶 contenthash,只要內容不變,瀏覽器就會用緩存,不會重復下載。

(2)分離第三方庫(Vendor Split)

可以用 Webpack splitChunks 把依賴拆分:

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

這樣 node_modules 里的庫會被打包成一個獨立的 vendors.js,瀏覽器可以緩存它,不用每次都下載。


總結

如果 Webpack 打包特別大,可以從以下幾方面優化: ? 按需加載(路由懶加載、組件懶加載、動態 import())
? 移除大依賴(lodash → lodash-es,moment → dayjs)
? 啟用 Tree Shaking(sideEffects: false)
? 用 ESBuild 加速編譯
? 靜態資源優化(圖片壓縮、Gzip/Brotli 壓縮)
? 分離第三方庫(splitChunks)

如果你的 Webpack 構建速度慢,考慮直接遷移到 Rspack,你之前已經做過類似的遷移,應該很容易上手!

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

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

相關文章

HarmonyOS Next~鴻蒙元服務開發指南:核心功能與實踐

HarmonyOS Next~鴻蒙元服務開發指南:核心功能與實踐 一、元服務核心概念 原子化服務定義 元服務(原子服務)是鴻蒙系統的核心架構單元,具備獨立業務能力的輕量化服務模塊,支持免安裝、跨設備調用和智能分發…

git錯誤:fatal: detected dubious ownership in repository at xxxxxx

1、報錯說明 這個錯誤通常是由于Git倉庫目錄的擁有者或權限問題引起的。Git檢測到倉庫目錄的所有權可能存在不一致或不安全的情況。 通常導致此報錯的可能原因: (1)文件或目錄的擁有者不一致: 倉庫目錄中的某些文件或子目錄可能…

【計算機網絡】OSI七層模型完全指南:從比特流到應用交互的逐層拆解

OSI模型 導讀一、概念二、模型層次結構2.1 物理層(Physical Layer)2.2 數據鏈路層(Data Link Layer)?2.3 ?網絡層(Network Layer)?2.4 ?傳輸層(Transport Layer)?2.5 ?會話層&…

零基礎被迫參加CTF比賽?CTF高頻解題技巧與經驗分享

CTF(Capture The Flag)比賽中的高頻解題技巧通常涵蓋了以下幾類技術,涉及從逆向工程、二進制漏洞利用到Web安全、密碼學等多個領域。以下是一些高頻解題技巧: 1. 逆向工程(Reverse Engineering) 靜態分析&a…

markdown 文件轉 word

將 Markdown 文件轉換為 Word 文檔,可以使用多種方法。以下是幾種常見的方法: 方法1:使用在線轉換工具 有許多在線服務可以將 Markdown 文件轉換為 Word 文檔。例如: Pandoc - 一個非常流行的命令行工具,也可以用來轉…

【第十三屆“泰迪杯”數據挖掘挑戰賽】【2025泰迪杯】【思路篇】A題解題全流程(持續更新)

【第十三屆“泰迪杯”數據挖掘挑戰賽】【2025泰迪杯】A題解題全流程-思路(持續更新) 寫在前面: 1、A題、C題將會持續更新,陸續更新發布文章 2、賽題交流咨詢Q群:1037590285 3、全家桶依舊包含: 代碼、…

T11 TensorFlow入門實戰——優化器對比實驗

🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同學啊 | 接輔導、項目定制 一、前期準備 1. 導入數據 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…

Docker部署sprintboot后端項目

創建Docker網絡 docker network create icjs 部署Redis docker run -d \--network icjs \--name redis \-p 6379:6379 \redis:latest數據持久化 docker run --restartalways --network icjs -p 6379:6379 --name redis -v /opt/docker/redis/redis.conf:/etc/redis/redis.c…

01小游戲

問題描述 小明得到了一個長度為 nn 的字符串 ss ,該字符串都是由數字 00 和 11 組成,并且下標從 11 開始,小明現在需要對這個字符串進行 qq 次操作,每次操作包含以下兩種操作之一: 操作 11 :小明查詢該字符…

Androidstudio開發,實現商品分類

文章目錄 1. 功能需求2. 代碼實現過程1. 編寫布局文件2. 創建商品分類(Adapter)適配器3. 實現商品分類Activity4. 在res/values/ 下新建 array.xml ,用于添加商品分類數據5. 效果演示 6. 關于作者其它項目視頻教程介紹 1. 功能需求 顯示商品分…

Linux快速安裝docker和docker-componse步驟

在 CentOS 7 上安裝 Docker 和 Docker Compose 的步驟如下: 1. 安裝 Docker 1.1. 更新系統 首先,確保你的系統是最新版本: sudo yum update -y1.2. 安裝必要的包 安裝 yum-utils,這是管理 YUM 源的工具: sudo yu…

VBA代碼解決方案第二十三講 EXCEL中,如何刪除工作表中的空白行

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程,目前已經是第三版修訂了。這套教程定位于入門后的提高,在學習這套教程過程中,側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

Pytorch--tensor.view()

在 PyTorch 中,tensor.view() 是一個常用的方法,用于改變張量(Tensor)的形狀(shape),但不會改變其數據本身。它類似于 NumPy 的 reshape(),但有一些關鍵區別。 1. 基本用法 import …

【機器學習】——機器學習思考總結

摘要 這篇文章深入探討了機器學習中的數據相關問題,重點分析了神經網絡(DNN)的學習機制,包括層級特征提取、非線性激活函數、反向傳播和梯度下降等關鍵機制。同時,文章還討論了數據集大小的標準、機器學習訓練數據量的…

CoAP Shell 筆記

CoAP Shell 筆記 1. 概述 CoAP (Constrained Application Protocol) 是一種專為物聯網 (IoT) 中資源受限的節點和網絡設計的 RESTful Web 傳輸協議。CoAP Shell 是一個基于命令行的交互式工具,用于與支持 CoAP 的服務器進行交互。 2. 主要功能 協議支持&#xff…

【最新】探索CFD的未來:從OpenFOAM到深度學習,全面解析計算流體力學的頂級資源與前沿技術

計算流體力學(CFD)作為現代工程與科學研究的核心工具,正以前所未有的速度邁向智能化與多物理場耦合的新時代。本文全面梳理了在線學習CFD的頂級資源,涵蓋了從傳統數值模擬到深度學習驅動的物理信息模型的廣泛領域,旨在為研究者、工程師和學生提供一站式參考指南。內容分為…

[leetcode]2492. 兩個城市間路徑的最小分數(并查集 排序后建邊)

題目鏈接 題意 給定一個 n n n個點 m m m條邊的無向圖 每條邊有邊權 求1-n的路徑中最小的邊權是多少 每條路可以重復走 思路 把邊按邊權降序排序 用并查集維護連通性 遍歷每條邊 每次合并邊的起點和終點 如果1和n聯通 并且這條邊在1和n的這個連通塊中 就對ans取min Code…

Windows中IDEA2024.1的安裝和使用

如果你也喜歡,記得一鍵三連啊 一、卸載 二、安裝 三、注冊 1、打開Crack文件,直接雙擊 “安裝.bat”,否則可能安裝會出錯!! 2、選擇【Activation code】(不要關閉該界面繼續后面的步驟)。 …

【C#】構造協議幀通過串口下發

構造一個“協議幀”&#xff0c;打包串口/網絡通信幀頭部結構的核心部分 &#x1f527; 代碼&#xff1a; List<byte> frame new List<byte>();// 1. 固定幀頭 frame.AddRange(BitConverter.GetBytes(0x0130)); // 幀頭 (4B) frame.AddRange(BitConverter…

04_SQL概述及DDL

文章目錄 一、關于SQL1.1、SQL概述1.2、SQL分類 二、數據庫操作2.1、查看數據庫2.2、切換數據庫2.3、查詢當前使用的數據庫2.4、創建數據庫2.5、查看數據庫創建信息2.6、修改數據庫2.7、刪除數據庫 三、表的操作3.1、數據類型3.1.1、數值類型3.1.2、字符串類型3.1.3、日期時間類…