vue-cli+webpack4项目打包速度优化

优化前构建速度大约178s左右

分析工具

speed-measure-webpack-plugin

通过smp输出的分析可以清楚的了解到webpack构建过程中,每一阶段的loader以及plugin的工作花费的时间。

使用: yarn add -D speed-measure-webpack-plugin

const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');

const smp = new SpeedMeasurePlugin();

configureWebpack: smp.wrap({})

缩小文件检索解析范围

为避免无用的检索与递归遍历,可以使用alias指定引用时候的模块,noParse,对不依赖本地代码的第三方依赖不进行解析。

// 定义getAliasPath方法,把相对路径转换成绝对路径

js 复制代码
const getAliasPath = dir => join(__dirname, dir)
module.exports = {
	 
  chainWebpack: config => {
    // 添加别名
    config.resolve.alias
      .set('@', getAliasPath('src'))
      .set('assets', getAliasPath('src/assets'))
      .set('utils', getAliasPath('src/utils'))
      .set('views', getAliasPath('src/views'))
      .set('components', getAliasPath('src/components'))
	}
  
}

splitChunks 分割代码

split-chunks-plugin webpack

  • chunks: 表示哪些代码需要优化,有三个可选值:initial(初始块)、async(按需加载块)、all(全部块),默认为async

  • minSize: 表示在压缩前的最小模块大小,默认为30000

  • minChunks: 表示被引用次数,默认为1

  • maxAsyncRequests: 按需加载时候最大的并行请求数,默认为5

  • maxInitialRequests: 一个入口最大的并行请求数,默认为3

  • automaticNameDelimiter: 命名连接符

  • name: 拆分出来块的名字,默认由块名和hash值自动生成

  • cacheGroups: 缓存组。缓存组的属性除上面所有属性外,还有test, priority, reuseExistingChunk

    • test: 用于控制哪些模块被这个缓存组匹配到

    • priority: 缓存组打包的先后优先级

    • reuseExistingChunk: 如果当前代码块包含的模块已经有了,就不在产生一个新的代码块

js 复制代码
 optimization: {
      runtimeChunk: 'single',
      splitChunks: {
        chunks: 'all', // 表示哪些代码需要优化,有三个可选值:initial(初始块)、async(按需加载块)、all(全部块),默认为async
        maxInitialRequests: Infinity, // 按需加载时候最大的并行请求数,默认为5
        minSize: 30000, // 依赖包超过300000bit将被单独打包
        // 缓存组
        // priority: 缓存组打包的先后优先级
        // minChunks: 表示被引用次数,默认为1
        cacheGroups: {
          //公共模块
          commons: {
            name: 'chunk-commons',
            test: getAliasPath('src'), // can customize your rules
            minSize: 100, //大小超过100个字节
            minChunks: 3, //  minimum common number
            priority: 5,
            reuseExistingChunk: true,
          },
          // 第三方库
          libs: {
            name: 'chunk-libs',
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: 'initial', // only package third parties that are initially dependent
            reuseExistingChunk: true,
            enforce: true,
          },
          echarts: {
            name: 'chunk-echarts',
            test: /[\\/]node_modules[\\/]echarts[\\/]/,
            chunks: 'all',
            priority: 12,
            reuseExistingChunk: true,
            enforce: true,
          },
        },
      },
    },

compression-webpack-plugin gzip打包

js 复制代码
 chainWebpack: config => {
    
    config
      .plugin('CompressionWebpackPlugin')
      .use(require('compression-webpack-plugin'), [
        {
          filename: '[path].gz[query]',
          algorithm: 'gzip',
          test: new RegExp('\\.(js|json|css)$'),
          threshold: 10240, // 资源文件大于10240B=10kB时会被压缩
          minRatio: 0.8, // 最小压缩比达到0.8时才会被压缩
          // deleteOriginalAssets: true // 删除原文件
        },
      ])
      .end();
    // if prod is on
    // assets require on cdn
  },

happypack

js 复制代码
const HappyPack = require('happypack');
const os = require('os');
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
 configureWebpack:  smp.wrap({
  plugins: [
      

      new HappyPack({
        id: 'happybabel',
        loaders: ['babel-loader'],
        threadPool: happyThreadPool,
      }),
      
    ],
    })

总结

这次优化主要是针对打包速度的优化,大概提高打包速度20%,后续还好继续再打包体积上面进行优化。

相关推荐
天天扭码2 分钟前
JavaScript 中字符串转字符数组的两种优雅方式
前端·javascript·代码规范
何遇er5 分钟前
在 AI 编程的热潮下对低代码的思考
前端·低代码·ai编程
何遇er8 分钟前
一句 Prompt 自动生成表单:我在低代码平台里是怎么接入生成式 AI 的
前端·低代码·ai编程
_一条咸鱼_9 分钟前
Vue 指令模块深度剖析:从基础应用到源码级解析(十二)
前端·javascript·面试
薯条不要番茄酱17 分钟前
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
java·前端·java-ee
只会安静敲代码的 小周38 分钟前
uniapp上传图片时(可选微信头像、相册、拍照)
前端·微信·uni-app
kovlistudio1 小时前
红宝书第四十六讲:Node.js基础与API设计解析
前端·javascript·node.js
陈哥聊测试1 小时前
这款自研底层框架,你说不定已经用上了
前端·后端·开源
蘑菇头爱平底锅1 小时前
数字孪生-DTS-孪创城市-低空范围
前端·javascript·数据可视化
KenXu1 小时前
Module Federation v0.12新特征详解
前端