小结:网页性能优化

news2025/5/21 4:49:11

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

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.coloradmin.cn/o/2380447.html

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

相关文章

8-游戏详情制作(Navigation组件)

1.1 需求 使用Navigation实现游戏主详情视图&#xff0c;从瀑布流容器中的游戏项&#xff08;游戏中心首页-游戏瀑布流列表&#xff09;点击游戏后进入游戏详情页&#xff0c;从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入&#xff1a; 游戏详情&#…

Unity引擎源码-物理系统详解-其二

继续我们关于Unity的物理系统的源码阅读&#xff0c;不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下&#xff1a;NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…

1.3.3 数据共享、汇聚和使用中的安全目标

探索数据共享、汇聚与使用中的安全目标 在当今数字化时代&#xff0c;数据的价值愈发凸显&#xff0c;数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而&#xff0c;在这一过程中&#xff0c;数据安全至关重要&#xff0c;我们需要明确并保障保密性、完整性…

【Docker】Docker安装Redis

目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新&#xff0c;如需下载指定版本可带版本号 docker pull redis:xxx 响应内容&#xff1a; 1.1查看下载的镜像 下载完…

Oc语言学习 —— Foundation框架总结

1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象&#xff0c;例如&#xff1a;NSString *str "hello"; 因为我们的NSString是不可变的&#xff0c;所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…

LWIP的Socket接口

Socket接口简介 类似于文件操作的一种网络连接接口&#xff0c;通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口&#xff0c;但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构&#xff1a; Memory-efficient implementation&#xff1a; 实验&#xff1a; 1. 在大规模模型上效果显著&#xff1a; 2. 在不同类型任务上的效果&#xff1a; 为什么MLP对效果有提升的几点猜测&#xff1a; 1. 并非所有token对生成质量的影响相同 2. 关…

Spring的Validation,这是一套基于注解的权限校验框架

为了保证数据的正确性、完整性&#xff0c;作为一名后端开发工程师&#xff0c;不能仅仅依靠前端来校验数据&#xff0c;还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器&#xff0c;处理校验异常 RestControllerAdvice p…

MySQL - 如何突破单库性能瓶颈

数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的&#xff0c;服务器是数据库的宿主&#xff0c;其性能直接影响了数据库的性能&#xff0c;所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…

apisix透传客户端真实IP(real-ip插件)

文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses&#xff1f;安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理&#xff08;如 Nginx、HAProxy、云厂商的 LB&#xff…

Oracle 数据库的默认隔离级别

Oracle 数据库的默认隔离级别 默认隔离级别&#xff1a;READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别&#xff0c;这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天&#xff0c;今天是dijkstra&#xff08;堆优化版&#xff09;以及Bellman_ford &#xff0c;尝试理解中&#xff0c;属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

开启健康生活的多元养生之道

健康养生是一门值得终身学习的学问&#xff0c;在追求健康的道路上&#xff0c;除了常见方法&#xff0c;还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道&#xff0c;能让我们的生活更健康、更有品质。​ 室内环境的健康不容忽视。定期清洁空调滤网&#xff0c;避…

【Vite】前端开发服务器的配置

定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…

Spring Security与Spring Boot集成原理

Spring Security依赖的是过滤器机制&#xff0c;首先是web容器例如tomcat作为独立的产品&#xff0c;本身有自己的一套过滤器机制用来处理请求&#xff0c;那么如何将tomcat接收到的请求转入到Spring Security的处理逻辑呢&#xff1f;spring充分采用了tomcat的拓展机制提供了t…

VScode各文件转化为PDF的方法

文章目录 代码.py文件.ipynb文本和代码夹杂的文件方法 1:使用 VS Code 插件(推荐)步骤 1:安装必要插件步骤 2:安装 `nbconvert`步骤 3:间接导出(HTML → PDF)本文遇见了系列错误:解决方案:问题原因步骤 1:降级 Jinja2 至兼容版本步骤 2:确保 nbconvert 版本兼容替代…

Vue3学习(组合式API——Watch侦听器、watchEffect()详解)

目录 一、Watch侦听器。 &#xff08;1&#xff09;侦听单个数据。 &#xff08;2&#xff09;侦听多个数据。&#xff08;数组写法&#xff1f;&#xff01;&#xff09; &#xff08;3&#xff09;immediate参数。(立即执行回调) &#xff08;3&#xff09;deep参数。(深层监…

【node.js】安装与配置

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. Node.js简介1.1 Node.js的特点1.2 Node.js架构 2. Node.js安装2.1 下载和安装方法2.1.1 Windows安装2.1.2 macOS安装2.1.3 Linux安装 2.2 使用NVM安装和管理Node.js版本2.2.1 安装NVM2.2.2 使用NVM管理Node…

《AI大模型应知应会100篇》第62篇:TypeChat——类型安全的大模型编程框架

第62篇&#xff1a;TypeChat——类型安全的大模型编程框架 摘要 在构建 AI 应用时&#xff0c;一个常见的痛点是大语言模型&#xff08;LLM&#xff09;输出的不确定性与格式不一致问题。开发者往往需要手动解析、校验和处理模型返回的内容&#xff0c;这不仅增加了开发成本&a…

EdgeShard:通过协作边缘计算实现高效的 LLM 推理

(2024-05-23) EdgeShard: Efficient LLM Inference via Collaborative Edge Computing (EdgeShard:通过协作边缘计算实现高效的 LLM 推理) 作者: Mingjin Zhang; Jiannong Cao; Xiaoming Shen; Zeyang Cui;期刊: (发表日期: 2024-05-23)期刊分区:本地链接: Zhang 等 - 2024 …