懒加载方案对 SPA 应用性能的提升效果

单页应用(SPA)在现代 web 开发中越来越普遍,不过 SPA 应用受制于网络环境和浏览器性能的限制,经常出现长时间的白屏等待和卡顿现象。懒加载方案是一种解决这个问题的策略,可以让我们延迟加载那些不必要或者是初始不需要的资源,只有当用户需要或者是触发了相关事件的时候才会加载这些资源。下面将详细探讨懒加载方案对 SPA 应用性能的提升效果,并提供一些学习和指导意义。

懒加载方案的优势

  1. 快速启动:懒加载方案可以快速启动应用程序,因为在应用程序初始化的时候只会加载必要的资源,其他资源只有在用户需要时才会被载入。这样可以减少白屏等待的时间,让应用程序启动更快速。

  2. 减少请求次数和资源大小:懒加载方案可以减少初次请求的次数和资源的大小。由于初始加载时只加载了必要的资源和数据,其他的可选资源和数据则通过 AJAX 的方式异步加载。这就意味着单页应用的网页体积可以更小,优化页面加载速度和用户体验。

  3. 提高页面响应速度:懒加载方案可以提高页面响应速度。当用户触发需要懒加载的事件时,这些资源可以更快速地被呈现出来,让用户感到更加自然和流畅。

  4. 减少服务器资源占用:懒加载方案可以减少服务器的资源占用。由于 AJAX 异步加载的方式,资源只会在用户需要时被加载,这样就减轻了服务器在初次渲染时的负荷。

SPA 应用中的懒加载方案

下面我们探讨几种适用于 SPA 应用的懒加载方案,分别是图片懒加载、组件懒加载、和按需加载分组件打包。

图片懒加载

在加载页面时,如果图片过多,那么耗费的时间和网络流量就会非常大。通过使用图片懒加载,图片的请求在页面渲染时不会一次性全部进行,而是当图片进入可视区域之后再进行加载。这样可以在用户请求需要查看的图片时,才发出这些图片的请求。这个方案大大提高了页面响应速度,让用户更快速地获取需要的信息。

实现方法

// 方法一,通过自定义属性判断是否需要加载
<img data-src="path/to/image.jpg" src="https://via.placeholder.com/300" alt="美图">

function lazyLoadImages() {
  let images = document.querySelectorAll("img[data-src]");
  images.forEach(function (img) {
    if (img.getBoundingClientRect().top < window.innerHeight) {
      img.src = img.getAttribute("data-src");
      img.removeAttribute("data-src");
    }
  });
}

lazyLoadImages();
window.addEventListener("scroll", lazyLoadImages, { passive: true });
// 方法二,使用 IntersectionObserver 判断是否需要加载
<img data-src="path/to/image.jpg" src="https://via.placeholder.com/300" alt="美图">

let options = {
  rootMargin: "0px 0px 50px 0px",
  threshold: 0
};

let observer = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      let img = entry.target;
      img.src = img.getAttribute("data-src");
      img.removeAttribute("data-src");
      
      observer.unobserve(img);
    }
  });
}, options);

let images = document.querySelectorAll("img[data-src]");
images.forEach(img => {
  observer.observe(img);
});

组件懒加载

组件懒加载是在 SPA 应用中最常用的懒加载方案。它的本质是将代码在需要的时候进行动态加载,以减少初始加载时的体积和请求次数。常见的 SPA 框架例如 Vue 和 React 都内置了异步加载组件的能力,实现起来也比较方便。

实现方法

以 React 为例:

// 使用 React.lazy 异步加载组件
const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

按需加载分组件打包

对 SPA 应用来说,往往会包含一些超大的第三方库或者自己实现的代码,这些代码可能并不会在每次页面加载时都被使用到。按需加载分组件打包是一种将这些代码分离出去,在特定的一些场景或页面中才被加载的方案。这个方案可以使主要的代码更易于管理和理解。

实现方法

以 Webpack 为例:

// webpack.config.js
module.exports = {
  entry: {
    app: './src/index.js',
    vendor: ['react', 'lodash'],
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendor',
          chunks: 'all',
        },
      },
    },
  },
  // ...
};
// index.js
import _ from 'lodash';

function component() {
  let element = document.createElement('div');

  element.innerHTML = _.join(['Hello', 'webpack'], ' ');

  return element;
}

document.body.appendChild(component());

总结

懒加载方案是优化 SPA 应用性能的有效策略。除了图片懒加载和组件懒加载之外,按需加载分组件打包也是一种很好的解决方案。不过懒加载方案适用的场景和实现方法有所不同,需要在具体的应用场景中灵活运用,才能发挥出更好的效果。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b1ca1badd4f0e0ffafcf2f