问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Web前端如何关闭不需要的请求

创作时间:
作者:
@小白创作中心

Web前端如何关闭不需要的请求

引用
1
来源
1.
https://docs.pingcode.com/baike/2248214

在Web前端开发中,优化请求管理是提升应用性能的关键环节。本文将详细介绍如何通过多种技术手段关闭不必要的请求,包括使用AbortController、优化资源加载、利用缓存、使用CDN等。这些方法不仅能减少网络资源浪费,还能提升用户体验和服务器性能。

一、取消未完成的请求

在实际开发中,用户的操作可能会导致多次请求,尤其是在单页应用(SPA)中。频繁的请求不仅会影响用户体验,还会增加服务器负担。因此,取消未完成的请求显得尤为重要。

1、使用AbortController API

AbortController是现代浏览器提供的一种机制,用于取消正在进行的网络请求。其工作原理是创建一个控制器对象,并将该对象的信号传递给 fetch 请求。当需要取消请求时,只需调用控制器的 abort 方法即可。

例如,当用户在输入框中输入搜索关键词时,可能会发出多次请求以获取搜索建议。这时可以在新的请求发出前取消之前的请求。

let controller = new AbortController();

async function fetchSuggestions(query) {
  if (controller) {
    controller.abort();
  }
  controller = new AbortController();
  const signal = controller.signal;
  try {
    const response = await fetch(`/api/suggestions?q=${query}`, { signal });
    const suggestions = await response.json();
    displaySuggestions(suggestions);
  } catch (error) {
    if (error.name === 'AbortError') {
      console.log('Request was aborted');
    } else {
      console.error('Fetch error:', error);
    }
  }
}

2、使用axios的取消功能

如果你使用的是 axios 库,它也提供了类似的取消请求功能。通过 CancelToken,你可以在发起请求前创建一个取消令牌,并在需要取消请求时调用其 cancel 方法。

const CancelToken = axios.CancelToken;

let cancel;
async function fetchData() {
  if (cancel) {
    cancel();
  }
  const source = CancelToken.source();
  cancel = source.cancel;
  try {
    const response = await axios.get('/api/data', {
      cancelToken: source.token
    });
    console.log(response.data);
  } catch (thrown) {
    if (axios.isCancel(thrown)) {
      console.log('Request canceled', thrown.message);
    } else {
      console.error('Fetch error:', thrown);
    }
  }
}

二、优化资源加载

优化资源加载是提高页面性能的关键步骤。通过减少不必要的请求和优化资源的加载顺序,可以显著提升页面的响应速度和用户体验。

1、使用懒加载

懒加载是一种按需加载资源的技术,尤其适用于图片和其他媒体文件。在用户滚动到需要加载资源的位置时再进行加载,可以有效减少初始页面加载时间。

<img src="placeholder.jpg" data-src="real-image.jpg" class="lazyload">

配合使用 JavaScript 来实现懒加载:

document.addEventListener("DOMContentLoaded", function() {
  const lazyImages = document.querySelectorAll("img.lazyload");
  const lazyLoad = function() {
    lazyImages.forEach(image => {
      if (image.getBoundingClientRect().top < window.innerHeight && !image.src) {
        image.src = image.dataset.src;
        image.classList.remove("lazyload");
      }
    });
  };
  window.addEventListener("scroll", lazyLoad);
  window.addEventListener("resize", lazyLoad);
  lazyLoad(); // Initial call
});

2、按需加载JavaScript和CSS

按需加载 JavaScript 和 CSS 可以减少初始页面加载时间。通过动态加载脚本和样式表,可以确保仅在需要时加载资源。

function loadScript(url) {
  const script = document.createElement('script');
  script.src = url;
  document.head.appendChild(script);
}
function loadStylesheet(url) {
  const link = document.createElement('link');
  link.rel = 'stylesheet';
  link.href = url;
  document.head.appendChild(link);
}

在需要时调用这些函数来加载资源。

三、利用缓存

缓存是提高性能的另一种重要手段。通过合理利用浏览器缓存,可以减少重复请求,提高页面加载速度。

1、设置HTTP缓存头

通过设置适当的 HTTP 缓存头,可以让浏览器缓存静态资源,如图片、CSS 和 JavaScript 文件。常见的缓存头包括 Cache-Control 和 Expires 。

Cache-Control: max-age=31536000, public
Expires: Wed, 21 Oct 2021 07:28:00 GMT

这些头部指示浏览器缓存资源,并在一定时间内不再请求服务器。

2、使用Service Workers

Service Workers 是一种在后台运行的脚本,可以拦截网络请求并提供缓存的资源。通过 Service Workers,可以实现更高级的缓存策略,如离线支持和预缓存。

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('static-v1').then(cache => {
      return cache.addAll([
        '/',
        '/index.html',
        '/styles.css',
        '/script.js',
        '/image.jpg'
      ]);
    })
  );
});
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request).then(response => {
      return response || fetch(event.request);
    })
  );
});

四、使用CDN

内容分发网络(CDN)是一种通过在多个地理位置部署缓存服务器来加速内容交付的技术。使用 CDN 可以显著减少请求延迟,提高页面加载速度。

1、选择合适的CDN提供商

选择一个可靠的 CDN 提供商非常重要。常见的 CDN 提供商包括 Cloudflare、Akamai 和 Amazon CloudFront。根据项目需求选择合适的 CDN 提供商,并配置资源的分发。

2、配置CDN缓存策略

配置 CDN 的缓存策略可以进一步优化性能。通过设置缓存规则,可以控制资源的缓存时间和更新频率。

Cache-Control: max-age=31536000, public

此外,还可以使用 CDN 提供的功能,如自动压缩和图像优化,以进一步提高性能。

五、减少和合并请求

减少和合并请求是优化前端性能的另一个重要手段。通过减少 HTTP 请求的数量和合并小文件,可以显著提升页面加载速度。

1、合并CSS和JavaScript文件

将多个 CSS 和 JavaScript 文件合并成一个文件,可以减少 HTTP 请求的数量。使用构建工具(如 Webpack、Gulp)可以自动完成这一任务。

// Webpack example
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

2、使用图像精灵

图像精灵(Sprite)是一种将多个小图像合并成一个大图像的技术。通过 CSS 背景定位,可以显示精灵图中的不同部分,从而减少 HTTP 请求的数量。

.sprite {
  background-image: url('sprite.png');
}
.icon1 {
  width: 32px;
  height: 32px;
  background-position: 0 0;
}
.icon2 {
  width: 32px;
  height: 32px;
  background-position: -32px 0;
}

六、延迟加载非关键资源

延迟加载非关键资源是一种优化前端性能的策略,通过延迟加载不影响页面初始渲染的资源,可以显著提升页面加载速度。

1、使用defer和async属性

在加载 JavaScript 文件时,使用 defer 和 async 属性可以延迟脚本的执行,从而不阻塞页面的渲染。

<script src="script.js" defer></script>
<script src="analytics.js" async></script>

defer 会延迟脚本的执行,直到页面解析完成,而 async 会在脚本下载完成后立即执行,不会等待其他脚本。

2、动态加载非关键资源

通过 JavaScript 动态加载非关键资源,可以进一步优化页面性能。例如,可以在页面加载完成后再加载广告脚本或第三方插件。

window.addEventListener('load', function() {
  const script = document.createElement('script');
  script.src = 'ads.js';
  document.body.appendChild(script);
});

七、使用HTTP/2

HTTP/2 是 HTTP 协议的最新版本,具有多路复用、头部压缩和服务器推送等功能,可以显著提升前端性能。

1、启用HTTP/2

大多数现代浏览器和服务器都支持 HTTP/2。通过配置服务器,可以启用 HTTP/2 并享受其性能提升。

server {
  listen 443 ssl http2;
  server_name example.com;
  # SSL configuration
  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/key.pem;
  # Other configurations
}

2、利用HTTP/2的多路复用

HTTP/2 的多路复用功能允许多个请求共享一个 TCP 连接,从而减少延迟和提升性能。这意味着可以同时加载多个资源,而不会受到传统 HTTP 请求限制。

八、减少和优化重定向

重定向会增加额外的 HTTP 请求,延长页面加载时间。通过减少和优化重定向,可以显著提升前端性能。

1、减少不必要的重定向

检查和优化网站的重定向规则,减少不必要的重定向。例如,确保所有 URL 都使用统一的格式(如带或不带尾部斜杠),以避免不必要的重定向。

# Redirect non-www to www
server {
  listen 80;
  server_name example.com;
  return 301 $scheme://www.example.com$request_uri;
}

2、优化必要的重定向

对于必须的重定向,可以通过优化服务器配置,尽量减少重定向链。例如,将复杂的重定向规则合并成一个规则。

# Combine multiple redirects into one
server {
  listen 80;
  server_name old.example.com;
  return 301 $scheme://new.example.com$request_uri;
}

九、使用性能监控工具

使用性能监控工具可以帮助识别和解决前端性能问题,从而优化用户体验。

1、Google Lighthouse

Google Lighthouse 是一款开源的自动化工具,用于提高网页质量。通过 Lighthouse,可以分析页面性能、可访问性和 SEO,提供优化建议。

# 使用命令行运行 Lighthouse
lighthouse https://example.com --output html --output-path report.html

2、WebPageTest

WebPageTest 是一款在线工具,可以测试网站性能,提供详细的性能报告和优化建议。通过 WebPageTest,可以分析页面加载时间、资源请求和其他性能指标。

# 使用命令行运行 WebPageTest
webpagetest test https://example.com

十、项目团队协作和管理

在实际开发中,前端性能优化不仅仅是开发者的责任,还需要项目团队的协作和管理。合理的项目管理可以确保性能优化的持续进行和高效实施。

1、使用研发项目管理系统PingCode

PingCode是一款专为研发项目管理设计的系统,通过其强大的功能,可以有效管理项目进度和任务分配。在前端性能优化过程中,可以通过 PingCode 分配任务、跟踪进度,并及时发现和解决问题。

2、使用通用项目协作软件Worktile

Worktile 是一款通用的项目协作软件,通过其简洁的界面和强大的功能,可以提高团队的协作效率。在前端性能优化过程中,可以通过 Worktile 管理任务、进行团队沟通,并确保项目顺利进行。

总的来说,通过合理的项目管理和团队协作,可以确保前端性能优化的持续进行和高效实施,从而提升用户体验和项目质量。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号