javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > Webpack打包优化体积

优化Webpack打包后文件的体积

作者:北辰alk

Webpack打包文件体积过大是前端开发中常见的问题,过大的打包文件会导致应用加载缓慢,影响用户体验本文主要介绍了优化Webpack打包后文件的体积,具有一定的参考价值,感兴趣的可以了解一下

Webpack 打包文件体积过大是前端开发中常见的问题,过大的打包文件会导致应用加载缓慢,影响用户体验。下面我将详细介绍多种优化 Webpack 打包体积的有效方法。

一、基础优化策略

1.1 使用生产模式

module.exports = {
  mode: 'production' // 自动启用各种优化
};

生产模式默认开启的优化

1.2 启用代码压缩

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        parallel: true, // 启用多线程
        terserOptions: {
          compress: {
            drop_console: true, // 移除console
            pure_funcs: ['console.log'] // 只移除console.log
          }
        }
      })
    ]
  }
};

二、JavaScript 优化

2.1 Tree Shaking

必要条件

// package.json
{
  "sideEffects": false
  // 或指定有副作用的文件
  "sideEffects": [
    "*.css",
    "*.scss"
  ]
}

2.2 作用域提升(Scope Hoisting)

module.exports = {
  optimization: {
    concatenateModules: true
  }
};

2.3 按需加载

// 动态导入
const loadModule = () => import('./heavy-module');

// React lazy
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));

三、CSS 优化

3.1 提取 CSS 到单独文件

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css'
    })
  ],
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader, 'css-loader']
      }
    ]
  }
};

3.2 压缩 CSS

const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

module.exports = {
  optimization: {
    minimizer: [
      new CssMinimizerPlugin()
    ]
  }
};

3.3 移除未使用的 CSS

const PurgeCSSPlugin = require('purgecss-webpack-plugin');
const glob = require('glob');

module.exports = {
  plugins: [
    new PurgeCSSPlugin({
      paths: glob.sync(`${path.join(__dirname, 'src')}/**/*`, { nodir: true })
    })
  ]
};

四、图像和字体优化

4.1 图像压缩

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif|svg)$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: '[name].[contenthash].[ext]',
              outputPath: 'images'
            }
          },
          {
            loader: 'image-webpack-loader',
            options: {
              mozjpeg: { quality: 65 },
              pngquant: { quality: [0.65, 0.90] }
            }
          }
        ]
      }
    ]
  }
};

4.2 使用 WebP 格式

// 配合 imagemin-webp-webpack-plugin
const ImageminWebpWebpackPlugin = require('imagemin-webp-webpack-plugin');

module.exports = {
  plugins: [
    new ImageminWebpWebpackPlugin({
      config: [{
        test: /\.(jpe?g|png)/,
        options: { quality: 75 }
      }]
    })
  ]
};

五、第三方库优化

5.1 按需引入

// 错误 - 全量引入
import lodash from 'lodash';

// 正确 - 按需引入
import isEmpty from 'lodash/isEmpty';

5.2 使用更小的替代库

5.3 使用 CDN 加载

module.exports = {
  externals: {
    react: 'React',
    'react-dom': 'ReactDOM'
  }
};

然后在 HTML 中引入 CDN 链接。

六、高级优化技巧

6.1 代码分割

module.exports = {
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
  }
};

6.2 长缓存优化

module.exports = {
  output: {
    filename: '[name].[contenthash].js',
    chunkFilename: '[name].[contenthash].js'
  },
  optimization: {
    moduleIds: 'deterministic',
    runtimeChunk: 'single'
  }
};

6.3 使用 Webpack Bundle Analyzer 分析

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  plugins: [
    new BundleAnalyzerPlugin()
  ]
};

七、Webpack 5 新特性

7.1 持久化缓存

module.exports = {
  cache: {
    type: 'filesystem'
  }
};

7.2 资源模块

module.exports = {
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif|svg)$/,
        type: 'asset',
        parser: {
          dataUrlCondition: {
            maxSize: 8 * 1024 // 8kb
          }
        }
      }
    ]
  }
};

八、实战优化配置示例

const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash:8].js',
    chunkFilename: '[name].[contenthash:8].chunk.js'
  },
  optimization: {
    moduleIds: 'deterministic',
    runtimeChunk: 'single',
    minimizer: [
      new TerserPlugin({
        parallel: true,
        extractComments: false
      }),
      new CssMinimizerPlugin()
    ],
    splitChunks: {
      chunks: 'all',
      maxSize: 244 * 1024,
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          priority: -10
        },
        commons: {
          name: 'commons',
          minChunks: 2,
          priority: -20
        }
      }
    }
  },
  plugins: [
    new CleanWebpackPlugin(),
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash:8].css',
      chunkFilename: '[name].[contenthash:8].chunk.css'
    }),
    new BundleAnalyzerPlugin({
      analyzerMode: 'static',
      openAnalyzer: false
    })
  ]
};

总结

优化 Webpack 打包体积需要综合运用多种策略:

建议按照以下步骤实施优化:

通过以上方法,通常可以将打包体积减少 30%-70%,显著提升应用加载速度。

到此这篇关于优化Webpack打包后文件的体积的文章就介绍到这了,更多相关Webpack打包优化体积内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文