前端性能瓶颈崩溃项目?Webpack助力解决!

news2025/7/20 21:26:56

  

 🎬 江城开朗的豌豆:个人主页

 🔥 个人专栏 :《 VUE 》 《 javaScript 》

 📝 个人网站 :《 江城开朗的豌豆🫛 》 

⛺️ 生活的理想,就是为了理想的生活 !

在这里插入图片描述

目录

 ⭐  专栏简介

 📘  文章引言

一、背景

二、如何优化

JS代码压缩

CSS代码压缩

Html文件代码压缩

文件大小压缩

图片压缩

Tree Shaking

usedExports

sideEffects

css tree shaking

代码分离

内联chunk

三、总结

⭐  写在最后


 ⭐  专栏简介

        欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。

        同时,我们也会关注最新的前端趋势和发展动态。随着Web技术的不断演进,前端开发也在不断推陈出新。我们会及时介绍最新的前端框架、工具和技术,使你能够站在前沿,与时俱进。通过掌握最新的前端技术,你将能够在竞争激烈的Web开发领域中有更大的竞争力。

 📘  文章引言

一、背景

随着前端的项目逐渐扩大,必然会带来的一个问题就是性能

尤其在大型复杂的项目中,前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至奔溃

一般项目在完成后,会通过webpack进行打包,利用webpack对前端项目性能优化是一个十分重要的环节

二、如何优化

通过webpack优化前端的手段有:

  • JS代码压缩
  • CSS代码压缩
  • Html文件代码压缩
  • 文件大小压缩
  • 图片压缩
  • Tree Shaking
  • 代码分离
  • 内联 chunk

JS代码压缩

terser是一个JavaScript的解释、绞肉机、压缩机的工具集,可以帮助我们压缩、丑化我们的代码,让bundle更小

production模式下,webpack 默认就是使用 TerserPlugin 来处理我们的代码的。如果想要自定义配置它,配置方法如下:

const TerserPlugin = require('terser-webpack-plugin')
module.exports = {
    ...
    optimization: {
        minimize: true,
        minimizer: [
            new TerserPlugin({
                parallel: true // 电脑cpu核数-1
            })
        ]
    }
}

属性介绍如下:

  • extractComments:默认值为true,表示会将注释抽取到一个单独的文件中,开发阶段,我们可设置为 false ,不保留注释
    parallel:使用多进程并发运行提高构建的速度,默认值是true,并发运行的默认数量: os.cpus().length - 1
    terserOptions:设置我们的terser相关的配置:
    compress:设置压缩相关的选项,mangle:设置丑化相关的选项,可以直接设置为true
    mangle:设置丑化相关的选项,可以直接设置为true
    toplevel:底层变量是否进行转换
    keep_classnames:保留类的名称
    keep_fnames:保留函数的名称

CSS代码压缩

CSS压缩通常是去除无用的空格等,因为很难去修改选择器、属性的名称、值等

CSS的压缩我们可以使用另外一个插件:css-minimizer-webpack-plugin

npm install css-minimizer-webpack-plugin -D

配置方法如下:

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

Html文件代码压缩

使用HtmlWebpackPlugin插件来生成HTML的模板时候,通过配置属性minify进行html优化

module.exports = {
    ...
    plugin:[
        new HtmlwebpackPlugin({
            ...
            minify:{
                minifyCSS:false, // 是否压缩css
                collapseWhitespace:false, // 是否折叠空格
                removeComments:true // 是否移除注释
            }
        })
    ]
}

设置了minify,实际会使用另一个插件html-minifier-terser

文件大小压缩

对文件的大小进行压缩,减少http传输过程中宽带的损耗

npm install compression-webpack-plugin -D
new ComepressionPlugin({
    test:/\.(css|js)$/,  // 哪些文件需要压缩
    threshold:500, // 设置文件多大开始压缩
    minRatio:0.7, // 至少压缩的比例
    algorithm:"gzip", // 采用的压缩算法
})

图片压缩

一般来说在打包之后,一些图片文件的大小是远远要比 js 或者 css 文件要来的大,所以图片压缩较为重要

配置方法如下:

module: {
  rules: [
    {
      test: /\.(png|jpg|gif)$/,
      use: [
        {
          loader: 'file-loader',
          options: {
            name: '[name]_[hash].[ext]',
            outputPath: 'images/',
          }
        },
        {
          loader: 'image-webpack-loader',
          options: {
            // 压缩 jpeg 的配置
            mozjpeg: {
              progressive: true,
              quality: 65
            },
            // 使用 imagemin**-optipng 压缩 png,enable: false 为关闭
            optipng: {
              enabled: false,
            },
            // 使用 imagemin-pngquant 压缩 png
            pngquant: {
              quality: '65-90',
              speed: 4
            },
            // 压缩 gif 的配置
            gifsicle: {
              interlaced: false,
            },
            // 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式
            webp: {
              quality: 75
            }
          }
        }
      ]
    },
  ]
} 

Tree Shaking

Tree Shaking 是一个术语,在计算机中表示消除死代码,依赖于ES Module的静态语法分析(不执行任何的代码,可以明确知道模块的依赖关系)

webpack实现Trss shaking有两种不同的方案:

  • usedExports:通过标记某些函数是否被使用,之后通过Terser来进行优化的
  • sideEffects:跳过整个模块/文件,直接查看该文件是否有副作用

两种不同的配置方案, 有不同的效果

usedExports

配置方法也很简单,只需要将usedExports设为true

module.exports = {
    ...
    optimization:{
        usedExports
    }
}

使用之后,没被用上的代码在webpack打包中会加入unused harmony export mul注释,用来告知 Terser 在优化时,可以删除掉这段代码

如下面sum函数没被用到,webpack打包会添加注释,terser在优化时,则将该函数去掉

​编辑

sideEffects

sideEffects用于告知webpack compiler哪些模块时有副作用,配置方法是在package.json中设置sideEffects属性

如果sideEffects设置为false,就是告知webpack可以安全的删除未用到的exports

如果有些文件需要保留,可以设置为数组的形式

"sideEffecis":[    "./src/util/format.js",    "*.css" // 所有的css文件]

上述都是关于javascripttree shakingcss同样也能够实现tree shaking

css tree shaking

css进行tree shaking优化可以安装PurgeCss插件

npm install purgecss-plugin-webpack -D
const PurgeCssPlugin = require('purgecss-webpack-plugin')
module.exports = {    ...    plugins:[        new PurgeCssPlugin({            path:glob.sync(`${path.resolve('./src')}/**/*`), {nodir:true}// src里面的所有文件            satelist:function(){                
return {                    
standard:["html"]                
}            
}        
})    
]}
  • paths:表示要检测哪些目录下的内容需要被分析,配合使用glob
  • 默认情况下,Purgecss会将我们的html标签的样式移除掉,如果我们希望保留,可以添加一个safelist的属性

代码分离

将代码分离到不同的bundle中,之后我们可以按需加载,或者并行加载这些文件

默认情况下,所有的JavaScript代码(业务代码、第三方依赖、暂时没有用到的模块)在首页全部都加载,就会影响首页的加载速度

代码分离可以分出出更小的bundle,以及控制资源加载优先级,提供代码的加载性能

这里通过splitChunksPlugin来实现,该插件webpack已经默认安装和集成,只需要配置即可

默认配置中,chunks仅仅针对于异步(async)请求,我们可以设置为initial或者all

module.exports = {   
 ...   
 optimization:{       
 splitChunks:{            
chunks:"all"        
}    
}}

splitChunks主要属性有如下:

  • Chunks,对同步代码还是异步代码进行处理
  • minSize: 拆分包的大小, 至少为minSize,如何包的大小不超过minSize,这个包不会拆分
  • maxSize: 将大于maxSize的包,拆分为不小于minSize的包
  • minChunks:被引入的次数,默认是1

内联chunk

可以通过InlineChunkHtmlPlugin插件将一些chunk的模块内联到html,如runtime的代码(对模块进行解析、加载、模块信息相关的代码),代码量并不大,但是必须加载的



const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = { 
    ...plugin: [new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime.+\.js/]
    )]}

三、总结

关于webpack对前端性能的优化,可以通过文件体积大小入手,其次还可通过分包的形式、减少http请求次数等方式,实现对前端性能的优化

⭐  写在最后

请大家不吝赐教,在下方评论或者私信我,十分感谢🙏🙏🙏.

✅ 认为我某个部分的设计过于繁琐,有更加简单或者更高逼格的封装方式

✅ 认为我部分代码过于老旧,可以提供新的API或最新语法

✅ 对于文章中部分内容不理解

✅ 解答我文章中一些疑问

✅ 认为某些交互,功能需要优化,发现BUG

✅ 想要添加新功能,对于整体的设计,外观有更好的建议

最后感谢各位的耐心观看,既然都到这了,点个 👍赞再走吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SOLIDWORKS上海华东代理商特别企划·SW正版软件免费试用下载

为了向上海华东地区广大SOLIDWORKS用户提供更好的本地化服务,SOLIDWORKS官方授权代理经销商北京亿达四方信息技术有限公司在上海成立了分公司,20年来致力于帮助用户搭建基于SOLIDWORKS的3D数字化研发设计制造平台、培养研发和创新型人才、建立基于3D产品…

linux杀毒软件下载、安装(在线安装、离线安装)

下载 ClamAVNet 离线安装 # 离线安装 rpm -ivh --prefix/usr/local/clamav clamav*linux.x86_64.rpm # 添加用户组和组成员 groupadd clamav useradd -g clamav clamav # 创建日志目录、病毒库目录和套接字目录 mkdir -p /usr/local/clamav/logs mkdir -p /usr/local/clamav/…

今日头条小程序源码系统 带完整搭建教程

随着小程序的发展,越来越多的企业和开发者开始关注小程序的开发。今天源码小编给大家分享一款今日头条小程序源码系统,并附带完整的搭建教程。 今日头条小程序源码系统是一款基于PHPMySQL开发组合开发的小程序框架,具有丰富的组件库和插件生…

HTML链接、头部

HTML链接: HTML使用超级链接与网络上的另一个文档相连。HTML中的链接是一种用于在不同网页之间的导航的元素。链接通常用于将一个网页与另一个网页或资源(文档、图像、音频文件等)相关联。链接允许用户在浏览网页时单击文本或图像来跳转到其他…

Java导入Jsoup库做一个有趣的爬虫项目

Jsoup库是一款Java的HTML解析器,可用于从网络或本地文件中获取HTML文档并解析其中的数据。它可以模拟浏览器的行为,获取网页中的数据,是Java爬虫中常用的工具之一。与浏览器相比,Jsoup库的主要区别在于它不会执行JavaScript代码&a…

二叉树(9.7)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2 特殊的二叉树 2.4 二叉树的存储结构 3.二叉树顺序结构及实现 3.1 二叉树的顺序结构 3.2 堆的概念及结构 1.树概念及结构 1.1树的概念 前面我们学习的都是组成简…

如何建设企业级API网关

企业级API网关是现代软件架构中不可或缺的重要组成部分,它能够为整个系统提供安全可靠的入口,同时也是系统中不同业务模块之间交互的桥梁。API网关使得搭建一个新的应用服务变得简单、快捷、高效,同时,开发人员可以将更多的精力放…

白嫖必看!500条chatgpt提示词任你使用

你可能好奇,什么是prompt? 简单来说,prompt就是chatgpt的启动口令(即提示词),是指通过特定问题来启动AI助手的创作。 使用它非常简单,只需在chatgpt前输入一句话或几个关键词,就能让AI助手理解…

leetcode:27. 移除元素(python3解法)

难度:简单 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…

实现每栏中间穿插一个低于外部盒子高度的分割线

效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

第21期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

利用python绘制多个箱型图

文章目录 1. 图片2. 代码 1. 图片 图片示例如下所示&#xff1a; 2. 代码 代码如下所示&#xff1a; # Define the custom order based on atmospheric stability custom_order [vus_0, us_1, ne_2, ws_3, ws_4, s_5, s_6, s_7, vs_8, vs_9]# Step 1: Reorder the statis…

0基础学习VR全景平台篇第116篇:认识修图软件Photoshop

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 今天给大家讲解修图软件Photoshop&#xff0c;下面我们开始吧&#xff01; &#xff08;PS软件课程大纲&#xff09; 1.Photoshop是什么 发明人Adobe Photoshop&#xff0c;简称…

一分钟教你批量删除文件名中特定文字

怎么批量删除文件名中特定文字&#xff1f;在这个信息化的时代&#xff0c;我们每天会通过电脑处理大量的电子文件。无论是个人还是企业用户&#xff0c;在文件管理过程中&#xff0c;常常会遇到文件名混乱、重复或包含特定文字等问题。这些问题对于文件的检索和整理造成了很大…

【新增长100人研讨会】大客户管理:揭秘驱动业绩增长的关键策略

2023年10月26日&#xff0c;纷享销客在上海举办了一场名为《新增长100人研讨会&#xff1a;驱动业绩增长的大客户管理》的活动。该活动旨在探讨如何有效管理大客户&#xff0c;以实现企业的利润和可持续发展。新奥动力战略与数字化负责人胡昊和纷享销客制造行业解决方案总经理王…

对比解析php和go对JSON处理的区别

一、go 转化php数组代码 php程序 $str <<<EOF {"操作源":"任意","数据库":"任意","语句类型":"CREATE DATABASE&#xff1b;DROP DATABASE&#xff1b;ALTER DATABASE","影响行数":"不…

word文档中宏的使用(使用VBA批量修改表格样式)

1. 找到工具栏中“视图-》宏” 2. 选择“查看宏” 3. 创建/编辑宏 4. 修改“表格背景和设定字体大小”代码 如图&#xff1a; 代码块&#xff1a; Sub 修改表格字体()修改表格字体 宏For i 1 To ActiveDocument.Tables.CountDim t As TableSet t ActiveDocument.Tables(i)…

Maven第九章: Maven插件应用-FTP的插件

Maven第九章: Maven插件应用-FTP的插件 前言 本章内容重点:IDEA中 FTP的插件,以及FTP的插件在IDEA中连接和操作FTP服务器 操作应用。 背景 实际开发过程中,windows 安装相应的编辑工具不方便,我们需要实时上传到Linux服务进行编辑运行,查看效果,IDEA开发工具FTP插件,…

基于算术优化算法的无人机航迹规划-附代码

基于算术优化算法的无人机航迹规划 文章目录 基于算术优化算法的无人机航迹规划1.算术优化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用算术优化算法来优化无人机航迹规划。 …

iPhone手机如何恢复删除的视频?整理了3个好用方法!

在日常生活中&#xff0c;我们会把各种各样的视频存放在手机里。这些视频记录着我们生活中的点点滴滴&#xff0c;每一帧都承载着珍贵的记忆。但如果我们不小心将这些重要视频删除了该怎么办&#xff1f;如何恢复删除的视频&#xff1f;本文将以iPhone手机为例子&#xff0c;教…