webpack构建速度和体积优化策略

webpack构建速度和体积优化策略

初级分析:使用webpack内置的stats

stats:构建的统计信息

package.json中使用stats

"scripts":{
	"build:stats":"webpack --env production --json > stats.json"
}
速度分析:使用speed-measure-webpack-plugin

代码示例

const SpeedMeasurePlugin = require('speed-measure-webpack-plugin')
const smp = new SpeedMeasurePlugin()
const webpackConfig = smp.wrap({
	plugin:[
		new MyPlugin(),
		new MyOtherPlugin()
	]
})

可以看到每个loader和插件执行耗时

npm i --save-dev speed-measure-webpack-plugin

webpack-bundle-analyzer分析体积

代码示例

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
module.exports = {
	plugins:{
		new BundleAnalyzerPlugin()
	}
}
可以分析那些问题

依赖的第三方模块文件大小

业务里面的组件代码大小

使用webpack4:优化原因

v8带来的优化(for of 替代 forEach Map Set 替代 Object includes 替代 indexOf

默认使用更快的 md4 hash算法

webpack AST可以直接从loader传递给AST,减少解析时间

使用字符串方法替代正则表达式

多进程 / 多实例构建:资源并行解析可选方案

thread-loader

  • 可选方案
    • parallel-webpack
    • HappyPack
多进程 / 多实例 : 并行压缩

方法一:使用parallel-uglify-webpack插件

const ParallelUglifyWebpack = require('parallel-uglify-webpack')
module.exports = {
	plugins : [
		new ParallelUglifyWebpack({
			uglifyJS :{
				output:{
					beaytify:false,
					comments:false,
				},
				compress :{
					warnings :false,
					drop_console:true,
					collapse_vars :true,
					reduce_vars:true
				}
			}
		})
	]
}
分包:设置Externals

思路:将reactreeact-dom基础包通过cdn引入,不打入bundle

方法:使用html-webpack-externals-plugin

进一步分包:预编译资源模块

思路:将reactreact-domreduxreact-redux等基础包和业务基础包打包成一个文件

方法:使用DLLPlugin进行分包,DllReferencePluginmanifest.json引用

使用DllPlugin进行分包
使用DllReferencePlugin引用manifest.json

webpack.config.js引入

module.exports = {
	plugins:[
		new webpack.DllRederencePlugin({
			manifest: require('./build/library/manifest.json')
		})
	]
}
缓存

目的:提升二次构建速度

缓存思路
  • babel-loader开启缓存
  • terser-webpack-plugin开启缓存
  • 使用cache-loader或者 hard-source-webpack-plugin
缩小构建目标

目的:尽可能得少构建模块

比如babel-loader不解析node_modules

module.exports = {
	rules :{
		test:/\.js$/,
		loader:'happypack/loader',
		excluder:'node_modules'
	}
}
减少文件搜索范围

优化 resolve.modules配置(减少模块搜索层级)

优化resolve.mainFields配置

优化resolve.extensions配置

合理使用alias

module.exports = {
	resolve :{
		alias:{
			react:path.resolve(__dirname,'./node_modules/react/dist/react.min.js'),
		},
		modules:[path.resolve(__dirname,'node_modules')],
		extensions:['.js'],
		mainFields:['main']
	}
}
图片压缩

要求:基于Node库的imagemin或者tinypng API

使用:配置image-webpack-loader

Imagemin的优点分析

有很多定制选项

可以引入更多第三方优化插件,例如pngquant

可以处理多种图片格式

使用TreeShaking擦除无用的的css

PurifyCSS:遍历代码,识别已经用到的CSS class

uncss:HTML需要通过jsdom加载,所有的样式通过PostCSS解析,通过documnet.querySelector来识别在html文件里面不存在的选择器

webpack中如何使用PurifyCSS

使用 purgecss-webpack-plugin 以及和min-css-extract-pugin配合使用

构建体积优化:动态Polyfill

polyfill-service

  • 优点:只给用户返回需要的Polyfill,社区维护
  • 缺点:部分浏览器UA可能无法识别(但是可以降级返回所需全部Polyfill
Polyfill Service原理

识别User Agent,下发不同的Polyfill

性能优化策略
渲染优化
  • 首页、列表页、详情页采用SSR或者Native渲染
  • 个人中心页预渲染
弱网优化
  • 使用离线包,PWA等离线缓存技术
Webview优化
  • 打开Webview的同时并行的加载页面数据
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值