webpack性能优化策略

1. 代码分割(Code Splitting)

通过代码分割,可以将代码拆分成多个较小的文件,实现按需加载,减少首屏加载时间。使用 SplitChunksPlugin 将公共代码提取到单独的 chunk 中,避免重复打包。

  config.optimization.splitChunks({
        chunks: 'all',
        cacheGroups: {
        // 第三方组件
          libs: {
            name: 'chunk-libs',
            test: /[\\/]node_modules[\\/]/, //符合组的要求就给构建venders
            priority: 10, //priority:优先级:数字越大优先级越高,因为默认值为0,所以自定义的一般是负数形式,决定cacheGroups中相同条件下每个组执行的优先顺序。

            chunks: 'initial', // 仅限于最初依赖的第三方
          },
          elementUI: {
            name: 'chunk-elementUI', // 将elementUI拆分为单个包
            priority: 20,  // 重量需要大于libs和app,否则将打包到libs或app中
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // 为了适应cnpm
          },
          commons: {
            name: 'chunk-commons',
            test: resolve('src/components'), // 可以自定义规则
            minChunks: 3, //  最小公共数
            priority: 5,
            reuseExistingChunk: true, //当前的chunk如果包含了从main里面分离出来的模块,则重用这个模块,这样的问题是会影响chunk的名称。

          },
        },
      })

2. 压缩代码

使用 terser-webpack-plugin 压缩 JavaScript 代码,使用 css-minimizer-webpack-plugin 压缩 CSS 代码。

npm install terser-webpack-plugin css-minimizer-webpack-plugin --save-dev
// webpack.config.js
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

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

3. 移除无用代码(Tree Shaking)

Tree Shaking 可以移除代码中未使用的部分,减少打包体积。确保你的代码使用 ES6 模块语法,并且在 package.json 中设置 "sideEffects": false

// package.json
{
  "sideEffects": false
}

4.使用 IgnorePlugin 忽略不必要的模块

如果你使用了某些库(如 Moment.js),但不需要其所有语言包,可以使用 IgnorePlugin 忽略这些模块。

new webpack.IgnorePlugin({
  resourceRegExp: /^\.\/locale$/,
  contextRegExp: /moment$/
})

5.优化 Source Map

在生产环境中,使用 cheap-module-source-map 或 source-map 来生成 Source Map,但要注意它们对构建性能的影响。

  // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
  productionSourceMap: false,

6.多进程打包

使用 thread-loader 可以开启多进程打包,加快打包速度。

npm install thread-loader --save-dev
// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          'thread-loader',
          'babel-loader'
        ],
        exclude: /node_modules/
      }
    ]
  }
};

7.使用 externals 排除外部依赖

如果你使用了 CDN 或其他方式引入外部库(如 jQuery),可以通过 externals 排除这些依赖,减少打包体积。

externals: {
  jquery: 'jQuery'
}

8.排除不必要的文件

在 module.rules 中使用 exclude 选项排除不需要处理的文件,减少 Webpack 的处理负担。

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  }
};

9.优化图片和字体文件

  • 使用 url-loader 或 file-loader 处理图片和字体文件,并设置合适的 limit 值。

  • 使用 image-webpack-loader 压缩图片。

 

10.优化 babel-loader 配置

使用 include 和 exclude 来限制 babel-loader 的处理范围。

module: {
  rules: [
    {
      test: /\.js$/,
      include: path.resolve(__dirname, 'src'),
      exclude: /node_modules/,
      use: 'babel-loader'
    }
  ]
}

11.使用 esbuild-loader 替代 babel-loader

esbuild-loader 是一个基于 esbuild 的 loader,编译速度比 babel-loader 快很多。

module: {
  rules: [
    {
      test: /\.js$/,
      loader: 'esbuild-loader',
      options: {
        loader: 'jsx',  // 如果需要支持 JSX
        target: 'es2015'  // 编译目标
      }
    }
  ]
}

 

总结

Webpack 性能优化涉及多个方面,包括减少文件搜索范围、代码分割、缓存、并行构建、Tree Shaking、压缩代码等。根据项目的具体情况,选择合适的优化策略,可以显著提升构建速度和减少打包体积。

 

Webpack是一个现代化的前端打包工具,它可以将多个模块打包成一个或多个静态资源文件。在项目开发过程中,随着代码规模的增大,Webpack性能优化变得尤为重要。以下是一些Webpack性能优化的方法: 1. 减少打包文件体积: - 使用Tree Shaking:通过ES6模块的静态分析,去除未使用的代码,减少打包文件体积。 - 使用Code Splitting:将代码拆分成多个小块,按需加载,减少初始加载时间。 - 压缩代码:使用UglifyJS等工具对代码进行压缩,减小文件体积。 2. 加快构建速度: - 使用缓存:通过配置缓存选项,将构建过程中的中间结果缓存起来,加快下次构建速度。 - 多进程/多实例构建:使用工具如HappyPack或thread-loader,将任务分解到多个子进程或实例中并行处理,提高构建速度。 - 使用DllPlugin:将第三方库等不经常变动的模块提前打包成静态资源,减少每次构建的时间。 3. 优化文件加载: - 使用CDN:将静态资源部署到CDN上,加快文件加载速度。 - 使用缓存策略:配置合适的缓存策略,使浏览器能够缓存静态资源,减少重复加载。 - 按需加载:使用动态import或异步组件等方式,按需加载模块,减少初始加载时间。 4. 配置优化: - 减少不必要的插件和loader:只加载必要的插件和loader,减少构建过程中的处理时间。 - 使用resolve.alias:配置别名,减少模块查找时间。 - 使用externals:将一些不需要打包的模块通过externals配置引入,减小打包体积。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值