性能优化:webpack打包层面优化

面试题:项目中做过哪些 webpack 打包优化?分两类:构建速度优化 、打包产物体积优化

🚀构建速度优化(打包变快)

  1. exclude排除node_modules,不要编译第三方库,节省大量时间
  2. babel-loader 开启cacheDiretory缓存
  3. thread-loader 多线程
  4. 配置resolve的extensions缩小查找范围,配置alias别名避免向上遍历,配置modules只找本项目的node_modules
  5. dev环境下不使用terser压缩
  6. dev环境下使用cheap-source-map
  7. 合理的devtools
  8. dev环境不使用minicssextraplugin 剥离css,不contenthash

📦产物体积优化(包变小),也就是减小首屏体积的优化

  1. 分包 + contenthash 浏览器强缓存
  • 懒加载异步分包
  • splitChunks 公共模块抽离 同步分包
  • runtimeChunk:single webpack 运行时分包
  • minicssextraplugin 抽离css
  1. 压缩:js 压缩 TerserPlugin;css 压缩 CssMinimizerPlugin
  2. 资源压缩,小图片转base64,大的转文件, 或者提前压缩
  3. 第三方库按需引入,找体积合适的
  4. 生产环境tree-shanking 删除无用代码 基于ESM
  5. 通过判断环境配置生产环境excludes 大库,html里手动引入cdn
js 复制代码
// webpack.config.js
const path = require('path')
const TerserPlugin = require('terser-webpack-plugin')

const isDev = process.env.NODE_ENV === 'development'

module.exports = {
  entry: './src/main.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[contenthash].js',
    chunkFilename: '[name].[contenthash].chunk.js',
    clean: true
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        // ✅关键1:exclude排除node_modules,不要编译第三方库,节省大量时间
        exclude: /node_modules/,
        use: [
          // ✅大项目开启多线程编译,小项目不要开(线程有创建开销)
          {
            loader: 'thread-loader',
            options: { workers: 2 }
          },
          {
            loader: 'babel-loader',
            options: {
              // ✅开启babel缓存,二次构建复用缓存,不用重复编译
              cacheDirectory: true
            }
          }
        ]
      },
      {
        test: /\.css$/,
        use: isDev ? ['style-loader', 'css-loader'] : ['mini-css-extract-plugin.loader', 'css-loader']
      }
    ]
  },
  resolve: {
    // ✅减少后缀尝试的数量,加快模块查找
    extensions: ['.js', '.vue'],
    // ✅别名,减少向上递归查找文件
    alias: {
      '@': path.resolve(__dirname, './src')
    }
  },
  // ✅开发环境用快的source‑map,不要完整源码映射
  devtool: isDev ? 'cheap-module-eval-source-map' : 'source-map',
  optimization: {
    // 生产才压缩,开发关闭压缩,极大提升dev启动速度
    minimizer: isDev ? [] : [new TerserPlugin()],
    splitChunks: { chunks: 'all' },
    runtimeChunk: 'single'
  }
}
相关推荐
fruge7 小时前
SSH、RDP、VNC不必各开一个客户端:Next Terminal用Web入口统一管理远程资产和会话记录
运维·前端·ssh
honkun67 小时前
vue 下拉树组件 vxe-table-select 实现分页多选
前端·javascript·vue.js
用户621007587027 小时前
Web BIM 开发实践:如何将构件选择、属性查询接入业务系统?
前端
羲云7 小时前
AI 分站搭完就能发链接?上线前先过这 5 关
前端
葡萄城技术团队7 小时前
一个 F4 快捷键,为什么能决定 Web 表格是否像 Excel?
前端
王川7087 小时前
商协会后台前端的模块聚合实践
前端·后端
jerrywus7 小时前
Codex、Claude Code、DSH 怎么用手机管?我试了试 Agents Anywhere
前端·claude·deepseek
twj_5028 小时前
农业商业计划书PPT制作完全指南
前端
门思科技8 小时前
ThinkLink Edge 本地部署实战:数据不出厂区,从硬件选型到与云端双向迁移
前端