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%,后续还好继续再打包体积上面进行优化。

相关推荐
Sterting15 分钟前
Element-Plus 入门与整体布局
前端·vue.js·elementui
程序员黑豆7 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊8 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端
油丶酸萝卜别吃8 小时前
前端转全栈学习路线
前端·学习
浮生望8 小时前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry9 小时前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术11 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队11 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_4316004412 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
kyriewen13 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程