当前位置: 首页 > news >正文

前端性能基础测试研究

站长之家:
爱资料在线工具,应用网站在线测试

网页加载速度测试

可以使用在线工具,如 Google PageSpeed Insights、Pingdom、WebPageTest 等,来测试网页的加载速度,并给出优化建议。此外,还可以使用浏览器开发者工具(如 Chrome DevTools)来查看页面加载过程中的详细信息,如请求和响应头、DNS解析时间、TCP连接时间、内容加载时间等。

资源加载效率测试

可以使用 Chrome DevTools 中的Audits面板进行资源加载效率测试。该面板可以分析页面加载时的资源请求和响应情况,以及资源加载对页面性能的影响。此外,还可以使用 Lighthouse 等自动化测试工具来对资源加载效率进行评估和优化建议。

页面渲染速度测试

可以使用 Chrome DevTools 中的Timeline面板来记录页面渲染过程中的事件和性能指标,如重绘、重排、JavaScript执行时间等。此外,还可以使用Perfume.js等性能监控库来收集和报告页面渲染速度等指标。

前端性能优化

基于测试结果和分析,可以采取一些优化措施来提升前端性能

  1. 减少HTTP请求和响应的大小,压缩图片、CSS和JavaScript文件等。
  2. 使用CDN加速资源加载。
  3. 优化JavaScript代码,减少不必要的DOM操作和计算。
  4. 使用懒加载和预加载技术,按需加载资源。
  5. 使用缓存策略,如强缓存和协商缓存等。
  6. 使用Web Workers进行后台计算,减轻主线程的负担等。

懒加载

懒加载也称为延迟加载,是指只有当用户滚动到某个元素可见区域时,才开始加载该元素所依赖的资源。这主要应用于长页面中的图片或其他媒体内容,以减少首次加载网页所需的带宽和时间,提高用户体验.
原理:通过监听滚动事件或视口大小变化事件,判断资源是否位于可视范围内,如果是,则触发资源的加载请求

 window.addEventListener('scroll', function() {var images = document.querySelectorAll('.lazy'); // 找到需要懒加载的图片for (var i = 0; i < images.length; i++) {if (isInViewport(images[i])) { // 自定义函数检查图片是否进入可视区images[i].src = images[i].dataset.src; // 设置实际图片地址}}});function isInViewport(element) {const rect = element.getBoundingClientRect();return (rect.top >= 0 &&rect.left >= 0 &&rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&rect.right <= (window.innerWidth || document.documentElement.clientWidth));}

预加载

预加载则是在页面初始化阶段或用户浏览过程中,提前加载预期用户可能需要访问的资源,确保当用户真正请求这些资源时,它们已经存在于浏览器缓存中,可以立即渲染出来.
原理:通常通过创建新的Image对象或使用HTML 标签来发起预加载请求,而不立即插入DOM中

 // 使用Image对象进行预加载var img = new Image();img.src = 'path/to/large-image.jpg'; // 预加载大图// 或者使用HTML链接标签预加载CSS、字体或JavaScript文件// 在<head>部分添加以下代码<link rel="preload" as="image" href="path/to/large-image.jpg"><link rel="preload" as="style" href="styles.css"><link rel="preload" as="script" href="scripts.js">

延迟加载

现代浏览器支持原生的模块系统(ES6 Modules),可以利用import语句异步加载模块

// 当需要时动态导入模块
async function importMyModule() {const myModule = await import('./myModule.js');// 使用加载后的模块myModule.default.someFunction();
}// 调用函数以触发模块加载
importMyModule().catch(error => console.error(error));

动态加载

最基础的按需加载方式是动态创建并插入

function loadScript(url, callback) {var script = document.createElement('script');script.type = 'text/javascript';script.src = url;if (typeof callback !== 'undefined') {// 确保兼容性,为script添加onload事件监听器if (script.readyState) {  // IEscript.onreadystatechange = function () {if (script.readyState === 'loaded' || script.readyState === 'complete') {script.onreadystatechange = null;callback();}};} else {  // 其它浏览器script.onload = function() {callback();};}}document.head.appendChild(script);
}// 使用示例:
loadScript('path/to/script.js', function() {console.log('Script loaded successfully.');
});

缓存策略

主要用于提升应用性能,减少不必要的网络请求,并且通常在浏览器环境中使用

HTTP 缓存策略

强缓存(Cache-Control & Expires):服务器通过响应头告知浏览器资源的有效期,浏览器在有效期内直接从本地缓存中获取资源,不发起网络请求。
1、Cache-Control 字段可以设置 max-age、no-cache、no-store 等指令控制缓存行为。
2、Expires 是一个绝对时间戳,表示资源过期时间。

协商缓存(Last-Modified / If-Modified-Since 与 ETag / If-None-Match)
当强缓存失效时,浏览器会向服务器发送一个条件请求,包含上次获取资源时服务器返回的相关头部信息(如 Last-Modified 或 ETag),服务器根据这些信息判断资源是否已更新。如果没有更新,则返回 304 Not Modified,浏览器使用本地缓存;如果资源已更新,则返回新内容和新的头部信息。

浏览器存储 API 缓存

localStorage:用于长期存储客户端数据,即使页面关闭或浏览器重启后,数据仍然存在,直到手动清除或者达到存储限制。

  localStorage.setItem('key', 'value');var value = localStorage.getItem('key');

sessionStorage:类似于 localStorage,但仅限于当前会话,当浏览器窗口或标签页关闭时,存储的数据将被清除。

  sessionStorage.setItem('key', 'value');var value = sessionStorage.getItem('key');

IndexedDB客户端数据库

一个更复杂但功能强大的客户端数据库,允许存储结构化数据,适合大量数据持久化存储。

打开数据库(Open a Database)
let request = indexedDB.open("myDatabase", 1); // 第一个参数是数据库名称,第二个参数是版本号request.onerror = function(event) {console.error("Error opening IndexedDB database:", event.target.error);
};request.onsuccess = function(event) {let db = event.target.result; // 成功打开后,可以通过event.target.result访问数据库对象console.log("IndexedDB database opened successfully.");// 可以在此处执行数据库操作
};request.onupgradeneeded = function(event) { // 当需要升级数据库时触发let db = event.target.result;if (!db.objectStoreNames.contains("myObjectStore")) { // 如果不存在某个object store,则创建它let objectStore = db.createObjectStore("myObjectStore", { keyPath: "id" }); // 设置主键路径// 可以添加索引(index):objectStore.createIndex("nameIndex", "name", { unique: false });}
};插入数据(Add Data)
let transaction = db.transaction(["myObjectStore"], "readwrite");
let objectStore = transaction.objectStore("myObjectStore");let newItem = {id: 1,name: "John Doe",email: "john.doe@example.com"
};let addRequest = objectStore.add(newItem);addRequest.onsuccess = function(event) {console.log("Data added to the object store:", event.target.result);
};addRequest.onerror = function(event) {console.error("Error adding data:", event.target.error);
};查询数据(Read Data)
let transaction = db.transaction(["myObjectStore"], "readonly");
let objectStore = transaction.objectStore("myObjectStore");let getRequest = objectStore.get(1); // 根据ID获取记录getRequest.onsuccess = function(event) {let result = event.target.result;if (result !== undefined) {console.log("Retrieved data:", result);} else {console.log("No data found for the given ID.");}
};getRequest.onerror = function(event) {console.error("Error reading data:", event.target.error);
};
更新数据(Update Data)let transaction = db.transaction(["myObjectStore"], "readwrite");
let objectStore = transaction.objectStore("myObjectStore");// 获取要更新的数据项
let getAndUpdateRequest = objectStore.get(1);getAndUpdateRequest.onsuccess = function(event) {let recordToUpdate = event.target.result;if (recordToUpdate) {recordToUpdate.email = "new.email@example.com";let updateRequest = objectStore.put(recordToUpdate);updateRequest.onsuccess = function() {console.log("Data updated successfully.");};updateRequest.onerror = function(event) {console.error("Error updating data:", event.target.error);};}
};删除数据(Delete Data)
let transaction = db.transaction(["myObjectStore"], "readwrite");
let objectStore = transaction.objectStore("myObjectStore");let deleteRequest = objectStore.delete(1); // 根据ID删除记录deleteRequest.onsuccess = function() {console.log("Record deleted successfully.");
};deleteRequest.onerror = function(event) {console.error("Error deleting data:", event.target.error);
};

Service Worker 缓存

     // 注册 Service Workernavigator.serviceWorker.register('sw.js');// 在 Service Worker 中使用 Cache API 缓存资源self.addEventListener('install', (event) => {event.waitUntil(caches.open('my-cache-v1').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);}));});

相关文章:

  • Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
  • CUDA下载安装与配置
  • 简单了解TCP/IP四层模型
  • 基于PHP的数字化档案管理系统
  • 接口隔离原则的实现方法及具体应用
  • VScode(Python)使用ssh远程开发(Linux系统树莓派)时,配置falke8和yapf总结避坑!最详细,一步到位!
  • Spring中的注释
  • matplotlib-散点图
  • 2023年第三届中国高校大数据挑战赛第二场赛题C:用户对博物馆评论的情感分析(附上代码与详细视频讲解)
  • SplitFunctions (BOLT) - 优化阅读笔记
  • 实践致知第9享:Word中标题编号无法正常编辑
  • Go微服务实战——服务的配置获取(nacos做配置中心)
  • InnoDB对MVCC的实现
  • 2024年测量技术与传感仪器国际学术会议(ICMTSI 2024)
  • 自动化运维工具Ansible
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • android 一些 utils
  • Android组件 - 收藏集 - 掘金
  • Docker 笔记(2):Dockerfile
  • GraphQL学习过程应该是这样的
  • Java Agent 学习笔记
  • JavaScript学习总结——原型
  • Laravel 中的一个后期静态绑定
  • PAT A1050
  • React系列之 Redux 架构模式
  • springboot_database项目介绍
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 电商搜索引擎的架构设计和性能优化
  • 后端_MYSQL
  • 基于web的全景—— Pannellum小试
  • 聚类分析——Kmeans
  • 扑朔迷离的属性和特性【彻底弄清】
  • 七牛云假注销小指南
  • 前端学习笔记之观察者模式
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 使用API自动生成工具优化前端工作流
  • 首页查询功能的一次实现过程
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信小程序填坑清单
  • kubernetes资源对象--ingress
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT项目实战(天气预报)
  • #微信小程序:微信小程序常见的配置传值
  • $.ajax,axios,fetch三种ajax请求的区别
  • (6)添加vue-cookie
  • (AngularJS)Angular 控制器之间通信初探
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (九)c52学习之旅-定时器
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (四) Graphivz 颜色选择
  • (小白学Java)Java简介和基本配置
  • (学习日记)2024.01.09
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法