使用 Intersection Observer 进行懒加载


文章创建时间: 2024-6-22 8:0 Sat Jun
文章总字数: 1025,预计阅读时间需要: 6 分钟

起因

接到公司任务,修复一个错误的页面

公司内部一个历史悠久的后台页面,历经多年迭代,需要填写的表单字段数接近 500 个,且大量选项依赖数据库实时查询,渲染逻辑复杂

在内网环境下,打开加载到可操作时间约 4.5s;生产环境网络条件更差,页面直接白屏卡死,已无法进行使用

判断瓶颈

该页面使用频率较低,涉及逻辑复杂,大量动态数据,在多年更迭中达到了巨大规模

该信息具有大量字段,接近500个,与此同时许多选项依赖现存数据库数据,各个字段都存在不同的加载和渲染逻辑

该页面存在巨大的渲染压力

解决方案

优化页面加载逻辑,使用 Intersection Observer 进行懒加载,以加速页面加载速度

// 获取需要观察的元素
const target = document.querySelector('#app');

// 创建 Intersection Observer 实例
const observer = new IntersectionObserver((entries) => {
  
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      console.log('the target in viewport');
        // 完成初始化之后 终止观察
      observer.disconnect();
    } else {
      console.log('the target out of viewport');
    }
  });
}, {
    threshold: 0.5   // 当元素 50% 可见时触发回调
});

// Intersection Observer 开始观察目标元素
observer.observe(target);

结后语

通过如上方案,显著加快了页面加载速度,提升了用户体验,如此大规模的表单,交互也是一部分一部分的进行, IntersectionObserver 也不会对体验有负面影响

在元素完成初始化之前,先使用骨架屏展示,然后在元素进入视口时,再加载数据,还可以额外调配回调函数,对其进行限流,避免频繁触发

使用该方案之后,内网的加速速度从 4.5s 降到了 67ms,后续配合其他优化手段,使得生产环境也从直接白屏卡死优化到了200ms即可进行操作