小结:网页性能优化

网页性能优化是提升用户体验、减少加载时间和提高资源利用率的关键。以下是针对网页生命周期和事件处理的性能优化技巧,结合代码示例,重点覆盖加载、渲染、事件处理和资源管理等方面。

1. 优化加载阶段

  • 减少关键资源请求
    • 合并CSS/JS文件,减少HTTP请求。

    • 使用deferasync加载非关键脚本:
      html

      <script defer src="script.js"></script> <!-- 延迟加载,DOM解析后执行 -->
      <script async src="analytics.js"></script> <!-- 异步加载,不阻塞解析 -->
      
  • 启用资源预加载
    • 使用优先加载关键资源:
      html

      <link rel="preload" href="critical.css" as="style">
      <link rel="preload" href="main.js" as="script">
      
  • 压缩和优化资源
    • 使用工具(如terser**、cssnano)压缩JS/CSS。**

    • 优化图片:使用WebP格式、压缩工具(如ImageOptim**)或CDN自动优化。**
      html

      <img src="image.webp" alt="example" loading="lazy">
      

2. 优化DOM解析和渲染

  • 减少DOM操作
    • 批量更新DOM,避免频繁重排(reflow)和重绘(repaint):
      javascript

      // 低效:多次操作DOM
      for (let i = 0; i < items.length; i++) {document.getElementById('list').innerHTML += `<li>${items[i]}</li>`;
      }// 高效:一次性操作
      const fragment = document.createDocumentFragment();
      items.forEach(item => {const li = document.createElement('li');li.textContent = item;fragment.appendChild(li);
      });
      document.getElementById('list').appendChild(fragment);
      
  • 使用CSS替代JS动画
    • CSS动画通常由GPU加速,比JS动画更高效:
      css

      .fade-in {animation: fadeIn 0.5s ease-in;
      }
      @keyframes fadeIn {from { opacity: 0; }to { opacity: 1; }
      }
      
  • 延迟非关键渲染
    • 使用requestIdleCallback处理低优先级任务:
      javascript

      requestIdleCallback(() => {console.log('执行低优先级任务,如加载跟踪脚本');// 加载非关键分析脚本
      }, { timeout: 2000 });
      

3. 优化事件处理

  • 事件委托
    • 为父元素绑定事件,减少监听器数量:
      javascript

      document.getElementById('list').addEventListener('click', (e) => {if (e.target.tagName === 'LI') {console.log('点击了列表项:', e.target.textContent);}
      });
      
  • 防抖和节流
    • 限制高频事件(如scroll**、resize)的触发频率:**
      javascript

      // 节流:每200ms最多触发一次
      function throttle(fn, delay) {let last = 0;return (...args) => {const now = Date.now();if (now - last >= delay) {fn(...args);last = now;}};
      }window.addEventListener('scroll', throttle(() => {console.log('滚动事件触发');
      }, 200));// 防抖:停止操作后200ms触发
      function debounce(fn, delay) {let timer;return (...args) => {clearTimeout(timer);timer = setTimeout(() => fn(...args), delay);};
      }window.addEventListener('resize', debounce(() => {console.log('窗口大小调整完成');
      }, 200));
      
  • 移除无用监听器
    • 动态元素卸载时清理事件,防止内存泄漏:
      javascript

      const button = document.getElementById('myButton');
      const handler = () => console.log('点击');
      button.addEventListener('click', handler);
      // 移除
      button.removeEventListener('click', handler);
      

4. 优化资源管理和网络

  • 懒加载
    • 使用loading="lazy"延迟加载图片和iframe:
      html

      <img src="below-fold.jpg" loading="lazy" alt="lazy image">
      
    • 动态加载JS模块:
      javascript

      import('module.js').then(module => {module.init();
      });
      
  • 缓存策略
    • 使用Service Worker缓存静态资源:
      javascript

      // service-worker.js
      self.addEventListener('install', (event) => {event.waitUntil(caches.open('my-cache').then((cache) => {return cache.addAll(['/index.html', '/styles.css', '/script.js']);}));
      });self.addEventListener('fetch', (event) => {event.respondWith(caches.match(event.request).then((response) => {return response || fetch(event.request);}));
      });
      
    • 设置HTTP缓存头(如Cache-Control**):**
      nginx

      # Nginx 配置示例
      location ~* \.(jpg|png|css|js)$ {expires 1y;add_header Cache-Control "public";
      }
      
  • 使用CDN
    • 加速静态资源分发,减少延迟:
      html

      <script src="https://cdn.example.com/jquery.min.js"></script>
      

5. 优化页面可见性和交互

  • 暂停隐藏页面任务
    • 使用visibilitychange暂停资源密集型任务:
      javascript

      document.addEventListener('visibilitychange', () => {if (document.visibilityState === 'hidden') {clearInterval(pollingTimer); // 停止轮询} else {pollingTimer = setInterval(fetchData, 5000); // 恢复轮询}
      });
      
  • 优先处理用户交互
    • 使用requestAnimationFrame优化动画和交互:
      javascript

      function animate() {// 更新动画requestAnimationFrame(animate);
      }
      requestAnimationFrame(animate);
      

6. 性能监控和调试

  • 使用Performance API
    • 测量关键时间点:
      javascript

      window.addEventListener('load', () => {const { domContentLoadedEventEnd, loadEventEnd } = performance.timing;console.log('DOM加载时间:', domContentLoadedEventEnd - navigationStart);console.log('页面总加载时间:', loadEventEnd - navigationStart);
      });
      
  • Lighthouse分析
    • 使用Chrome DevTools的Lighthouse工具检查性能,获取优化建议。
  • 错误监控
    • 捕获并记录运行时错误:
      javascript

      window.addEventListener('error', (e) => {fetch('/log-error', {method: 'POST',body: JSON.stringify({ message: e.message, file: e.filename }),});
      }, true);
      

7. 其他实用技巧

  • Tree Shaking:使用Webpack/Rollup移除未使用的代码。

  • 代码分割:按路由或功能模块分割JS,减少初始加载量:
    javascript

    // Webpack 动态导入
    import(/* webpackChunkName: "module" */ './module.js').then(module => {module.default();
    });
    
  • 避免阻塞主线程

    • 将耗时任务移到Web Worker:
      javascript

      // main.js
      const worker = new Worker('worker.js');
      worker.postMessage({ task: 'heavyComputation' });
      worker.onmessage = (e) => console.log('结果:', e.data);// worker.js
      self.onmessage = (e) => {const result = heavyComputation(e.data);self.postMessage(result);
      };
      
  • 优化字体加载

    • 使用font-display: swap避免FOUT(无样式文本闪烁):
      css

      @font-face {font-family: 'MyFont';src: url('myfont.woff2') format('woff2');font-display: swap;
      }
      

注意事项

  • 测试环境:在不同设备和网络条件下(3G、4G)测试性能。
  • 渐进增强:确保核心功能在无JS或低性能设备上可用。
  • 用户体验:优化性能时避免牺牲可访问性(如ARIA支持)。
  • 工具支持:使用Vite、esbuild等现代构建工具加速开发和打包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI学习】AI大模型技术发展研究月报的生成提示词

AI大模型技术发展研究月报生成提示词 请输出AI大模型技术发展研究月报&#xff0c;要求如下&#xff1a; —————————— 任务目标 在今天&#xff08;{{today}}&#xff09;往前连续 30 天内&#xff0c;检索已正式公开发表的、与AI大模型&#xff08;参数量 ≥10B&am…

AI 实践探索:辅助生成测试用例

背景 目前我们的测试用例主要依赖人工生成和维护&#xff0c;AI时代的来临&#xff0c;我们也在思考“AI如何赋能业务”&#xff0c;提出了如下命题&#xff1a; “探索通过AI辅助生成测试用例&#xff0c;完成从需求到测试用例生成的穿刺”。 目标 找全测试路径辅助生成测…

C#实现访问远程硬盘(附源码)

在现实场景中&#xff0c;我们经常用到远程桌面功能&#xff0c;而在某些场景下&#xff0c;我们需要使用类似的远程硬盘功能&#xff0c;这样能非常方便地操作对方电脑磁盘的目录、以及传送文件。那么&#xff0c;这样的远程硬盘功能要怎么实现了&#xff1f; 这次我们将给出…

02.Golang 切片(slice)源码分析(一、定义与基础操作实现)

Golang 切片&#xff08;slice&#xff09;源码分析&#xff08;一、定义与基础操作实现&#xff09; 注意当前go版本代码为1.23 一、定义 slice 的底层数据是数组&#xff0c;slice 是对数组的封装&#xff0c;它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数…

记参加一次数学建模

题目请到全国大学生数学建模竞赛下载查看。 注&#xff1a;过程更新了很多文件&#xff0c;所有这里贴上的有些内容不是最新的&#xff08;而是草稿&#xff09;。 注&#xff1a;我们队伍并没有获奖&#xff0c;文章内容仅供一乐。 从这次比赛&#xff0c;给出以下赛前建议 …

virtualbox虚拟机中的ubuntu 20.04.6安装新的linux内核5.4.293 | 并增加一个系统调用 | 证书问题如何解决

参考文章&#xff1a;linux添加系统调用【简单易懂】【含32位系统】【含64位系统】_64位 32位 系统调用-CSDN博客 安装新内核 1. 在火狐下载你需要的版本的linux内核压缩包 这里我因为在windows上面下载过&#xff0c;配置过共享文件夹&#xff0c;所以直接复制粘贴通过共享文…

[Java实战]Spring Boot 3 整合 Ehcache 3(十九)

[Java实战]Spring Boot 3 整合 Ehcache 3&#xff08;十九&#xff09; 引言 在微服务和高并发场景下&#xff0c;缓存是提升系统性能的关键技术之一。Ehcache 作为 Java 生态中成熟的内存缓存框架&#xff0c;其 3.x 版本在性能、功能和易用性上均有显著提升。本文将详细介绍…

LlamaIndex 第九篇 Indexing索引

索引概述 数据加载完成后&#xff0c;您将获得一个文档对象(Document)列表&#xff08;或节点(Node)列表&#xff09;。接下来需要为这些对象构建索引(Index)&#xff0c;以便开始执行查询。 索引&#xff08;Index&#xff09; 是一种数据结构&#xff0c;能够让我们快速检索…

【问题排查】easyexcel日志打印Empty row!

问题原因 日志打印​​I/O 操作开销​&#xff08;如 Log4j 的 FileAppender&#xff09;会阻塞业务线程&#xff0c;直到日志写入完成&#xff0c;导致接口响应变慢 问题描述 在线上环境&#xff0c;客户反馈导入一个不到1MB的excel文件&#xff0c;耗时将近5分钟。 问题排…

代码随想录第51天|岛屿数量(深搜)、岛屿数量(广搜)、岛屿的最大面积

1.岛屿数量&#xff08;深搜&#xff09; ---》模板题 版本一写法&#xff1a;下一个节点是否能合法已经判断完了&#xff0c;传进dfs函数的就是合法节点。 #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -…

Made with Unity | 从影视到游戏:《鱿鱼游戏》IP 的边界拓展

优质IP的跨媒体开发潜力不可限量。以现象级剧集《鱿鱼游戏》为例&#xff0c;Netflix旗下游戏工作室Boss Fight在第二季开播前夕推出的手游《Squid Game: Unleashed》&#xff0c;一经发布便横扫全球107个国家和地区的App Store免费游戏榜首。 这款多人派对大逃杀游戏完美还原…

allure 报告更改标题和语言为中文

在网上看到好多谈到更改allure 的标题设置都很麻烦&#xff0c;去更改JSON文件 其实可以有更简单的办法&#xff0c;就是在生成报表时增加参数 使用allure --help 查看&#xff1a; --lang, --report-language 设置报告的语言&#xff0c;默认是应用 The report language. …

HGDB索引膨胀的检查与处理思路

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5.8 文档用途 本文档主要介绍HGDB索引膨胀的定义、产生的原因、如何检查以及遇到索引膨胀如何处理&#xff08;包括预防和解决&#xff09; 详细信息 …

【Python CGI编程】

Python CGI&#xff08;通用网关接口&#xff09;编程是早期Web开发中实现动态网页的技术方案。以下是系统化指南&#xff0c;包含核心概念、实现步骤及安全实践&#xff1a; 一、CGI 基础概念 1. 工作原理 浏览器请求 → Web服务器&#xff08;如Apache&#xff09; → 执行…

数据库故障排查指南:从入门到精通

1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…

conda创建环境常用命令(个人用)

创建环境 conda create --name your_project_name创建环境 ---- 指定环境python版本 conda create --name your_project_name python3.x环境列表 conda env list激活环境 conda activate your_project_name退出环境 conda deactivate环境列表 #使用conda命令 conda list …

PCL 绘制二次曲面

文章目录 一、简介二、实现代码三、实现效果一、简介 这里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文讲透面向对象编程OOP特点及应用场景

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种以对象为核心、通过类组织代码的编程范式。它通过模拟现实世界的实体和交互来构建软件系统&#xff0c;是现代软件开发中最广泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉

当使用 java -jar xxx.jar & 启动 Spring Boot 项目后进程自动关闭时&#xff0c;可能由多种原因导致。以下是常见排查步骤和解决方案&#xff1a; 一、查看日志定位原因 进程异常关闭通常会在控制台或日志中留下线索&#xff0c;建议先获取完整日志&#xff1a; 1. 查看…

【独家精简】win11(24h2)清爽加速版

自作该版本的初心&#xff1a;随着电脑性能的不断提升&#xff0c;我们需要的更多的是没有广告&#xff0c;没有推荐&#xff0c;没有收集隐私的windows清爽版纯净系统 目前只会去制作windows系统专业版 1、去除Windows系统自带的广告新闻和推荐以及小组间和聊天功能。 2、精简…