webpack常见优化方法

1. Webpack 的主要作用

  1. 模块打包
  • 将各种资源(JS、CSS、图片等)视为模块
  • 把所有模块打包成少量的静态资源文件
  • 代码转换
  • 将 ES6+ 转换为 ES5
  • 将 SCSS/LESS 转换为 CSS
  • 将 TypeScript 转换为 JavaScript
  • 文件优化
  • 压缩代码
  • 合并文件
  • 代码分割

2. 减小打包体积的方法

  • 代码分割 (Code Splitting)
复制代码
  // webpack.config.js
  module.exports = {
    optimization: {
      splitChunks: {
        chunks: 'all',
        minSize: 20000,
        minChunks: 1,
        maxAsyncRequests: 30,
        maxInitialRequests: 30,
        cacheGroups: {
          vendors: {
            test: /[\\/]node_modules[\\/]/,
            priority: -10
          },
          default: {
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true
          }
        }
      }
    }
  }
  • 压缩代码

    复制代码
    // webpack.config.js
    const TerserPlugin = require('terser-webpack-plugin');
    
    module.exports = {
      optimization: {
        minimize: true,
        minimizer: [new TerserPlugin()],
      }
    }
  • Tree Shaking(移除未使用的代码)

    复制代码
    // package.json
    {
      "sideEffects": false
    }
    
    // webpack.config.js
    module.exports = {
      mode: 'production',  // 启用 tree shaking
      optimization: {
        usedExports: true
      }
    }
  • 使用动态导入 // 代码中使用动态导入

    复制代码
    const Component = () => import('./Component.vue')
  • 压缩图片

    复制代码
    // webpack.config.js
    module.exports = {
      module: {
        rules: [
          {
            test: /\.(png|jpg|gif)$/i,
            use: [
              {
                loader: 'image-webpack-loader',
                options: {
                  mozjpeg: {
                    progressive: true,
                    quality: 65
                  }
                }
              }
            ]
          }
        ]
      }
    }
  1. 使用 gzip 压缩

    // webpack.config.js
    const CompressionPlugin = require('compression-webpack-plugin');

    module.exports = {
    plugins: [
    new CompressionPlugin({
    algorithm: 'gzip',
    test: /.js|\.css|.html$/,
    threshold: 10240,
    minRatio: 0.8
    })
    ]
    }

3. 其他优化建议

  • 分析打包大小

    复制代码
    # 使用 webpack-bundle-analyzer 分析包大小
    npm install --save-dev webpack-bundle-analyzer
  1. 优化第三方库的引入

    // 按需引入

    import { Button } from 'element-ui' // 而不是 import ElementUI from 'element-ui'

  2. 配置 externals

    // webpack.config.js

    module.exports = {

    externals: {

    复制代码
     'vue': 'Vue',
    
     'vue-router': 'VueRouter',
    
     'vuex': 'Vuex'

    }

    }

  • 使用 CDN

    复制代码
    <!-- index.html -->
    
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>

4. 实际效果监控

  • 使用 webpack-bundle-analyzer 查看打包结果

    复制代码
    // webpack.config.js
    
    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
    
    module.exports = {
    
      plugins: [
    
        new BundleAnalyzerPlugin()
    
      ]
    
    }
相关推荐
前端大卫5 分钟前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友7 分钟前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理2 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻2 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
cdming2 小时前
Node.js 解释环境变量的定义、作用及在Node.js中的重要性,区分开发、测试、生产环境配置需求。
node.js
mapbar_front3 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰3 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼984 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮4 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20024 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员