一、Webpack 优化
resolve 常用选项:
- extensions: 表示 webpack 会根据 extensions 去寻找文件后缀名
- alias: 表示设置别名
- noParse: 表示不需要解析的文件
- exclude: 是指定 loader 作用的范围,exclude 表示排除某些文件不需要对应 loader 处理
loader,plugins 优化:
- cache-loader
- webpack-parallel-uglify-plugin, uglifyjs-webpack-plugin, terser-webpack-plugin
- happypack, parallel-webpack, thread-loader
- DllPlugin,webpack.DllReferencePlugin
其他优化配置:
webpack-bundle-analyzer: 可以用可视化帮我们分析打包体积,从而来采用合适的优化方式去改进我们的 webpack 配置
speed-measure-webpack-plugin: 可以告诉我们打包时候每一个 loader 或者 plugin 花费了多少时间,从而对耗时比较长的 plugin 和 loader 做优化
friendly-errors-webpack-plugin: 可以帮我们优化打包日志
二、静态文件优化
1. 图片优化
图片格式
jpg
: 适合色彩丰富的图片、banner
图。不适合图形文字、图标(边缘有锯齿),不支持透明度png
: 社会纯色、透明、图标、支持半透明。不适合色彩丰富的图片,因为无损存储会导致存储体积大gif
: 适合动画,动的图标。不支持半透明、不适合存储色彩图片webp
: 适合半透明,可以保证图片质量和较小的体积svg
: 相比于jpg
和png
,它的体积更小。渲染成本过高,适合小且色彩单一的图标
图片优化
- 避免空
src
的图片 - 减少图片尺寸,节约用户流量
img
标签设置alt
属性,提升图片加载失败时用户体验- 原生的
loading: lazy
图片懒加载 - 不同环境下,加载不同尺寸和像素的图片
- 对于较大的图片可以考虑采用渐进式图片
- 采用
base64URL
减少图片请求 - 采用雪碧图合并图标图片等
2. HTML 优化
- 语义化
HTML
: 代码简洁清晰,利于搜索引擎,便于团队开发 - 提前声明字符编码,让浏览器快速确定如何渲染网页内容
- 减少
HTML
嵌套关系,减少 DOM 节点数量 - 删除多余空格、空行、注释、以及无用的属性等
- HTML 减少
iframe
使用 - 避免使用
table
布局
3. CSS 优化
- 减少伪类选择器、减少样式层数、减少使用通配符
- 删除空行、注释、减少无意义的单位,
css
进行压缩 - 使用外链
css
, 可以对css
进行缓存 - 添加媒体字段,只加载有效的
css
文件<link href="xxx" rel=“stylesheet” media="screen and (min-width: 1024px)">
- 减少
@import
使用,因为@import
采用的是串行加载
4. JS 优化
- 通过
async
、defer
异步加载文件 - 减少
DOM
操作,缓存访问过的元素 - 操作不直接应用
DOM
上,而应用到虚拟DOM
上。最后一次性的应用到DOM
上 - 使用
web-worker
解决程序阻塞问题 IntersectionObserver
- 虚拟滚动
virtual-scroll-list
requestAnimationFrame
、requestIdleCallback
- 尽量避免使用
eval
,消耗时间久 - 使用
事件委托
,减少事件绑定个数 - 尽量使用
canvas
动画、css
动画
三、优化策略
- 关键资源个数越多,首次页面加载时间越长
- 关键资源的大小,内容越小,下载时间越短
- 优化白屏:内联
css
和内联js
,移除文件下载,较小文件体积 - 预渲染,打包时进行预渲染
- 使用
SSR
加速首屏加载(耗费服务端资源),有利于SEO
优化