webpack的几种常用前端优化方案

原创
小哥 3年前 (2022-10-21) 阅读数 115 #Webpack
文章标签 webpack

1.JS代码压缩

terser 是一个JavaScript编译和压缩工具集可以帮助我们压缩和优化代码,并使包更小。

在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 :保留函数的名称

2.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
            })
        ]
    }
}

3.HTML代码压缩

使用 HtmlWebpackPlugin 要生成的插件HTML模板,通过配置 minify 进行html优化

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

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

4.文件大小压缩

压缩文件大小以减小http传输过程中的带宽损失

npm install compression-webpack-plugin -D

new ComepressionPlugin({
    test:/.(css|js)$/,  // 需要压缩哪些文件
    threshold:500, // 设置文件开始压缩的大小。
    minRatio:0.7, // 至少压缩的比例
    algorithm:"gzip", // 使用的压缩算法
})

5.图片压缩

一般来说,打包后的一些图片文件的大小要比这个大得多 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
            }
          }
        }
      ]
    },
  ]
} 

6.Tree Shaking

Tree Shaking 是一个术语,在计算机中表示消除死代码,依赖于 ES module 静态语法分析。

在webpack实现 Tree Shaking 有两种不同的方案

  • usedExports :通过标记是否使用了某些功能,然后 Terser 要优化
  • sideEffects :跳过整个模块/文件,直接查看该文件是否有副作用。

这两个计划有不同的效果。

6.1.usedExoprts

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

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

使用后,未使用的代码在中。webpack将添加该程序包。 unused harmony export mul 备注,用于通知 Terser 此代码可以在优化过程中删除。

6.2.sideEffects

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

如果 sideEffects 设置为 false ,是为了通知webpack可以安全地删除未使用的内容 exports

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

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

6.3.CSS Tree Shaking

上面 6.16.2 都是关于JS的 Tree Shaking ,CSS也有可能实现

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的属性

7.代码分离

将代码分成不同的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

8.内联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如何优化前端性能

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门