单页应用(SPA)在现代 web 开发中越来越普遍,不过 SPA 应用受制于网络环境和浏览器性能的限制,经常出现长时间的白屏等待和卡顿现象。懒加载方案是一种解决这个问题的策略,可以让我们延迟加载那些不必要或者是初始不需要的资源,只有当用户需要或者是触发了相关事件的时候才会加载这些资源。下面将详细探讨懒加载方案对 SPA 应用性能的提升效果,并提供一些学习和指导意义。
懒加载方案的优势
快速启动:懒加载方案可以快速启动应用程序,因为在应用程序初始化的时候只会加载必要的资源,其他资源只有在用户需要时才会被载入。这样可以减少白屏等待的时间,让应用程序启动更快速。
减少请求次数和资源大小:懒加载方案可以减少初次请求的次数和资源的大小。由于初始加载时只加载了必要的资源和数据,其他的可选资源和数据则通过 AJAX 的方式异步加载。这就意味着单页应用的网页体积可以更小,优化页面加载速度和用户体验。
提高页面响应速度:懒加载方案可以提高页面响应速度。当用户触发需要懒加载的事件时,这些资源可以更快速地被呈现出来,让用户感到更加自然和流畅。
减少服务器资源占用:懒加载方案可以减少服务器的资源占用。由于 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