Webpack优化技巧13个:提高优化速度、压缩打包文件的大小、改善用户体验

2022-07-1821:34:35WEB前端开发Comments1,589 views字数 3662阅读模式

Webpack优化技巧13个:提高优化速度、压缩打包文件的大小、改善用户体验文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

Webpack 是目前前端开发最重要的构建工具。无论是自己的日常开发,还是准备面试,都应该掌握一些关于 Webpack 的优化技巧。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

在这篇文章中,我将从三个方面分享一些我常用的技巧:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

  • 提高优化速度
  • 压缩打包文件的大小
  • 改善用户体验。

01、线程加载器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

多线程可以提高程序的效率,我们也可以在 Webpack 中使用。而thread-loader是一个可以在Webpack中启用多线程的加载器。安装:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

npm i thread-loader -D
复制代码

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

{
        test: /.js$/,
        use: [
          'thread-loader',
          'babel-loader'
        ],
}
复制代码

02、缓存加载器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

在我们的项目开发过程中,Webpack 需要多次构建项目。为了加快后续构建,我们可以使用缓存,与缓存相关的加载器是缓存加载器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

安装:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

npm i cache-loader -D
复制代码

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

{
        test: /.js$/,
        use: [
          'cache-loader',
          'thread-loader',
          'babel-loader'
        ],
}
复制代码

03、Hot update文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

当我们在项目中修改一个文件时,Webpack 默认会重新构建整个项目,但这并不是必须的。我们只需要重新编译这个文件,效率更高,这种策略称为Hot update。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

Webpack 内置了Hot update插件,我们只需要在配置中开启Hot update即可。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

// import webpack
const webpack = require('webpack');
复制代码

然后:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

{
  plugins: [
      new webpack.HotModuleReplacementPlugin()
  ],

  devServer: {
      hot: true
  }
}
复制代码

04、exclude & include文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

在我们的项目中,一些文件和文件夹永远不需要参与构建。所以我们可以在配置文件中指定这些文件,防止Webpack取回它们,从而提高编译效率。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

当然,我们也可以指定一些文件需要编译。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

exclude : 不需要编译的文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

include : 需要编译的文件文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

{
    test/.js$/,

    include: path.resolve(__dirname, '../src'),

    exclude/node_modules/,
    use: [
        'babel-loader'
    ]
}
复制代码

05、缩小 CSS 代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

css-minimizer-webpack-plugin 可以压缩和去重 CSS 代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

安装:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

npm i css-minimizer-webpack-plugin -D
复制代码

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
复制代码

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

optimization: {
    minimizer: [
      new CssMinimizerPlugin(),
    ],
  }
复制代码

06、缩小 JavaScript 代码文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

terser-webpack-plugin 可以压缩和去重 JavaScript 代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

安装:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

npm i terser-webpack-plugin -D
复制代码

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

const TerserPlugin require('terser-webpack-plugin')
optimization: {
    minimizer: [
      new CssMinimizerPlugin(), 
      new TerserPlugin({
        terserOptions: {
          compress: {
            drop_consoletrue, // remove console statement
          },
        },
      }),
    ],
  }
复制代码

07、tree-shaking文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

tree-shaking 就是:只编译实际用到的代码,不编译项目中没有用到的代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

在 Webpack5 中,默认情况下会启用 tree-shaking。我们只需要确保在最终编译时使用生产模式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

module.exports = {
  mode: 'production'
}
复制代码

08、source-map文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

当我们的代码出现bug时,source-map可以帮助我们快速定位到源代码的位置。但是这个文件很大。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

为了平衡性能和准确性,我们应该:在开发模式下生成更准确(但更大)的 source-map;在生产模式下生成更小(但不那么准确)的源映射。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

开发模式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

module.exports = {
  mode: 'development',
  devtool: 'eval-cheap-module-source-map'
}
复制代码

生产方式:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

module.exports = {
  mode: 'production',
  devtool: 'nosources-source-map'
}
复制代码

09、Bundle Analyzer文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

我们可以使用 webpack-bundle-analyzer 来查看打包后的 bundle 文件的体积,然后进行相应的体积优化。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

安装:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

npm i webpack-bundle-analyzer -D
复制代码

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

const {
  BundleAnalyzerPlugin
} = require('webpack-bundle-analyzer')
// config
plugins: [
    new BundleAnalyzerPlugin(),
]
复制代码

改善用户体验文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

10、模块延迟加载文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

如果模块没有延迟加载,整个项目的代码会被打包成一个js文件,导致单个js文件体积非常大。那么当用户请求网页时,首屏的加载时间会更长。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

使用模块来加载后,大js文件会被分割成多个小js文件,加载时网页按需加载,大大提高了首屏的加载速度。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

要启用延迟加载,我们只需要编写如下代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

// src/router/index.js
const routes = [
  {
    path: '/login',
    name: 'login',
    component: login
  },
  {
    path: '/home',
    name: 'home',
    // lazy-load
    component: () => import('../views/home/home.vue'),
  },
]
复制代码

11、压缩包文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

Gzip是一种常用的文件压缩算法,可以提高传输效率。但是,此功能需要后端配合。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

安装:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

npm i compression-webpack-plugin -D
复制代码

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

const CompressionPlugin require('compression-webpack-plugin')

// config
plugins: [

    // gzip
    new CompressionPlugin({
      algorithm'gzip',
      threshold10240,
      minRatio0.8
    })
  ]
复制代码

12、base64文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

对于一些小图片,可以转成base64编码,这样可以减少用户的HTTP请求次数,提升用户体验。url-loader 在 webpack5 中已被弃用,我们可以使用 assets-module 代替。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

配置:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

{
   test: /.(png|jpe?g|gif|svg|webp)$/,
   type: 'asset',
   parser: {
      // Conditions for converting to base64
      dataUrlCondition: {
         maxSize: 25 * 1024, // 25kb
      }
   },
   generator: {
    filename: 'images/[contenthash][ext][query]',
   },
},
复制代码

13、正确配置哈希文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

我们可以将哈希添加到捆绑文件中,这样可以更轻松地处理缓存。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

output: {
    pathpath.resolve(__dirname, '../dist'),
    filename: 'js/chunk-[contenthash].js',
    clean: true,
  },
复制代码

以上就是我跟你分享的13个关于Webpack的技巧,希望对你有用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

作者:陆荣涛文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/gcs/25396.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/gcs/25396.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定