[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析
前端性能分析大全
前端性能优化
LightHouse性能评分
性能指标监控分析
浏览器加载资源的全过程性能指标分析
性能指标
在实现性能监控前,先了解Web Vitals涉及的常见的性能指标
Web Vitals 是由 Google 推出的网页用户体验衡量指标体系,旨在帮助开发者量化和优化网页
在实际用户终端上的性能体验
。Web Vitals 强调“以用户为中心
”的度量,而不是纯技术层面的加载时间。
要按 先后顺序(时间维度) 梳理 Web Vitals,可以从网页加载的生命周期出发,把每个指标放入其发生时机对应的阶段中。这样更利于理解用户体验的演变和指标采集的逻辑。
🧭 一、加载过程的五大阶段
[1] 网络响应阶段
[2] 首次渲染阶段
[3] 内容加载阶段
[4] 用户交互阶段
[5] 页面稳定阶段
📊 二、Web Vitals 指标按时间顺序梳理
阶段 | 指标名 | 含义 | 时机 |
---|---|---|---|
1️⃣ 网络响应 | TTFB (Time to First Byte) | 首字节到达 | 浏览器请求后,接收到第一个响应字节 |
2️⃣ 首次渲染 | FCP (First Contentful Paint) | 首次绘制文字/图像 | 页面开始有内容渲染(非白屏) |
3️⃣ 主内容加载 | LCP (Largest Contentful Paint) | 最大可视内容渲染完成 | 用户感知“页面加载完” |
4️⃣ 用户首次交互 | FID (First Input Delay) | 用户首次点击的响应延迟 | 用户第一次交互,直到浏览器处理事件的延迟 |
5️⃣ 页面稳定 | CLS (Cumulative Layout Shift) | 布局跳动 | 页面是否因为图片/广告等加载而抖动 |
🧬 三、时间线图(逻辑顺序)
时间单位为毫秒。
TTFB
最早,CLS
贯穿整个加载过程。
🔁 四、简洁记忆顺序口诀
💡「先 TTFB,见 FCP;看大图,用 LCP;首操作,测 FID;别乱跳,查 CLS」
🛠 五、指标采集时机小贴士
指标 | 采集方式 | 推荐 API |
---|---|---|
TTFB | performance.timing.responseStart - navigationStart | Navigation Timing |
FCP | PerformanceObserver 监听 paint | PerformancePaintTiming |
LCP | PerformanceObserver 监听 largest-contentful-paint | LCP Entry |
FID | 真实用户交互产生的事件延迟 | Event Timing API |
CLS | PerformanceObserver 监听 layout-shift | LayoutShift Entry |
🧭 六、总结为时序流图(Mermaid)
指标监控
PerformanceObserver
PerformanceObserver
是 Performance API 中用于监听性能条目变化的核心工具。它可以在网页运行过程中,异步捕获新生成的性能条目,而不是一开始就调用 performance.getEntries()
拿“旧数据”。
一、PerformanceObserver
的作用
它允许开发者:
- 监听网页运行中
出现的性能条目
(如资源加载、绘制、打点、长任务
等) 做出动态响应
(如打日志
、发送埋点数据
)- 支持指定监听的
entryTypes
,如["resource"]
,["mark", "measure"]
二、使用方式
1. 创建实例
const observer = new PerformanceObserver((list, observer) => {const entries = list.getEntries();for (const entry of entries) {console.log(entry.name, entry.entryType, entry.startTime, entry.duration);}
});
2. 启动监听
observer.observe({entryTypes: ['mark', 'measure', 'resource']
});
entryTypes
是监听的条目类型数组。
三、常用方法
方法 | 说明 |
---|---|
observe(options) | 开始监听性能条目 |
disconnect() | 停止监听 |
takeRecords() | 获取当前缓冲区的所有性能条目并清空缓冲区 |
四、选项说明
observe(options)
observer.observe({entryTypes: ['resource', 'paint']
});
或使用过时写法(不推荐
):
observer.observe({type: 'resource',buffered: true
});
参数说明:
entryTypes
: 性能条目的类型(推荐)type
: 单一类型(不推荐)buffered
: 是否包括已存在的历史条目(true
会包含之前的记录)
五、支持的 entryType(性能条目类型)
类型 | 含义 |
---|---|
resource | 外部资源加载耗时 |
mark | 用户自定义打点 |
measure | 用户定义的测量点 |
paint | 首次绘制(first-paint, first-contentful-paint) |
navigation | 页面导航 |
longtask | 长任务(如 JS 卡顿) |
element | 关键可视元素曝光(需要配置) |
largest-contentful-paint | 最大内容绘制时间 |
layout-shift | 布局偏移(CLS) |
六、典型使用场景
- 监听
资源加载情况
(如 img、script) - 监听
FCP、LCP、CLS、Long Tasks
,用于Web Vitals 性能分析
- 异步
获取自定义打点结果
- 在 SPA 页面做
性能埋点
七、注意事项
PerformanceObserver
是异步
的:不会立即收到记录。- 使用
buffered: true
可获取已经发生的记录(旧数据
),用于首次加载打点。 - 页面进入后台或关闭时,需要调用
takeRecords()
收集剩余数据。 - 一些条目需要在支持的浏览器中开启对应实验性特性(如
longtask
)。
八、Mermaid 类图详解 PerformanceObserver
九、具体实现
import { lazyReportBatch } from '../report';
const originalFetch = window.fetch;
function overwriteFetch() {window.fetch = function newFetch(url, config) {const startTime = Date.now();const reportData = {type: 'performance',subType: 'fetch',url,startTime,method: config.method,}return originalFetch(url, config).then((res) => {const endTime = Date.now();reportData.endTime = endTime;reportData.duration = endTime - startTime;const data = res.clone();reportData.status = data.status;reportData.success = data.ok;// todo 上报数据lazyReportBatch(reportData);return res;}).catch((err) => {const endTime = Date.now();reportData.endTime = endTime;reportData.duration = endTime - startTime;reportData.status = 0;reportData.success = false;// todo 上报数据lazyReportBatch(reportData);});}
}
export default function fetch() {overwriteFetch();
}
//监控FP
import { lazyReportBatch } from '../report';
export default function observerPaint() {const entryHandler = (list) => {for (const entry of list.getEntries()) {if (entry.name === 'first-paint') {observer.disconnect();const json = entry.toJSON();console.log(json);const reportData = {...json,type: 'performance',subType: entry.name,pageUrl: window.location.href,}// 发送数据 todo;lazyReportBatch(reportData);}}}// 统计和计算fp的时间const observer = new PerformanceObserver(entryHandler);// buffered: true 确保观察到所有paint事件observer.observe({type: 'paint', buffered: true});}
//监控FCP
import { lazyReportBatch } from '../report';
export default function observerFCP() {const entryHandler = (list) => {for (const entry of list.getEntries()) {if (entry.name === 'first-contentful-paint') {observer.disconnect();const json = entry.toJSON();console.log(json);const reportData = {...json,type: 'performance',subType: entry.name,pageUrl: window.location.href,}// 发送数据 todo;lazyReportBatch(reportData);}}}// 统计和计算fcp的时间const observer = new PerformanceObserver(entryHandler);// buffered: true 确保观察到所有paint事件observer.observe({type: 'paint', buffered: true});
}
//监控LCP
import { lazyReportBatch } from '../report';
export default function observerLCP() {if (typeof PerformanceObserver === 'undefined' ||!PerformanceObserver.supportedEntryTypes.includes('largest-contentful-paint')) {console.warn('LCP not supported in this browser.');return;}const entryHandler = (list,observer) => {if (observer) {observer.disconnect();} for (const entry of list.getEntries()) {const json = entry.toJSON();//console.log(json);const reportData = {...json,type: 'performance',subType: entry.name,pageUrl: window.location.href,}console.log(reportData);// 发送数据 todo;//lazyReportBatch(reportData);}}// 统计和计算lcp的时间const observer = new PerformanceObserver(entryHandler);// buffered: true 确保观察到所有paint事件observer.observe({type: 'largest-contentful-paint', buffered: true});
}
import { lazyReportBatch } from '../report';
export default function observerLoad () {window.addEventListener('pageShow', function (event) {requestAnimationFrame(() =>{['load'].forEach((type) => {const reportData = {type: 'performance',subType: type,pageUrl: window.location.href,startTime: performance.now()- event.timeStamp}// 发送数据lazyReportBatch(reportData);});}, true);});
}import { lazyReportBatch } from '../report';
export const originalProto = XMLHttpRequest.prototype;
export const originalSend = originalProto.send;
export const originalOpen = originalProto.open;function overwriteOpenAndSend() {originalProto.open = function newOpen(...args) {this.url = args[1];this.method = args[0];originalOpen.apply(this, args);}originalProto.send = function newSend(...args) {this.startTime = Date.now();const onLoaded = () => {this.endTime = Date.now();this.duration = this.endTime - this.startTime;const { url, method , startTime, endTime, duration, status} = this;const reportData = {status,duration,startTime,endTime,url,method: method.toUpperCase(),type: 'performance',success: status >= 200 && status < 300,subType: 'xhr'}// todo 发送数据lazyReportBatch(reportData);this.removeEventListener('loadend', onLoaded, true);}this.addEventListener('loadend', onLoaded, true);originalSend.apply(this, args);}}
export default function xhr() {overwriteOpenAndSend();
}
十、其他实现:Web Vitals
其他实现
:Web Vitals 是 Google 提出的一组衡量网站用户体验关键质量的指标,特别关注 加载性能、交互响应、视觉稳定性。
监控上报(⭐)
数据上报
有三种
上报方式:
- imgRequest:以
图片
打点的方式 - beaconRequest:通过
navigator.sendBeacon
发送 - xhrRequest:使用
XMLHttpRequest
(兼容方式)
如果使用 lazyReportBatch,则会缓存数据并按批量上传
。多数请求都通过 requestIdleCallback
实现性能友好的空闲发送
。
import config from './config';
import {generateUniqueId} from './utils';
import {addCache, getCache, clearCache} from './cache';
export const originalProto = XMLHttpRequest.prototype;
export const originalOpen = XMLHttpRequest.prototype.open;
export const originalSend = XMLHttpRequest.prototype.send;
export function isSupportSendBeacon() {return 'sendBeacon' in navigator;
}
export function report(data) {if (!config.url) {console.error('请设置上传 url 地址');}const reportData = JSON.stringify({id: generateUniqueId(),data,});// 上报数据,使用图片的方式if (config.isImageUpload) {imgRequest(reportData);} else {// 优先使用 sendBeaconif (window.navigator.sendBeacon) {return beaconRequest(reportData);} else {xhrRequest(reportData);}}
}
// 批量上报数据
export function lazyReportBatch(data) {addCache(data);const dataCache = getCache();console.log('dataCache', dataCache);if (dataCache.length && dataCache.length > config.batchSize) {report(dataCache);clearCache();}//
}
// 图片发送数据
export function imgRequest(data) {const img = new Image();// http://127.0.0.1:8080/api?data=encodeURIComponent(data)img.src = `${config.url}?data=${encodeURIComponent(JSON.stringify(data))}`;
}
// 普通ajax发送请求数据
export function xhrRequest(data) {if (window.requestIdleCallback) {window.requestIdleCallback(() => {const xhr = new XMLHttpRequest();originalOpen.call(xhr, 'post', config.url);originalSend.call(xhr, JSON.stringify(data));},{ timeout: 3000 });} else {setTimeout(() => {const xhr = new XMLHttpRequest();originalOpen.call(xhr, 'post', url);originalSend.call(xhr, JSON.stringify(data));});}
}// const sendBeacon = isSupportSendBeacon() ? navigator.sendBeacon : xhrRequest
export function beaconRequest(data) {if (window.requestIdleCallback) {window.requestIdleCallback(() => {window.navigator.sendBeacon(config.url, data);},{ timeout: 3000 });} else {setTimeout(() => {window.navigator.sendBeacon(config.url, data);});}
}
Lighthouse
Lighthouse 是 Google 提供的一个开源自动化网站审计工具,主要用于评估 Web 页面在性能、可访问性、最佳实践、SEO 和 PWA(渐进式 Web 应用)等方面的表现。它可以直接在 Chrome 浏览器的 DevTools(开发者工具)中使用,也可以通过 Node.js 命令行运行,甚至集成到 CI/CD 流程中。
下面是对 Lighthouse 工具的详解:
🔧 一、Lighthouse 使用方式
1. Chrome DevTools 中使用
- 打开 Chrome 浏览器
- 按 F12 或右键 → 检查,打开开发者工具
- 切换到 “Lighthouse” 标签页
- 选择你要评估的维度(Performance、Accessibility、Best Practices、SEO、PWA)
- 选择设备类型(Mobile 或 Desktop)
- 点击 “Analyze page load” 开始分析
2. 命令行工具
安装 Node.js 后执行:
npm install -g lighthouse
lighthouse https://example.com --view
📊 二、Lighthouse 的评估维度详解
1. 📈 Performance(性能)
评估页面加载速度和交互体验。核心指标包括:
- First Contentful Paint (FCP):首屏内容出现时间
- Largest Contentful Paint (LCP):最大内容元素加载时间
- Speed Index:页面可见内容加载速度
- Time to Interactive (TTI):页面完全可交互的时间
- Total Blocking Time (TBT):页面阻塞时间
- Cumulative Layout Shift (CLS):视觉稳定性变化程度
👉 建议:压缩资源、懒加载图片、使用缓存、减少 JS 体积等
2. ♿ Accessibility(可访问性)
检测网站对残障人士的友好程度:
- 图像是否有合适的
alt
标签 - 表单元素是否有标签
- 颜色对比度是否足够
- 使用 ARIA 属性
👉 建议:为每个交互元素提供语义标签、颜色对比度符合标准
3. 📐 Best Practices(最佳实践)
检测网站是否符合现代 Web 开发规范:
- 使用 HTTPS
- 避免使用过时的 API
- 图片格式是否优化
- 是否防止 XSS
👉 建议:尽量使用现代 Web API、安全连接和资源优化策略
4. 🔍 SEO(搜索引擎优化)
评估页面对搜索引擎的友好程度:
- 页面是否有
title
、meta description
- 使用语义化 HTML 标签
- 页面是否可爬取
- viewport 是否设置
👉 建议:符合基础 SEO 规范,并确保结构良好
5. 📦 Progressive Web App(PWA)
检测是否符合 PWA 应用标准(如可离线使用、安装到桌面):
- 是否注册了 Service Worker
- 是否提供 Web App Manifest
- 是否支持离线缓存
👉 建议:适合构建高可靠性、接近原生体验的 Web 应用场景
📁 三、Lighthouse 报告详解
生成报告后包含如下信息:
- 分数评分:每个维度都是 0-100 分
- 诊断信息:详细列出存在的问题
- 建议改进:如何提升每项得分
- 详细资源信息:如阻塞时间的脚本、加载顺序等
🔄 四、常见优化建议
问题 | 建议优化方式 |
---|---|
FCP 慢 | 使用 CDN、预加载字体、图片压缩 |
LCP 慢 | 懒加载、预渲染关键内容 |
TTI 高 | 减少 JS 文件大小、优化主线程执行时间 |
CLS 高 | 给图片/iframe 设置固定尺寸,避免动态插入内容 |
🧪 五、集成到 CI/CD 中
可使用 lighthouse-ci
进行自动化测试:
npm install -g @lhci/cli
lhci autorun
可将分数设置为门槛,发布前必须达到指定分值。
🧠 总结
模块 | 目的 | 分数建议 |
---|---|---|
Performance | 用户体验核心 | ≥90 |
Accessibility | 对所有用户友好 | ≥90 |
Best Practices | 遵循标准 | ≥90 |
SEO | 搜索可见性 | ≥90 |
PWA | 应用体验 | ≥70(视业务而定) |
六、案例: 个人网站
相关文章:

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析
前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前,先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系,旨在帮助开发者量…...

React-native的新架构
本文总结: 文章主要介绍了 React Native 的新架构,包括以下几个方面的内容:📱✨ 如何抹平 iOS 和 Android 样式差异,提升跨平台一致性; 分析了旧架构中存在的问题,如通信瓶颈、启动慢、维护复杂等&#x…...
【Android】MT6835 + MT6631 WiFi进入Meta模式出现WiFi_HQA_OpenAdapter failed
问题描述 WiFi进入Meta异常,出现WiFi_HQA_OpenAdapter failed [ 12.694501] mtk_wmtd_worker: [name:wlan_drv_gen4m_6835&][wlan][710]wlanProbeSuccessForLowLatency:(INIT INFO) LowLatency(ProbeOn) [ 12.699854] ccci_fsm: [name:ccci_md_all&][ccci1/fsm]M…...

Git 全平台安装指南:从 Linux 到 Windows 的详细教程
目录 一、Git 简介 二、Linux 系统安装指南 1、CentOS/RHEL 系统安装 2、Ubuntu/Debian 系统安装 3、Windows 系统安装 四、安装后配置(后面会详细讲解,现在了解即可) 五、视频教程参考 一、Git 简介 Git 是一个开源的分布式版本控制系…...

Tree 树形组件封装
整体思路 数据结构设计 使用递归的数据结构(TreeNode)表示树形数据每个节点包含id、name、可选的children数组和selected状态 状态管理 使用useState在组件内部维护树状态的副本通过deepCopyTreeData函数进行深拷贝,避免直接修改原始数据 核…...

AI书签管理工具开发全记录(五):后端服务搭建与API实现
文章目录 AI书签管理工具开发全记录(四):后端服务搭建与API实现前言 📝1. 后端框架选型 🛠️2. 项目结构优化 📁3. API路由设计 🧭分类管理书签管理 4. 数据模型定义 💾分类模型&…...

netTAP 100:在机器人技术中将 POWERLINK 转换为 EtherNet/IP
工业机器人服务专家 年轻的 More Robots 公司成立仅一年多,但其在许多应用领域的专业技术已受到广泛欢迎。这是因为More Robots提供 360 度全方位服务,包括从高品质工业机器人和协作机器人到咨询和培训。这包括推荐适合特定任务或应用的机器人࿰…...

多模态大语言模型arxiv论文略读(九十八)
Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文标题:Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ➡️ 论文作者:Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…...

EXCEL--累加,获取大于某个值的第一个数
一、函数 LET(data,A1:A5,cumSum,SCAN(0,data,LAMBDA(a,b,ab)),idx,MATCH(TRUE,cumSum>C1,0),INDEX(data,idx)) 二、函数拆解 1、LET函数:LET(name1, value1, [name2, value2, ...], calculation) name1, name2...:自定义的变量名(需以字…...
【vscode】切换英文字母大小写快捷键如何配置
按 ⌘(Command) Shift P 打开命令面板搜索 "Transform to Uppercase" 或 "Transform to Lowercase" 点击Transform to Uppercase 命令后的齿轮图标 进入设置页面 然后就可以进行配置了 比如我是mac电脑, 切换大写可以配置为 shift alt…...
vue笔记-路由
文章目录 createWebHistory的使用router-linkrouter-link颜色是黑色,正常应该是蓝色router-link 跳转了但是不展示 其他 vue这个题目还是太大,路由单独拆出来。 createWebHistory的使用 推荐在vue-router4中使用。 1、导入。 import { createRouter, c…...

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】
文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址:Ollama 官网下载很慢,甚至出现了下载完显示 无法下载,需要授权 目…...
域名解析怎么查询?有哪些域名解析查询方式?
在互联网的世界里,域名就像是我们日常生活中的门牌号,帮助我们快速定位到想要访问的网站。而域名解析则是将这个易记的域名转换为计算机能够识别的IP地址的关键过程。当我们想要了解一个网站的域名解析情况,或者排查网络问题时,掌…...

win主机如何结束正在执行的任务进程并重启
最近遇到一个问题,一个java入库程序经常在运行了几个小时之后消息无法入库,由于已经没有研发人员来维护这个程序了,故此只能每隔一段时间来重启这个程序以保证一直有消息入库。 但是谁也不能保证一直有人去看这个程序,并且晚上也不…...

maven中的maven-resources-plugin插件详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 一、插件定位与核心功能 maven-resources-plugin是Maven构建工具的核心插件之一,主要用于处理项目中的资源文件(如…...

ROS云课基础篇-01-Linux-250529
ROS云课基础篇收到了很多反馈,正面评价比例高,还有很多朋友反馈需要写更具体一点。 ROS云课基础篇极简复习-C、工具、导航、巡逻一次走完-CSDN博客 于是,有了这篇以及之后的案例,案例均已经测试过8年,但没有在博客公…...
通俗易懂解析:@ComponentScan 与 @MapperScan 的异同与用法
在 Spring 和 MyBatis 集成开发中,ComponentScan 和 MapperScan 是两个核心注解,但它们的用途和工作机制截然不同。本文将通过通俗的语言和示例代码,带您轻松掌握它们的区别和使用方法。 一、基础概念 ComponentScan:Spring 的“通…...

深入了解 C# 异步编程库 AsyncEx
在现代应用程序开发中,异步编程已经成为提升性能和响应能力的关键,尤其在处理网络请求、I/O 操作和其他耗时任务时,异步编程可以有效避免阻塞主线程,提升程序的响应速度和并发处理能力。C# 提供了内建的异步编程支持(通…...
NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制
✅ 1.1 Node.js 的事件循环原理?如何处理异步操作? 面试官您好,我理解事件循环是 Node.js 的异步非阻塞编程核心。 Node.js 构建在 V8 引擎与 libuv 库之上。虽然 Node.js 是单线程模型,但它通过事件循环(event loop&a…...

Vulhub靶场搭建(Ubuntu)
前言:Vulhub 是一个开源的漏洞靶场平台,全称是 Vulhub: Vulnerable Web Application Environments,主要用于学习和复现各类 Web 安全漏洞。它的核心特征是通过 Docker 环境快速搭建出带有特定漏洞的靶场系统,适合渗透测试学习者、…...

C++:参数传递方法(Parameter Passing Methods)
目录 1. 值传递(Pass by Value) 2. 地址传递(Pass by Address) 3. 引用传递(Pass by Reference) 数组作为函数参数(Array as Parameter) 数组作为函数返回值 什么是函数ÿ…...

大语言模型的推理能力
2025年,各种会推理的AI模型如雨后春笋般涌现,比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql,我们可能忍受模型的得到正确答案需要更多…...
基于BERT和GPT2的实现来理解Transformer的结构和原理
Transformer 核心就是编码器和解码器,简单理解:编码器就是特征提取,解码器就是特征还原。 Transformer 完整架构 Transformer最初是一个Encoder-Decoder架构,用于机器翻译任务: 输入序列 → [Encoder] → 编码表示…...
.net consul服务注册与发现
.NET中Consul服务注册与发现的技术实践 在微服务架构中,服务的注册与发现是至关重要的环节,它能帮助各个服务之间实现高效的通信和协作。Consul作为一款功能强大的工具,为我们提供了优秀的服务注册与发现解决方案。今天,我们就来…...
WifiEspNow库函数详解
WifiEspNow库 项目地址https://github.com/yoursunny/WifiEspNow WifiEspNow 是 ESP-NOW 的 Arduino 库,ESP-NOW 是乐鑫定义的无连接 WiFi 通信协议。 有关 ESP-NOW 工作原理及其限制的更多信息,请参阅 ESP-NOW 参考。 WifiEspNow是 ESP-IDF 中 ESP-N…...
rsync使用守护进程启动服务
rsync 本身通常使用 SSH(Secure Shell)协议来进行数据传输,因此它默认使用 SSH 的端口 22。如果使用 rsync 进行通过 SSH 的数据同步,它会通过端口 22 来建立连接。 然而,如果你使用 rsync 作为一个守护进程进行文件同步(即不通过 SSH),则可以配置它使用 TCP 端口 873…...
React 核心概念与生态系统
1. React 简介 React 是由 Facebook 开发并开源的一个用于构建用户界面的 JavaScript 库。它主要用于构建单页应用(SPA),其核心理念是组件化和声明式编程,即 ui render(data)。 2. 核心特点 2.1. 声明式编程 React 使用声明式…...
使用React Native开发新闻资讯类鸿蒙应用的准备工作
以下是一篇关于使用React Native开发新闻资讯类鸿蒙应用的准备工作指南,结合鸿蒙生态特性与React Native技术栈整合要点: 一、环境搭建与工具链配置 基础依赖安装 Node.js 18:需支持ES2020语法(如可选链操…...
node-sass 报错
背景:一些老项目使用"node-sass": “^4.14.1” ,node版本要求 14.x,高版本不兼容 解决方案如下: 方案一:替换安装sass (无须降级Node版本) 卸载node-sass npm uninstall node-sass安装sass(Dart…...

Redis的安装与使用
网址:Spring Data Redis 安装包:Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务(注意:每次客户端连接都有先打开服务!!!) 按ctrlC退出服务 客户端连接…...