前端

前端页面性能

2019-09-26  本文已影响0人  Aniugel

前端性能优化因为涉及到计算机网络、数据算法、图形图像处理、浏览器渲染等多方面计算机知识。

前端性能优化之雅虎35条军规

关于前端性能优化的 23 条建议

web性能优化面试

2018 前端性能优化清单-简略

2018 前端性能优化清单

页面优化

一、避免页面卡顿

拆分代码段———— 用 requestAnimationFrame()获取任务去执行

减少layout————减少重排,重排要重新计算页面再渲染

简化DOM结构————帮助搜索引擎快速渲染

优化html空格注释等————减小内存

代码优化——html嵌套少、css选择器简单层数少、js少用闭包

二、加快页面打开速度

①减少渲染堵塞
1、js放在 body后面 或者用defer异步加载(能用则不用,因为defer的加载优先级会降到最低)
2、DNS预读取——并行下载,不会堵塞页面渲染,可以缩短资源加载时间

②减少head标签里的css文件————如果文件太大会阻塞渲染,如果放在body里面会导致重新layout
1、不要放太多的base64在css,因为图片转换成base64也挺大的,图片转换css不能有选择性加载的优势了,因为有的会根据设备屏幕进行选择性加载,做成字体图标。
2、文件不大的话可以把css样式做成内联的,压缩一下。因为cdn服务的请求解析下载需要时间消耗。

③优化图片
1、使用响应式图片,srcset、picture
2、图片使用懒加载

④压缩和缓存
1、gzip压缩——Nginx服务器中配置
2、Cache-Control 、
3、Last Modified ——Nginx服务器中配置——缺点:每次生成文件的last modified都不一样,max-age也难以计算
4、etag——对文件做一个校验和———缺点:如果文件较大增加服务器计算的负担,且etag用了较少数的字符表示,虽然重合的概率很小,但是还是存在的

⑤升级到HTTP/2
对于一个域只建立一次TCP连接,使用多路复用,请求多个资源,可以减少使用雪碧图,合并js/css发送请求了
且兼容性好,不妈祖条件做蛋糕切换到HTTP/1.1

三、增强用户体验

①加loading效果——(页面初始化菊花转、进度条)
②加过度动画——轮播图、导航栏、弹窗
③单击输入——有按下去的动作
④记住用户使用习惯——记住用户的输入信息,本地存储实现,如果用户开启了隐身模式,本地存储将会被禁掉,可以改用cookies
⑤避免页面闪动——可以把样式内联,因为他是和DOM一起出来的。

四、用好chrome调试工具

①打印 —— log table dir 打印带样式
②检查没有用的css/js ——  Coverage  用到的用绿色  没用到的用红色
③截全屏功能 —— Capture full size screenshot  debugger
④ios真机模拟器 —— Xcode safari
⑤用console.trace追踪函数调用
⑥查看某个函数绑定的事件
7、模拟断网做些出错处理
8、研究重绘
9、检查内存泄漏
10、查看连接时间 Network
11、查看内存消耗
12、垃圾回收 Timeline
13、页面性能评测 Audits

题目:提升页面性能的方法有哪些?

1.资源压缩合并,减少HTTP请求
2.非核心代码异步加载—异步加载的方式—异步加载的区别
3.利用浏览器缓存—缓存的分类—缓存的原理
4.使用CDN
5.预解析DNS

<meta http-equiv="x-dns-prefetch-control" control="on"> //一般浏览器a标签是默认打开DNS预解析,但是使用HTTPS时DNS预解析关闭的,所以添加这一条语句强制开启
<link rel="dns-prefetch" href="//host_name_to_prefetch.com">

异步加载的方式:

1.动态脚本加载
2.defer
3.async

异步加载的区别:

详细区别参照:https://juejin.im/post/5bcdaed7e51d457a8254e1b7
https://www.jianshu.com/p/9ce2896f8f84

1.defer是在HTML解析完之后才会执行的,如果是多个,按照加载的顺序依次执行
2.async是在加载完之后立即执行,如果是多个,执行顺序和加载顺序无关

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>性能优化</title>
    <!-- <script src="./defer1.js" charset="utf-8" defer></script>
    <script src="./defer2.js" charset="utf-8" defer></script> -->
    <script src="./async1.js" charset="utf-8" async></script>
    <script src="./async2.js" charset="utf-8" async></script>
  </head>
  <body>
    <div class="">
      test
      <script type="text/javascript">
        console.log('write');
        document.write('<span>write</span>');
      </script>
      <script type="text/javascript">
        for (var i = 0; i < 200000; i++) {
            if (i % 20000 === 0) {
                console.log(i);
            }
        }
      </script>
    </div>
  </body>
</html>

浏览器缓存:
https://juejin.im/post/5b9346dcf265da0aac6fbe57
https://segmentfault.com/a/1190000008377508
https://www.jianshu.com/p/54cc04190252

缓存的分类:
强缓存:(不询问服务端是否过期,直接把缓存拿来用)

Expiress Expires:Thu,21 Jan 2017 23:39:02 GMT(服务端发送的绝对时间)
Cache-Control Cache-Control:max-age=3600(相对时间)

协商缓存:(和服务器问一下,是否过期了)

Last-Modified If-Modified-Since Last-Modified:Wed, 26 Jan 2017 00:35:11 GMT
Etag If-None-Match

总结:

image.png

原文链接:https://blog.csdn.net/u014465934/article/details/86491034

上一篇下一篇

猜你喜欢

热点阅读