|
6 @* b& [' D4 `" X' A
优化网页性能,也就是多使用内存和缓存,减少CPU的计算次数,减少网络请求次数加载资源优化对静态资源进行压缩合并对静态资源进行缓存使用CDN让资源加载更快css精灵使用SSR(server side render)后端渲染,数据直接输出到html中。 9 W V1 o% X$ O7 r9 j
渲染优化css放在html前面,js放后面懒加载缓存dom查询 (减少dom查询,对dom查询做缓存)合并dom操作 (减少dom操作,多个操作尽量合并在一起执行)函数去抖,函数节流(防止用户短时间内频繁操作dom,减少CPU计算)
8 p* p$ y" M* ~* p" A4 K, @: ^9 U+ | 尽早执行操作(DOMContentLoaded)window.addEventListener(load,function(){//页面的全部资源(包括图片和视频)加载完成后才会执行- q: R, D v1 K" U* Z2 D
})document
9 @3 o8 F2 A! i+ Z5 t6 r .addEventListener(DOMContentLoaded,function(){//DOM渲染完即可执行,此时图片、视频还可能没有加载完
% ]7 Q6 d! `' R; V& a })函数节流 throttle 和 去抖 debounce:
, b& Z) A1 P. R( N; r* c vardiv1=document.getElementById(div1);vartimer;div1.addEventListener(keyup,function(){if(timer){clearTimeout
" ? P( {+ } n0 e5 k (timer);}timer=setTimeout(function(){满足条件执行函数},100)})---------------------------------------------------------- 2 x7 m! K% N% p- q4 n l
varlastTime=null;div1.addEventListener(keyup,function(){varnowtime=newDate();if(nowtime-lastTime>自定义时间间隔 ' A+ |- Q0 w2 {' I1 @$ y
){满足条件执行函数lastTime=nowTime;}})函数节流 throttle的应用场景?哪些时候我们需要间隔一定时间触发回调来控制函数调用频率?(延迟多久触发,必须超过delay安全期才触发类似于坐电梯的过程,只要有人按就延迟上楼,电梯等待的事件相当于delay安全期)。
% a, H6 u( p) }: s& F 元素的拖拽功能(mousemove)射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)计算鼠标移动的距离(mousemove)Canvas 模拟画板功能(mousemove) $ y1 Q- B' C0 I* t
搜索联想(keyup)监听滚动事件---判断是否到页面底部时,自动加载更多资源:给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次 1 \$ C( C3 _2 Q8 w$ }7 e
函数去抖 debounce 的应用场景?哪些时候对于连续的事件响应我们只需要执行一次回调?(多久触发一次)每次 resize/scroll 触发统计事件文本输入的验证(连续输入文字后发送 AJAX 请求进行验证,验证一次就好) ' U9 z7 i$ F! A7 L% S* j# S$ x
函数节流和函数去抖的核心其实就是限制某一个方法被频繁触发,而一个方法之所以会被频繁触发,大多数情况下是因为 DOM 事件的监听回调,而这也是函数节流以及去抖多数情况下的应用场景参考:JavaScript 函数节流和函数去抖应用场景辨析 · Issue #20 · hanzichi/underscore-analysis。
( A7 d" N* r/ ]; A
5 X9 r6 T ~* ~( ^; B n9 H4 P+ Z. [( G; R( V# v! N/ r! \& p' C
; {$ i0 S) ~) f9 c: T# i
* r& M9 s4 x$ a3 c8 z1 {4 G
|