• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

12个Webpack的优化项目的

武飞扬头像
前端小云儿
帮助1

Webpack 是目前前端开发最重要的构建工具。无论是自己的日常开发,还是准备面试,都应该掌握一些关于 Webpack 的优化技巧。

在这篇文章中,我将从三个方面分享一些我常用的技巧:

  • 提高优化速度

  • 压缩打包文件的大小

  • 改善用户体验。

提高速度

01、线程加载器

多线程可以提高程序的效率,我们也可以在 Webpack 中使用。而thread-loader是一个可以在Webpack中启用多线程的加载器。

npm i thread-loader -D

  1.  
    {
  2.  
    test: /\.js$/,
  3.  
    use: [
  4.  
    'thread-loader',
  5.  
    'babel-loader'
  6.  
    ],
  7.  
    }

02、缓存加载器

在我们的项目开发过程中,Webpack 需要多次构建项目。为了加快后续构建,我们可以使用缓存,与缓存相关的加载器是缓存加载器。

安装:npm i cache-loader -D

  1.  
    {
  2.  
    test: /\.js$/,
  3.  
    use: [
  4.  
    'cache-loader',
  5.  
    'thread-loader',
  6.  
    'babel-loader'
  7.  
    ],
  8.  
    }

03、Hot update 热更新

当我们在项目中修改一个文件时,Webpack 默认会重新构建整个项目,但这并不是必须的。我们只需要重新编译这个文件,效率更高,这种策略称为Hot update。

Webpack 内置了Hot update插件,我们只需要在配置中开启Hot update即可。
 

  1.  
    // import webpack
  2.  
    const webpack = require('webpack');
  1.  
    {
  2.  
    plugins: [
  3.  
    new webpack.HotModuleReplacementPlugin()
  4.  
    ],
  1.  
    devServer: {
  2.  
    hot: true
  3.  
    }

04、exclude & include

在我们的项目中,一些文件和文件夹永远不需要参与构建。所以我们可以在配置文件中指定这些文件,防止Webpack取回它们,从而提高编译效率。

当然,我们也可以指定一些文件需要编译。

exclude : 不需要编译的文件

include : 需要编译的文件

  1.  
    {
  2.  
    test: /\.js$/,
  3.  
     
  4.  
    include: path.resolve(__dirname, '../src'),
  5.  
     
  6.  
    exclude: /node_modules/,
  7.  
    use: [
  8.  
    'babel-loader'
  9.  
    ]
  10.  
    }

减小打包文件的大小

05、缩小 CSS 代码

css-minimizer-webpack-plugin 可以压缩和去重 CSS 代码。

安装:npm i css-minimizer-webpack-plugin -D

配置:

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
  1.  
    optimization: {
  2.  
    minimizer: [
  3.  
    new CssMinimizerPlugin(),
  4.  
    ],
  5.  
    }

06、缩小 JavaScript 代码

terser-webpack-plugin 可以压缩和去重 JavaScript 代码。

npm i terser-webpack-plugin -D

  1.  
    const TerserPlugin = require('terser-webpack-plugin')
  2.  
    optimization: {
  3.  
    minimizer: [
  4.  
    new CssMinimizerPlugin(),
  5.  
    new TerserPlugin({
  6.  
    terserOptions: {
  7.  
    compress: {
  8.  
    drop_console: true, // remove console statement
  9.  
    },
  10.  
    },
  11.  
    }),
  12.  
    ],
  13.  
    }

07、tree-shaking

tree-shaking 就是:只编译实际用到的代码,不编译项目中没有用到的代码。

在 Webpack5 中,默认情况下会启用 tree-shaking。我们只需要确保在最终编译时使用生产模式。

  1.  
    module.exports = {
  2.  
    mode: 'production'
  3.  
    }

08、source-map

当我们的代码出现bug时,source-map可以帮助我们快速定位到源代码的位置。但是这个文件很大。

为了平衡性能和准确性,我们应该:在开发模式下生成更准确(但更大)的 source-map;在生产模式下生成更小(但不那么准确)的源映射。

开发模式:

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

生产模式:

  1.  
    module.exports = {
  2.  
    mode: 'production',
  3.  
    devtool: 'nosources-source-map'
  4.  
    }

09、Bundle Analyzer

我们可以使用 webpack-bundle-analyzer 来查看打包后的 bundle 文件的体积,然后进行相应的体积优化。

安装:npm i webpack-bundle-analyzer -D

  1.  
    const {
  2.  
    BundleAnalyzerPlugin
  3.  
    } = require('webpack-bundle-analyzer')
  4.  
    // config
  5.  
    plugins: [
  6.  
    new BundleAnalyzerPlugin(),
  7.  
    ]

改善用户体验

10、模块延迟加载

如果模块没有延迟加载,整个项目的代码会被打包成一个js文件,导致单个js文件体积非常大。那么当用户请求网页时,首屏的加载时间会更长。

使用模块懒加载后,大js文件会被分割成多个小js文件,加载时网页按需加载,大大提高了首屏的加载速度。

要启用延迟加载,我们只需要编写如下代码:
 缓存路由

  1.  
    // src/router/index.js
  2.  
    const routes = [
  3.  
    {
  4.  
    path: '/login',
  5.  
    name: 'login',
  6.  
    component: login
  7.  
    },
  8.  
    {
  9.  
    path: '/home',
  10.  
    name: 'home',
  11.  
    // lazy-load
  12.  
    component: () => import('../views/home/home.vue'),
  13.  
    },
  14.  
    ]
学新通

11、压缩包

Gzip是一种常用的文件压缩算法,可以提高传输效率。但是,此功能需要后端配合。

安装:npm i compression-webpack-plugin -D

配置:const CompressionPlugin = require('compression-webpack-plugin')

  1.  
    // config
  2.  
    plugins: [
  3.  
     
  4.  
    // gzip
  5.  
    new CompressionPlugin({
  6.  
    algorithm: 'gzip',
  7.  
    threshold: 10240,
  8.  
    minRatio: 0.8
  9.  
    })
  10.  
    ]

12、base64

对于一些小图片,可以转成base64编码,这样可以减少用户的HTTP请求次数,提升用户体验。url-loader 在 webpack5 中已被弃用,我们可以使用 assets-module 代替。

配置:

  1.  
    {
  2.  
    test: /\.(png|jpe?g|gif|svg|webp)$/,
  3.  
    type: 'asset',
  4.  
    parser: {
  5.  
    // Conditions for converting to base64
  6.  
    dataUrlCondition: {
  7.  
    maxSize: 25 * 1024, // 25kb
  8.  
    }
  9.  
    },
  10.  
    generator: {
  11.  
    filename: 'images/[contenthash][ext][query]',
  12.  
    },
  13.  
    },

最后,我们可以通过以下这张思维导图来总结。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiaegbh
系列文章
更多 icon
同类精品
更多 icon
继续加载