有没有做过性能优化,怎么性能优化(具体措施有哪些),怎么确定要从什么方面优化
传输数据时间优化
页面加载时间优化
怎么确定首屏加载时间
- 设置缓存,浏览器缓存,http缓存,cdn缓存,nginx缓存等
- 压缩代码(css,js,html)
- 使用gzip(nginx设置)
- dns预解析
<link rel='dns-prefetch' href='#'>
(不能滥用,对多页面使用dns预解析,会增加dns查询数) - 优化代码(合理的拆分代码),减少dom操作(合理布局,减少重绘和回流)与优化js逻辑, (例如使用vnode,代码解耦)
1)使用 translate 替代 top
2)使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局)
3)把 DOM 离线后修改,比如:先把 DOM 给 display:none (有一次 Reflow),然后你修改100次,然后再把它显示出来
4)不要把 DOM 结点的属性值放在一个循环里当成循环里的变量
for(let i = 0; i < 1000; i++) {
// 获取 offsetTop 会导致回流,因为需要去获取正确的值
console.log(document.querySelector('.test').style.offsetTop)
}
5)不要使用 table 布局,可能很小的一个小改动会造成整个 table 的重新布局
6)动画实现的速度的选择,动画速度越快,回流次数越多,也可以选择使用 requestAnimationFrame
7)CSS 选择符从右往左匹配查找,避免 DOM 深度过深
8)将频繁运行的动画变为图层,图层能够阻止该节点回流影响别的元素。比如对于 video 标签,浏览器会自动将该节点变为图层。
- 合理分配http请求
- 多域名并行请求资源,增加cdn
- 使用异步js,css等
- 使用首屏加载,懒加载和预加载
- 合理缓存数据和不常变动的资源,使用浏览器的localStoage与sessionStorage,或者indexDB等
- js事件的节流与防抖
使用 service worker,缓存文件,提高首屏速度
// index.js
if (navigator.serviceWorker) {
navigator.serviceWorker.register("sw.js") .then(function(registration) { console.log("service worker 注册成功"); }) .catch(function(err) { console.log("servcie worker 注册失败"); });
}
// sw.js
// 监听install
事件,回调中缓存所需文件
self.addEventListener(“install”, e => {
e.waitUntil(caches.open("my-cache").then(function(cache) { return cache.addAll(["./index.html", "./index.js"]); })
);
});// 拦截所有请求事件
// 如果缓存中已经有请求的数据就直接用缓存,否则去请求数据
self.addEventListener(“fetch”, e => {
e.respondWith(caches.match(e.request).then(function(response) { if (response) { return response; } console.log("fetch source"); })
);
});优化图片等资源,例如使用webp,雪碧图等
1)CSS或者svg 去代替可以替代的图片
2)小图使用 base64 格式
3)选择正确的图片格式:
使用雪碧图
对于能够显示 WebP 格式的浏览器尽量使用 WebP 格式。因为 WebP 格式具有更好的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量,缺点就是兼容性并不好
小图使用 PNG,其实对于大部分图标这类图片,完全可以使用 SVG 代替
照片使用 JPEG
执行 JS 代码过长会卡住渲染,对于需要很多时间计算的代码可以考虑使用 Webworker。Webworker 可以让我们另开一个线程执行脚本而不影响渲染或者可以考虑切片,把每分js异步切片,尽量使之运行时间小于16ms
chorme开发者工具,cmd + shift + p,搜索coverage,可以看到哪些代码没有用到