每天一个js小技巧 - 加快网站加载时间

tip:一个快速、响应迅速且用户友好的网站不仅可以吸引和留住访问者,还有助于提高搜索引擎排名、提高转化率和改善用户体验 (UX),作为软件工程师或 Web 开发人员,必须在项目中优先考虑性能优化技术。


以下是一些日常开发中能常用的优化方法:

1、 捆绑网络请求

捆绑是将多个 JavaScript 文件组合成一个文件的过程。这减少了浏览器需要发出的 HTTP 请求的数量,从而加快了加载过程,最小化的请求数量,可以减少浏览器下载和处理必要资源所需的时间,从而缩短加载时间并提供更灵敏的用户体验。捆绑可以显着提高网站性能,尤其是对于具有大量较小 JavaScript 文件的网站。 常用工具:Webpack、Rollup等

假设有三个独立的 JavaScript 文件:

// main.js
import {
          
    greet } from ./greeting.js;
import {
          
    calculate } from ./math.js;
console.log(greet(John));
console.log(calculate(5, 3));
// greeting.js
export function greet(name) {
          
   
  return `Hello, ${
            
     name}!`;
}
// math.js
export function calculate(x, y) {
          
   
  return x * y;
}

使用 Webpack 或 Rollup 等捆绑工具,可以将这些文件组合成一个捆绑文件。输出可能看起来像这样:

(function () {
          
   
  use strict;
  function greet(name) {
          
   
    return `Hello, ${
            
     name}!`;
  }
  function calculate(x, y) {
          
   
    return x * y;
  }
  console.log(greet(John));
  console.log(calculate(5, 3));
})();

捆绑文件将原始文件中的所有必要代码包含在一个独立的单元中,从而减少了加载脚本所需的网络请求数。

2、 延迟加载

一般用在视口中的图像加载,可以使用 IntersectionObserver API 来实现。常见的使用方法是向图像元素添加一个 data-src 属性,其中包含实际的图像源。使用这种简单的延迟加载技术,可以确保只加载当前查看的图像,减少网络请求的数量并缩短网站的初始加载时间。
<img data-src="path/to/image.jpg" class="lazy-load" alt="An example image">

然后,创建一个脚本来设置 IntersectionObserver 以在图像进入视口时加载图像。

document.addEventListener(DOMContentLoaded, function () {
          
   
  const lazyImages = [].slice.call(document.querySelectorAll(.lazy-load));
  if (IntersectionObserver in window) {
          
   
    const lazyImageObserver = new IntersectionObserver(function (entries, observer) {
          
   
      entries.forEach(function (entry) {
          
   
        if (entry.isIntersecting) {
          
   
          const lazyImage = entry.target;
          lazyImage.src = lazyImage.dataset.src;
          lazyImage.classList.remove(lazy-load);
          lazyImageObserver.unobserve(lazyImage);
        }
      });
    });
    lazyImages.forEach(function (lazyImage) {
          
   
      lazyImageObserver.observe(lazyImage);
    });
  }
});

在此示例中,IntersectionObserver 监视 .lazy-load 图像是否进入视口。检测到图像时,会将其 data-src 属性分配给 src 属性,从而触发实际的图像下载。加载图像后,将删除延迟加载类,并且不会观察到图像。

3、 js 文件的异步加载

异步加载允许浏览器下载和执行 js 文件,而不会阻止页面其余部分的呈现。通过使用 async 和 defer 属性,可以控制 js 文件的加载和执行行为。可以最大限度地减少渲染阻塞资源并提高网站的性能和用户体验。

在 HTML 文件中使用 async 和 defer 属性的例子:

<!DOCTYPE html>
<html>
<head>
  <!-- Using the defer attribute -->
  <script src="main.js" defer></script>
</head>
<body>
  <!-- Using the async attribute -->
  <script src="analytics.js" async></script>
</body>
</html>

在此示例中,main.js 加载了 defer 属性,确保它不会阻塞渲染,并在 DOM 完全解析后执行。同时,analytics.js 加载了 async 属性,允许它独立于页面的其余部分下载和执行。

经验分享 程序员 微信小程序 职场和发展