赞
踩
减少http请求,合并js,css,合理内嵌css,js。
合理设置服务端缓存,提高服务器处理速度
// 强缓存 Cache-Control/Expires 协商缓存 服务器设置Etag/Last-Modified,请求携带验证体:if-none-match/if-modified-since(304)
避免重定向,重定向会降低响应速度(301, 302)
使用dns-prefetch,进行dns预解析
采用域名分片技术,将资源放到不同的域名之中,解决同一个域名最多处理6个TCP连接的问题
采用CND加快访问速度(指派最近,高度可用)
gzip压缩优化,对传输资源进行体积压缩(html,js,css),
webpack对一些图片,css等文件使用contentHash命名,然后配合缓存,只要内容不变,就可以一直使用缓存。
加载数据优先级:preload(预先请求当前页面所需要的资源) prefetch(将来页面中使用的资源)将资源缓存到HTTP缓存中,只会在当前页面空闲的时候才会去请求。(首页的内容都是preload,子页的都是prefetch)
<link rel='preload' href='style.css'></link>
js(触发视觉变化) => 样式计算 => 布局(重排) => 绘制(重绘) => 合成
js强制将计算样式和布局操作提前到当前的任务中。如
<div id="app"></div>
<script>
function reflow(){
let el = document.getElementById('app')
let node = document.createElement('h1')
node.innerHTML = 'heelo'
el.appendChild(node)
}
window.addEventListener('load',reflow)
</script>
可以看到,我们在load的时候,加了一个h1元素。
他会先执行js ,然后重新进行样式计算,再布局,再绘制,最后合成。
但是如果我们在js里面读取了一个元素的信息,我们知道读取元素信息会导致重排,也就是布局。看
function reflow(){
let el = document.getElementById('app')
let node = document.createElement('h1')
node.innerHTML = 'heelo'
el.appendChild(node)
// 强制同步布局问题
console.log(el.offsetTop);
}
如图,他会将计算样式和布局操作提前到当前的任务中,也就是所说的强制同步布局样式问题,再操作js的同时还会花费时间去进行一个重排。本来重拍操作是应该在js执行完毕后执行的。如果多次获取元素信息,那么会导致不断地布局,那就会导致布局抖动,导致卡顿。
避免空src的图片
减小图片尺寸,节约用户流量
img标签设置alt属性,提升图片加载失败时用户体验
原生的loading:lazy,图片懒加载(进入可视区域才会加载) !!
<img loading="lazy" width="xx" height="xx" ...../>
不同环境下,使用不同尺寸和像素的图片
<img src="xx" sizes="(max-width: 500px) 100px, (max-width: 600px) 200px"
对于较大图片,考虑采用渐进式图片
小图片采用base64减少图片请求
采用雪碧图合并图标图片等。
减少使用伪类选择器,减少样式层数,减少使用通配符
避免使用css表达式,css表达式会频繁求值,当滚动页面,或者移动鼠标都会重新计算。
删除空行,注释,减少无意义的单位,css压缩 !!
使用外链css,可以对css进行缓存 !!
添加媒体字段,只加载有效的css文件
css contain属性,将元素进行隔离
减少@mimport使用,因为@import采用的是串行加载 !!
通过script的asynce和defer异步加载文件 !!
普通的script,hmtl解析到之后会停止解析html,去请求js文件,然后执行,执行完后才会继续解析html
defer属性的script,html解析到的时候会并行请求文件,然后等html解析完毕后,才会执行
async属性的script,Html解析到的时候会并行请求文件,然后文件回来之后,会停止解析html,执行js,等js执行完毕之后才会继续解析html
减少DOM操作,缓存访问过的元素 !!
操作不直接应用到DOM上,而是应用到虚拟DOM,最后一次性应用到DOM上 !!
使用webworker解决阻塞问题
IntersectionObserver(observer api)(监控滚动图片,图片到达可视区域才去赋值src属性,才会去真正请求,延迟加载) !!
虚拟滚动 vertual-scroll-list
requestAnimationFrame(布局前触发), requestIdleCallback(当前浏览器这一陣绘制完页面后如果还有时间,就触发)
如果设置setImeout等定时器,可能跟浏览器不同步,就可能出现一幀里面出现两次js执行,但是那一帧后面只会渲染一次,就会导致看起来好像丢了一次定时器的操作,不够友好。
而使用requestAnimationFrame,就可以保证每一帧都会执行一次js,执行频率就会比较稳定。
不用使用eval 和with
使用事件委托,减少事件绑定个数
尽量使用canvas动画,css动画,避免重排。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVDMjayw-1645665713772)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220224085900025.png)]
FOUT: (Flash Of Unstyled Text)等待一段时间,如果没有加载完成,先显示默认,加载后进行切换。
FOIT: (Flash Of Invisible Text) 字体加载完毕后显示,加载超时降级系统字体。
cookie; cookie过期时间内有效,限制字段个数,不适合大数据存储,每次请求会携带cookie,可以做身份检查。
localstorage/sessionstroage
indexDB(浏览器的数据库)
npm i lighthouse -g
lighthouse --view http://xxxx
就会有一个网站的报告。还会给你一些建议
可以根据建议进行一个改动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。