小结:网页性能优化
网页性能优化是提升用户体验、减少加载时间和提高资源利用率的关键。以下是针对网页生命周期和事件处理的性能优化技巧,结合代码示例,重点覆盖加载、渲染、事件处理和资源管理等方面。
1. 优化加载阶段
- 减少关键资源请求:
-
合并CSS/JS文件,减少HTTP请求。
-
使用defer或async加载非关键脚本:
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处理低优先级任务:
javascriptrequestIdleCallback(() => {console.log('执行低优先级任务,如加载跟踪脚本');// 加载非关键分析脚本 }, { timeout: 2000 });
-
3. 优化事件处理
- 事件委托:
-
为父元素绑定事件,减少监听器数量:
javascriptdocument.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));
-
- 移除无用监听器:
-
动态元素卸载时清理事件,防止内存泄漏:
javascriptconst 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模块:
javascriptimport('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暂停资源密集型任务:
javascriptdocument.addEventListener('visibilitychange', () => {if (document.visibilityState === 'hidden') {clearInterval(pollingTimer); // 停止轮询} else {pollingTimer = setInterval(fetchData, 5000); // 恢复轮询} });
-
- 优先处理用户交互:
-
使用requestAnimationFrame优化动画和交互:
javascriptfunction animate() {// 更新动画requestAnimationFrame(animate); } requestAnimationFrame(animate);
-
6. 性能监控和调试
- 使用Performance API:
-
测量关键时间点:
javascriptwindow.addEventListener('load', () => {const { domContentLoadedEventEnd, loadEventEnd } = performance.timing;console.log('DOM加载时间:', domContentLoadedEventEnd - navigationStart);console.log('页面总加载时间:', loadEventEnd - navigationStart); });
-
- Lighthouse分析:
- 使用Chrome DevTools的Lighthouse工具检查性能,获取优化建议。
- 错误监控:
-
捕获并记录运行时错误:
javascriptwindow.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等现代构建工具加速开发和打包。
相关文章:
小结:网页性能优化
网页性能优化是提升用户体验、减少加载时间和提高资源利用率的关键。以下是针对网页生命周期和事件处理的性能优化技巧,结合代码示例,重点覆盖加载、渲染、事件处理和资源管理等方面。 1. 优化加载阶段 减少关键资源请求: 合并CSS/JS文件&a…...
8-游戏详情制作(Navigation组件)
1.1 需求 使用Navigation实现游戏主详情视图,从瀑布流容器中的游戏项(游戏中心首页-游戏瀑布流列表)点击游戏后进入游戏详情页,从游戏详情页可以返回游戏列表主页。 1.2 界面原型 从瀑布流组件进入: 游戏详情&#…...
Unity引擎源码-物理系统详解-其二
继续我们关于Unity的物理系统的源码阅读,不过这一次我们的目标是PhysX引擎——这个Unity写了一堆脚本来调用API的实际用C写成的底层物理引擎。 Github的地址如下:NVIDIA-Omniverse/PhysX: NVIDIA PhysX SDK (github.com) 下载后发现由三个文件组成&…...
1.3.3 数据共享、汇聚和使用中的安全目标
探索数据共享、汇聚与使用中的安全目标 在当今数字化时代,数据的价值愈发凸显,数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而,在这一过程中,数据安全至关重要,我们需要明确并保障保密性、完整性…...
【Docker】Docker安装Redis
目录 1.下载镜像 1.1查看下载的镜像 2.创建挂载目录 3.创建容器并启动 4.测试连接 1.下载镜像 根据指令下载镜像文件 docker pull redis#上面指令是下载最新,如需下载指定版本可带版本号 docker pull redis:xxx 响应内容: 1.1查看下载的镜像 下载完…...
Oc语言学习 —— Foundation框架总结
1、NSString类 我们对一个NSString对象赋值的方法是直接将字符串常量赋给对象,例如:NSString *str "hello"; 因为我们的NSString是不可变的,所以我们只能通过一些方法来在我们原来的字符串后面追加或初始化我们的字符串来间接修改…...
react+html2canvas+jspdf将页面导出pdf
主要使用html2canvasjspdf 1.将前端页面导出为pdf 2.处理导出后图表的截断问题 export default function AIReport() {const handleExport async () > {try {// 需要导出的内容idconst element document.querySelector(#AI-REPORT-CONTAINER);if (!element) {message.err…...
LWIP的Socket接口
Socket接口简介 类似于文件操作的一种网络连接接口,通常将其称之为“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只实现完整Socket的部分功能 netconn是对RAW的封装 Socket是对netconn的封装 SOCKET结构体 struct sockaddr { u8_t sa_len; /* 长…...
基于支持向量机(SVM)的P300检测分类
基于支持向量机(SVM)的P300检测分类MATLAB实现,包含数据预处理、特征提取和分类评估流程: %% P300检测分类完整流程(SVM实现) clc; clear; close all;%% 1. 数据加载与模拟生成(实际应用需替换…...
Better Faster Large Language Models via Multi-token Prediction 原理
目录 模型结构: Memory-efficient implementation: 实验: 1. 在大规模模型上效果显著: 2. 在不同类型任务上的效果: 为什么MLP对效果有提升的几点猜测: 1. 并非所有token对生成质量的影响相同 2. 关…...
51c嵌入式※~合集7~Linux
我自己的原文哦~ https://blog.51cto.com/whaosoft/13926843 一、u-boot和bootloader~区别 Bootloader 比Bootloader从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那…...
Spring的Validation,这是一套基于注解的权限校验框架
为了保证数据的正确性、完整性,作为一名后端开发工程师,不能仅仅依靠前端来校验数据,还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器,处理校验异常 RestControllerAdvice p…...
MySQL - 如何突破单库性能瓶颈
数据库服务器硬件优化 我们来看看对数据库所在的服务器是如何进行优化的,服务器是数据库的宿主,其性能直接影响了数据库的性能,所以服务器的优化也是数据库优化的第一步。 数据库服务器通常是从 CPU、内存、磁盘三个角度进行硬件优化的&…...
基于 Vue 和 Node.js 实现图片上传功能:从前端到后端的完整实践
在开发一个社交分享平台时,图片上传功能是核心需求之一。本文将基于一个旅拍社交分享系统,详细解析其图片上传功能的实现原理和技术细节,包括前端处理、后端接收和数据库存储等环节。 1. 前端图片上传实现 在这个项目中,图片上传…...
go封装将所有数字类型转浮点型,可设置保留几位小数
封装转换方法 /* * * 将类型转浮点型,并保留小数 ToFloat(123, 2) ToFloat(3.5254, 0) */ func ToFloat(value interface{}, precision int) (float64, error) {var f float64var err errorswitch v : value.(type) {case float64:f vcase float32:f float64(v)c…...
Rust 学习笔记:关于 Vector 的练习题
Rust 学习笔记:关于 Vector 的练习题 Rust 学习笔记:关于 Vector 的练习题哪个调用会报错?以下代码能否通过编译?若能,输出是?以下代码能否通过编译?若能,输出是?以下代码…...
Linux 系统异常触发后自动重启配置指南
Linux 系统异常触发后自动重启配置指南 一、内核级自动重启配置 适用于内核崩溃(Kernel Panic)、硬件驱动故障等场景,通过 SysRq 和 Watchdog 实现快速恢复。 1. SysRq 强制重启 功能:通过触发内核崩溃或强制重启,绕…...
apisix透传客户端真实IP(real-ip插件)
文章目录 apisix透传客户端真实IP需求和背景apisix real-ip插件为什么需要 trusted_addresses?安全架构的最佳实践 示例场景apisix界面配置 apisix透传客户端真实IP 需求和背景 当 APISIX 前端有其他反向代理(如 Nginx、HAProxy、云厂商的 LBÿ…...
Oracle 数据库的默认隔离级别
Oracle 数据库的默认隔离级别 默认隔离级别:READ COMMITTED Oracle 默认使用 读已提交(READ COMMITTED) 隔离级别,这是大多数OLTP(在线事务处理)系统的标准选择。 官方文档 https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/da…...
统计客户端使用情况,使用es存储数据,实现去重以及计数
这篇文件的重点在tshark、filebeat、和logstash。 需求:统计客户使用的客户端版本 实现工具:tshark 1.10.14,filebeat 8.17.0,logstash 8.17.0,elasticsearch 8.17.0,kibana 8.17.0 总体设计:…...
代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I
每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra(…...
oracle序列自增问题
1.先查询表名对应的序列名称 SELECT trigger_name, trigger_type, triggering_event FROM all_triggers WHERE table_name 表名;2. 查询id最大值 SELECT MAX(ID) FROM 表名;3. 查询下一次生成ID SELECT SJCJ_ENERGY_DATA_INSERTID.NEXTVAL FROM DUAL;4. 设置临时步长,越过…...
开启健康生活的多元养生之道
健康养生是一门值得终身学习的学问,在追求健康的道路上,除了常见方法,还有许多容易被忽视却同样重要的角度。掌握这些多元养生之道,能让我们的生活更健康、更有品质。 室内环境的健康不容忽视。定期清洁空调滤网,避…...
【Vite】前端开发服务器的配置
定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…...
鸿蒙OSUniApp 制作自定义弹窗与模态框组件#三方框架 #Uniapp
UniApp 制作自定义弹窗与模态框组件 前言 在移动应用开发中,弹窗和模态框是用户交互的重要组成部分,它们用于显示提示信息、收集用户输入或确认用户操作。尽管 UniApp 提供了基础的交互组件如 uni.showModal() 和 uni.showToast(),但这些原…...
Spring Security与Spring Boot集成原理
Spring Security依赖的是过滤器机制,首先是web容器例如tomcat作为独立的产品,本身有自己的一套过滤器机制用来处理请求,那么如何将tomcat接收到的请求转入到Spring Security的处理逻辑呢?spring充分采用了tomcat的拓展机制提供了t…...
VScode各文件转化为PDF的方法
文章目录 代码.py文件.ipynb文本和代码夹杂的文件方法 1:使用 VS Code 插件(推荐)步骤 1:安装必要插件步骤 2:安装 `nbconvert`步骤 3:间接导出(HTML → PDF)本文遇见了系列错误:解决方案:问题原因步骤 1:降级 Jinja2 至兼容版本步骤 2:确保 nbconvert 版本兼容替代…...
精益数据分析(58/126):移情阶段的深度实践与客户访谈方法论
精益数据分析(58/126):移情阶段的深度实践与客户访谈方法论 在创业的漫长旅途中,正确识别和验证问题是成功的第一步。今天,我们继续围绕《精益数据分析》中创业阶段的核心内容,深入探讨移情阶段的关键实践…...
Vue3学习(组合式API——Watch侦听器、watchEffect()详解)
目录 一、Watch侦听器。 (1)侦听单个数据。 (2)侦听多个数据。(数组写法?!) (3)immediate参数。(立即执行回调) (3)deep参数。(深层监…...
【node.js】安装与配置
个人主页:Guiat 归属专栏: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…...
