前端每日一题:2022-01-13

114 阅读2分钟

1 首屏加载优化有哪些实际有效的方法?

  • Vue-Router路由懒加载(利用Webpack的代码切割)

  • 使用CDN加速,将通用的库从vendor进行抽离

  • Nginx的gzip压缩

  • Vue异步组件

  • 服务端渲染SSR

  • 如果使用了一些UI库,采用按需加载

  • Webpack开启gzip压缩

  • 如果首屏为登录页,可以做成多入口

  • Service Worker缓存文件处理

  • 使用link标签的rel属性设置 prefetch(这段资源将会在未来某个导航或者功能要用到,但是本资源的下载顺序权重比较低,prefetch通常用于加速下一次导航)、preload(preload将会把资源得下载顺序权重提高,使得关键数据提前下载好,优化页面打开速度)

2 解释下setTimeout和setInterval定时器无法按时执行的原因.

问题说明:

JavaScript中定时器主要有setTimeout和setInterval,但是它们在执行时往往和我们设置的延迟时间有出入。

var id1 = setTimeout(fn, delay); //启动一个单定时器,在延迟后调用指定的函数。该函数返回一个惟一的ID,在以后的时间可以通过该ID取消计时器。

var id2 = setInterval(fn, delay); //类似于setTimeout,但不断调用函数(每次都有延迟),直到它被取消。

clearInterval (id2), clearTimeout (id1); //接受一个计时器ID(由上述函数返回)并停止计时器回调的发生。

原因分析:

浏览器中的所有JavaScript都在单线程上执行,所以异步事件(比如鼠标点击和定时器)仅在线程空闲时才会被调度运行。

为了控制要执行的代码, JavaScript 配置了一个任务队列,这些异步事件任务会按照将它们添加到队列的顺序执行。

而setTimeout() 的第二个参数(延时时间)只是告诉 JavaScript 再过多长时间把当前任务添加到队列中。如果队列是空的,那么添加的代码会立即执行;如果队列不是空的,那么它就要等前面的代码执行完了以后再执行。

因此定时器延迟是不能保证的。

解决方案:

动态计算时差 (仅针对循环定时,只起修正作用 )

在定时器开始前和运行时动态获取当前时间,在设置下一次定时时长时,在期望值基础上减去当前时延,以获得相对精准的定时运行效果。

此方法仅能消除setInterval()长时间运行造成的误差累计,但无法消除单个定时器执行延迟问题。