webpack性能优化


以提升团队开发效率,提升用户体验为目的

优化方案

  • 使用 多线程优化构建速度
  • 使用 分包减少构建文件体积
  • 减少构建构建目标提升构建速度

诊断方法

1.构建速度(开发效率)
  • 使用 speed-measure-webpack-plugin 解析打包速度
  • 显示每个loder和plugin执行时间,会将耗时长的红色标记出来
  • 插件地址
//安装 npm i speed-measure-webpack-plugin -D
const SpeedMeasurePlugin = require("speed-measure-webpack-plugin");
const smp = new SpeedMeasurePlugin()
smp.wrap(webpackConfig)
2构建体积(用户体验)
  • 使用 webpack-bundle-analyzer 解析打包后文件体积
  • 文件大小可视化,找出错误引入的模块 ,可以生成解析文件,方便优化对比
  • 插件地址
//安装 npm i webpack-bundle-analyzer -D
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
  plugins: [
    new BundleAnalyzerPlugin()
  ]
}

方案

1.构建性能优化之多进程
  • 使用 thread-loader 解析打包速度
  • js 为单线程 使用hread-loader可以开启多个进程并发处理任务
  • 使用时应该将其放在其他loader前
  • 开启进程也会耗时,请仅在耗时操作中使用此loader
  • 运行在worker中的loader限制 1.不能生成新的文件,2.不能使用自定义的loader API,3.不能获取webpack的配置
  • 插件地址
//安装 npm install --save-dev thread-loader
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        include: path.resolve('src'),
        use: [
          "thread-loader",
          // 耗时的 loader (例如 babel-loader)
        ],
      },
    ],
  },
};
2.分包和模板的自动引用
  • 在打包中经常会出现单个文件较大的情况,又偏偏是网页最先加载的文件,会使得加载时间过长白屏,
  • 分包就是把变化几率很小的三方库分离出来,提前打包好使用DllPlugin进行分包
  • 目的就是降低单个文件大小,将三方库分离出来

分包实现步骤

  • 1.分包:定义webpack.dll.config.js,使用DllPlugin 配置分包
  • 2.排除分包:在config.js中使用DllReferencePlugin 引用manifest文件排除分包
  • 3.引用dll:使用add-asset-html-webpack-plugin引用分包文件
//第一步 在根目录生成分包的webpack分包的配置文件
//列build文件夹下webpack.dll.config.js文件
const path=require('path')
const webpack=require('webpack')
module.exports = {
mode:"production",
entry:{
	vue:['vue','vuex','vue-router']
},
output:{
	path:path.resolve(__dirname,'../dll'),
	filename:'[name].dll.js',
	library:'[name]_[hash]'
	},
plugins:[
	new webpack.DllPlugin({
	path:path.resolve(__dirname,'../dll','[name]-manifest.json'),
	name:'[name]_[hash]'
	})
]  
}

//第二步  在package.json文件生成分包命令  列“build-dll”:“webpack --config build/webpack.dll.config.js”
//第三步在webpack.config文件中 排除分包过的文件
const path=require('path')
const webpack=require('webpack')
module.exports = {
  plugins: [
    new webpack.DllReferencePlugin({
     context: __dirname,
     manifest:path.resolve(__dirname,.dll/vue-manifest.json”)
    })
  ]
}

模板的自动引用

  • SpeedMeasurePlugin 会与AddAssetHtmlPlugin冲突,使用的时候将其disable 设置为true
  • 打包完自动引用的路径为绝对路径可以将publicPact设置为'./'
const AddAssetHtmlPlugin=require('add-asset-html-webpack-plugin')
module.exports = {
  plugins: [
    new webpack.DllReferencePlugin({
     context: __dirname,
     manifest:path.resolve(__dirname,.dll/vue-manifest.json”)
    }),
    new AddAssetHtmlPlugin({
    filefath:path.resolve(__dirname,.dll/vue.dll.js”)
    })
  ]
}
3.通过缓存提升打包性能
const path=require('path')
const webpack=require('webpack')
module.exports = {
  cache: {
    type: 'filesystem',
    allowCollectingMemory: true,
  },
};
4 .压缩图片大小
  • 设计师提供的图片较大会影响用户的访问性能

  • 插件地址

//安装 npm install -D image-webpack-loader
rules: [{
  test: /\.(gif|png|jpe?g|svg)$/i,
  use: [
  //  'file-loader',
    {
      loader: 'image-webpack-loader',
      options: {
        bypassOnDebug: true, // webpack@1.x
        disable: true, // webpack@2.x and newer
      },
    },
  ],
}]
5.优化css体积
  • 在大型项目中经常会有很多样式在代码中为被使用但是也会被打包,通过purgecss-webpack-plugin

  • 插件地址

//安装 npm i purgecss-webpack-plugin -D
const glob = require("glob");
const { PurgeCSSPlugin } = require("purgecss-webpack-plugin");
module.exports = {
  plugins: [
    new PurgeCSSPlugin({
      paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }),
    })
  ]
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值