Javascript性能优化(初步完结)

目录

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

 

一、性能优化原则

1.多使用内存、缓存或其他办法

2.减少CPU计算量,减少网络加载耗时

3.空间换时间(适用于所有编程的性能优化)

二、性能优化主要的

  1. 资源合并:将分散的资源合并到一起,减少HTTP请求
  2. 缓存:
  3. 使用更快的网络:CDN
  4. SSR
  5. 让渲染更快,减少重绘
  •   (1)css放在head,JS放在body最下面
  •   (2)尽早开始执行JS,用DOMContentLoaded触发
  •   (3)懒加载(图片懒加载,上滑加载更多)
  •   (4)对DOM查询进行缓存,减少DOM的使用
  •   (5)频繁DOM操作,合并到一起插入DOM结构
  •   (6)节流throttle防抖debounce

1.资源合并:将分散的资源合并到一起

2.缓存:

+静态资源加hash后缀,根据文件内容计算hash,文件内容不变,则hash必变,则url不变,

+url和文件不变,则会自动触发http缓存机制,返回403

3.CDN

+cdn是根据网络做静态服务的,还有cdn是根据你地域做的网络服务,地域不同,网络也不同,速度非常的快,可以没有并行的限制。

5.SSR

+服务器端渲染:将网页和数据一起加载,一起渲染

+非SSR(前后端分离):先加载网页,再加载数据,再渲染数据

+早先是JSP、ASP、PHP,现在是vue、React、SSR

6.让渲染更快,减少重绘

(1)css放在head,JS放在body最下面

JS需要等到CSS加载完毕以后,才会真正的开始执行,CSS会阻塞页面渲染,当浏览器遇到CSS时,会保证CSS加载完毕CSSOM后才会进行渲染;当浏览器遇到JS内容时,会停止DOM的构建,直到JS执行完毕,JS会查询、修改DOM CSSOM,因此浏览器会停止执行JS,直到CSSOM生成完毕。

(2)尽早开始执行JS,用DOMContentLoaded触发

DOMContentLoaded 事件必须等待其所属script之前的样式表加载解析完成才会触发。

<link rel="stylesheet" href="css.php">
<script>
document.addEventListener('DOMContentLoaded',function(){
    console.log('3 seconds passed');
});
</script>

附加:

load事件是等全部资源加载完后猜执行,包括图片、视频等

DOM渲染完即可执行,此时图片、视频还可能没有加载完

 

(3)懒加载(图片懒加载,上滑加载更多)

自建伪属性,将真实地址充当伪属性的值,然后滚动加载时,再将伪属性值复制给src真正的属性,以达到懒加载的目的。

(4)对DOM查询进行缓存,减少DOM的使用

将有DOM的东西先缓存起来,如果说后期每个都是直接操作DOM会很耗费内存,而将DOM缓存起来赋值给一个变量,未来的性能和效率上会大幅度提高.

看截图:将DOM缓存赋值类lenght变量

(5)频繁DOM操作,合并到一起插入DOM结构

我们可以把东西都准备好一次性插入节点,比一次一次的插入节点效率要高(截图中是将内容先插入文档片段中,然后都完成以后一次性的插入到DOM树中)

这里让我想到,可以用字符串拼接的方式把内容都拼接好,然后一次性插入节点是一样的。

(6)节流throttle防抖debounce

(看本人另外一篇)

https://blog.csdn.net/qq_38588845/article/details/103168528

三、非核心代码异步加载-异步加载的方式-异步加载的区别

我们对于非核心代码可以采用代码异步加载的方式

1.异步加载的方式

(1)动态脚本加载(这个方式会有很多的)

https://blog.csdn.net/earth_smallma/article/details/80833965

(2)defer加载

<head>
  <script src="./a.js" defer></script><!--2-->
  <script src="./b.js" defer></script><!--3-->
</head>
<body>
  <script>
    console.log(1)
  </script>
</body>

原本没有defer返回2,3,1;加了之后返回1, 2, 3

(3)async加载

<head>
  <script src="./a.js" async></script>
  <script src="./b.js" async></script>
</head>
<body>
  <script>
    console.log(1)
  </script>

a.js b.js 哪个先执行完先返回

defer与async加载的区别

defer是再HTML解析完之后才会执行,如果是多个,按照加载的顺序依次执行

async是在加载完之后立即执行,如果是多个,执行和加载顺序无关

四、浏览器缓存

强缓存:就是浏览器不与服务交流,直接拿来用。

Expires(过期时间),它的值代表绝对时间,服务端和客户端的时间可能不一致,所以引出了Cache-Control。 Cache-control:max-age是相对时间,就是说,这个相对时间内,不会向服务端拿资源。如果两个都下发了,则以Cache-control的时间为准。 

协商缓存:本地有一个副本,问服务器能否使用这个缓存,是否过期。

浏览器下一次请求这个资源,浏览器检测到有 Last-Modified这个header,于是添加If-Modified-Since这个header,值就是Last-Modified中的值;服务器再次收到这个资源请求,会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比,如果没有变化,返回304和空的响应体,直接从缓存读取,如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200,Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成。

备注:前端默认不需要做什么,主要是服务端来设置,按照 HTTP响应头的缓存设置就好,

五、预解析DNS

有两种

  <meta http-equiv="x-dns-prefetch-control" content="on">
  <link rel="dns-prefetch" href="//host_name_to_prefetch.com">

第一种:上面的meta

一般来说http里面a标签是支持预解析的,但是https却关闭了预解析,加上了meta这句话,强制在https中打开了a标签的预解析。

第二种:上面的link

就是打开dns预解析,不包括a,因为浏览器在http中默认打开了预解析。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值