参考答案:
随着前端的项目逐渐扩大,必然会带来的一个问题就是性能
尤其在大型复杂的项目中,前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至奔溃
一般项目在完成后,会通过webpack
进行打包,利用webpack
对前端项目性能优化是一个十分重要的环节
通过webpack
优化前端的手段有:
terser
是一个JavaScript
的解释、绞肉机、压缩机的工具集,可以帮助我们压缩、丑化我们的代码,让bundle
更小
在production
模式下,webpack
默认就是使用 TerserPlugin
来处理我们的代码的。如果想要自定义配置它,配置方法如下:
1const TerserPlugin = require('terser-webpack-plugin') 2module.exports = { 3 ... 4 optimization: { 5 minimize: true, 6 minimizer: [ 7 new TerserPlugin({ 8 parallel: true // 电脑cpu核数-1 9 }) 10 ] 11 } 12}
属性介绍如下:
CSS
压缩通常是去除无用的空格等,因为很难去修改选择器、属性的名称、值等
CSS的压缩我们可以使用另外一个插件:css-minimizer-webpack-plugin
1npm install css-minimizer-webpack-plugin -D
配置方法如下:
1const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') 2module.exports = { 3 // ... 4 optimization: { 5 minimize: true, 6 minimizer: [ 7 new CssMinimizerPlugin({ 8 parallel: true 9 }) 10 ] 11 } 12}
使用HtmlWebpackPlugin
插件来生成HTML
的模板时候,通过配置属性minify
进行html
优化
1module.exports = { 2 ... 3 plugin:[ 4 new HtmlwebpackPlugin({ 5 ... 6 minify:{ 7 minifyCSS:false, // 是否压缩css 8 collapseWhitespace:false, // 是否折叠空格 9 removeComments:true // 是否移除注释 10 } 11 }) 12 ] 13}
设置了minify
,实际会使用另一个插件html-minifier-terser
对文件的大小进行压缩,减少http
传输过程中宽带的损耗
1npm install compression-webpack-plugin -D
1new ComepressionPlugin({ 2 test:/\.(css|js)$/, // 哪些文件需要压缩 3 threshold:500, // 设置文件多大开始压缩 4 minRatio:0.7, // 至少压缩的比例 5 algorithm:"gzip", // 采用的压缩算法 6})
一般来说在打包之后,一些图片文件的大小是远远要比 js
或者 css
文件要来的大,所以图片压缩较为重要
配置方法如下:
1module: { 2 rules: [ 3 { 4 test: /\.(png|jpg|gif)$/, 5 use: [ 6 { 7 loader: 'file-loader', 8 options: { 9 name: '[name]_[hash].[ext]', 10 outputPath: 'images/', 11 } 12 }, 13 { 14 loader: 'image-webpack-loader', 15 options: { 16 // 压缩 jpeg 的配置 17 mozjpeg: { 18 progressive: true, 19 quality: 65 20 }, 21 // 使用 imagemin**-optipng 压缩 png,enable: false 为关闭 22 optipng: { 23 enabled: false, 24 }, 25 // 使用 imagemin-pngquant 压缩 png 26 pngquant: { 27 quality: '65-90', 28 speed: 4 29 }, 30 // 压缩 gif 的配置 31 gifsicle: { 32 interlaced: false, 33 }, 34 // 开启 webp,会把 jpg 和 png 图片压缩为 webp 格式 35 webp: { 36 quality: 75 37 } 38 } 39 } 40 ] 41 }, 42 ] 43}
Tree Shaking
是一个术语,在计算机中表示消除死代码,依赖于ES Module
的静态语法分析(不执行任何的代码,可以明确知道模块的依赖关系)
在webpack
实现Trss shaking
有两种不同的方案:
两种不同的配置方案, 有不同的效果
配置方法也很简单,只需要将usedExports
设为true
1module.exports = { 2 ... 3 optimization:{ 4 usedExports 5 } 6}
使用之后,没被用上的代码在webpack
打包中会加入unused harmony export mul
注释,用来告知 Terser
在优化时,可以删除掉这段代码
如下面sum
函数没被用到,webpack
打包会添加注释,terser
在优化时,则将该函数去掉
sideEffects
用于告知webpack compiler
哪些模块时有副作用,配置方法是在package.json
中设置sideEffects
属性
如果sideEffects
设置为false,就是告知webpack
可以安全的删除未用到的exports
如果有些文件需要保留,可以设置为数组的形式
1"sideEffecis":[ "./src/util/format.js", "*.css" // 所有的css文件]
上述都是关于javascript
的tree shaking
,css
同样也能够实现tree shaking
css
进行tree shaking
优化可以安装PurgeCss
插件
1npm install purgecss-plugin-webpack -D
1const PurgeCssPlugin = require('purgecss-webpack-plugin')module.exports = { ... plugins:[ new PurgeCssPlugin({ path:glob.sync(`${path.resolve('./src')}/**/*`), {nodir:true}// src里面的所有文件 satelist:function(){ return { standard:["html"] } } }) ]}
将代码分离到不同的bundle
中,之后我们可以按需加载,或者并行加载这些文件
默认情况下,所有的JavaScript
代码(业务代码、第三方依赖、暂时没有用到的模块)在首页全部都加载,就会影响首页的加载速度
代码分离可以分出出更小的bundle
,以及控制资源加载优先级,提供代码的加载性能
这里通过splitChunksPlugin
来实现,该插件webpack
已经默认安装和集成,只需要配置即可
默认配置中,chunks仅仅针对于异步(async)请求,我们可以设置为initial或者all
1module.exports = { ... optimization:{ splitChunks:{ chunks:"all" } }}
splitChunks
主要属性有如下:
可以通过InlineChunkHtmlPlugin
插件将一些chunk
的模块内联到html
,如runtime
的代码(对模块进行解析、加载、模块信息相关的代码),代码量并不大,但是必须加载的
1const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin')const HtmlWebpackPlugin = require('html-webpack-plugin')module.exports = { ... plugin:[ new InlineChunkHtmlPlugin(HtmlWebpackPlugin,[/runtime.+\.js/]}
关于webpack
对前端性能的优化,可以通过文件体积大小入手,其次还可通过分包的形式、减少http请求次数等方式,实现对前端性能的优化
最近更新时间:2024-08-10