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

决战浏览器渲染:减少重绘(Repaint)与重排(Reflow)的性能优化策略

在现代Web开发中,流畅的用户体验是衡量应用质量的关键指标之一。用户与界面的每一次交互,背后都牵动着浏览器复杂而精密的渲染过程。当这个过程不够高效时,用户就会感受到卡顿、延迟,甚至页面“掉帧”。在众多影响渲染性能的因素中,重排(Reflow / Layout)重绘(Repaint / Paint) 是两个核心且代价高昂的操作。理解它们、识别它们、并最终有效地减少它们,是前端性能优化攻坚战中的重要一役。

本文将带你深入浏览器渲染的幕后,剖析重排与重绘的原理、触发条件,并分享一系列经过实战检验的优化策略,助你打造如丝般顺滑的应用界面。

一、浏览器渲染流水线:重排与重绘的舞台

在我们深入探讨重排和重绘之前,先快速回顾一下浏览器将HTML、CSS和JavaScript转化为屏幕像素的大致流程:

  1. 解析(Parsing): 浏览器解析HTML文档,构建DOM树(Document Object Model)。同时解析CSS,构建CSSOM树(CSS Object Model)
  2. 样式计算(Style Calculation): 结合DOM树和CSSOM树,计算出每个DOM节点最终应用的样式。
  3. 布局(Layout / Reflow): 根据计算好的样式,浏览器计算每个节点在屏幕上的精确位置和尺寸(几何信息)。这个过程也称为回流重排。输出的是一个“布局树”或“渲染树”(Render Tree),只包含可见元素及其布局信息。
  4. 绘制(Paint / Repaint): 浏览器根据布局树和计算好的样式,将元素绘制成屏幕上的实际像素。这个过程涉及将元素的视觉内容(颜色、边框、阴影等)绘制到多个“绘制层”(Paint Layers)上。
  5. 合成(Compositing): 浏览器将多个绘制层按照正确的顺序合并,最终显示在屏幕上。对于利用GPU加速的特定CSS属性(如transform, opacity),合成阶段可以直接在GPU上高效完成,绕过CPU的布局和绘制,从而显著提升性能。

重排(Reflow)发生在第3步(布局),重绘(Repaint)发生在第4步(绘制)。 它们是渲染流水线中与元素几何属性和视觉外观直接相关的关键环节。

二、理解“代价昂贵”:为何要关注重排与重绘?

1. 重排(Reflow / Layout) - 牵一发而动全身

什么是重排? 当DOM元素的几何属性(如宽度、高度、边距、填充、边框、位置、字体大小等)发生变化,或者DOM结构发生改变(添加、删除节点),导致浏览器需要重新计算元素及其子元素、甚至整个文档的布局时,这个过程就是重排。

为何代价昂贵?

  • 计算密集: 需要确定所有相关节点的大小和位置,涉及大量的几何计算。
  • 影响范围广: 一个元素的重排通常会影响其祖先节点、兄弟节点以及后续节点,甚至可能导致整个页面布局的重新计算。就像移动了书架上的一本书,可能需要调整旁边所有书的位置。
  • 阻塞主线程: 重排是同步发生的,会阻塞JavaScript执行和用户交互,直到布局计算完成。频繁或大规模的重排是导致页面卡顿的主要元凶之一。

常见触发重排的操作:

  • 添加或删除可见的DOM元素。
  • 元素内容改变,影响了尺寸(如文本变化、图片大小变化)。
  • 元素尺寸改变(修改width, height, padding, margin, border等)。
  • CSS 动画/过渡,如果改变了布局属性。
  • 获取某些布局相关的DOM属性,如offsetTop, offsetLeft, offsetWidth, offsetHeight, scrollTop, scrollLeft, scrollWidth, scrollHeight, clientTop, clientLeft, clientWidth, clientHeight, getComputedStyle() (在某些情况下)。这被称为强制同步布局(下面会详述)。
  • 窗口resize事件。
  • 修改浏览器默认字体大小。

2. 重绘(Repaint / Paint) - 描绘视觉变化

什么是重绘? 当元素的视觉外观发生改变(如颜色、背景色、可见性visibility, outline等),但其布局(几何属性)没有变化时,浏览器会跳过布局阶段,直接进入绘制阶段,重新绘制该元素及其影响区域的像素。

为何也需关注? 虽然重绘的开销通常小于重排(因为它不涉及几何计算),但它仍然需要在CPU上进行绘制操作,并将结果传递给GPU。频繁或大面积的重绘同样会消耗资源,影响性能。

重要关系:重排必然导致重绘,但重绘不一定需要重排。 改变元素尺寸(重排)后,其外观自然也需要重新绘制。但只改变背景颜色(重绘),通常不需要重新计算布局。

常见触发重绘的操作:

  • 改变color, background-color, outline, visibility, text-decoration等不影响布局的样式。
  • 所有触发重排的操作,最终也会触发重绘。

三、性能杀手:强制同步布局(Forced Synchronous Layout)

浏览器为了优化性能,通常会将多次可能触发重排/重绘的操作“暂存”起来,然后在某个时间点(通常是当前JavaScript任务结束前或下一帧渲染前)进行一次批处理。这被称为异步布局/渲染

然而,如果在修改了可能导致重排的样式之后,立即在JavaScript中读取需要依赖最新布局信息的属性(如offsetHeight, clientWidth等),浏览器为了返回准确的值,就不得不立即执行布局(Reflow)操作,强制清空“暂存”队列并进行计算。这就是强制同步布局

糟糕的模式(读写循环):

const element = document.getElementById('myElement');// 假设我们想让元素高度等于其宽度
// 每次循环都 读取 -> 写入 -> 读取 -> 写入...
for (let i = 0; i < 100; i++) {// 写入:改变可能影响布局的样式 (假设改变宽度会影响高度,或者反之)element.style.width = (element.offsetWidth + 1) + 'px'; // 读取 offsetWidth -> 强制布局// 读取:又读取一个布局属性 (即使这里没用,读取本身就会触发)console.log(element.offsetHeight); // 再次强制布局 (如果上次写入改变了高度)
}
// 结果:可能触发了 100 次甚至更多的强制同步布局!非常低效!

为何是杀手? 它打破了浏览器的优化机制,将本可以批量处理的布局计算变成了多次同步、阻塞的操作,导致JavaScript执行时间大大延长,页面卡顿。

四、实战优化策略:驯服重排与重绘

理解了原理和痛点,接下来就是如何行动。以下是一些核心的优化策略:

1. 减少DOM操作的频率和范围

  • 批量处理DOM更改: 如果需要多次修改DOM(添加、删除、更新),尽量一次性完成。
    • 使用 DocumentFragment 创建一个文档片段作为临时容器,在片段中进行所有DOM操作,最后将整个片段一次性插入到主DOM中。这只会触发一次重排。
    const fragment = document.createDocumentFragment();
    for (let i = 0; i < 10; i++) {const newItem = document.createElement('li');newItem.textContent = `Item ${i}`;fragment.appendChild(newItem);
    }
    document.getElementById('myList').appendChild(fragment); // 只在这里触发一次重排/重绘
    
    • 隐藏元素再操作: 对于已在DOM中的元素,可以先将其 display: none(触发一次重排),然后进行多次修改,最后再恢复显示(又一次重排)。总共两次重排,优于每次修改都触发。
  • 拷贝操作: 如果需要对某个节点做大量修改,可以先克隆它 (cloneNode()),在克隆节点上操作,然后替换掉原始节点。

2. 优化CSS,拥抱合成层(Compositor Layers)

  • 避免使用Table布局: Table布局计算复杂,一个小改动可能导致整个表格重排。优先使用Flexbox或Grid布局。
  • 精简CSS选择器: 虽然现代浏览器在这方面优化得很好,但过于复杂的选择器仍可能轻微增加样式计算时间。保持选择器简洁高效总没错。
  • 使用 transformopacity 进行动画/过渡: 这是最重要的CSS优化技巧之一transform (位移、旋转、缩放) 和 opacity (透明度) 的改变,通常可以被浏览器优化到合成层上处理。这意味着它们不会触发重排或重绘,而是直接由GPU处理图层的变换和混合,效率极高。
    /* 不好的方式:使用 top/left 触发重排 */
    .animate-bad {position: absolute;transition: top 0.3s, left 0.3s;
    }
    .animate-bad:hover {top: 50px;left: 50px;
    }/* 好的方式:使用 transform 触发合成 */
    .animate-good {transition: transform 0.3s;
    }
    .animate-good:hover {transform: translate(50px, 50px);
    }
    
  • 使用 will-change 属性(谨慎使用): 提前告知浏览器某个元素的某些属性可能会发生变化,让浏览器有机会进行预优化,比如提前将其提升到独立的合成层。
    .element-about-to-animate {will-change: transform, opacity;
    }
    
    注意: 不要滥用 will-change。过度使用会消耗更多内存,因为它强制浏览器创建合成层。只在确实需要优化动画且效果明显的元素上使用,并在动画结束后移除该属性(如果可能)。

3. 优化JavaScript执行

  • 避免强制同步布局: 这是必须遵守的黄金法则。遵循“读写分离”原则:
    • 批量读取: 在进行任何写操作之前,将所有需要读取的布局信息(如 offsetWidth, scrollTop等)一次性读出并存储在变量中。
    • 批量写入: 然后,根据读取到的值,进行所有DOM或样式的修改。
    // 好的模式:读写分离
    const element = document.getElementById('myElement');
    const currentWidth = element.offsetWidth; // 先读取
    const currentHeight = element.offsetHeight; // 再读取// 然后进行所有写操作
    element.style.width = (currentWidth + 10) + 'px';
    element.style.height = (currentHeight * 1.1) + 'px';
    element.style.color = 'red'; // 这个是重绘,但也一起做了
    // 这样,即使修改了多个样式,浏览器也更有可能将它们合并为一次重排/重绘
    
  • 使用 requestAnimationFrame (rAF) 执行动画: 对于JavaScript驱动的动画,应使用rAF而不是setTimeoutsetIntervalrAF能确保你的动画更新函数在浏览器下一次重绘之前执行,与浏览器的刷新率同步,避免不必要的计算和渲染,使动画更流畅。
    function stepAnimation() {// 更新动画状态...updateElementStyle();if (animationIsRunning) {requestAnimationFrame(stepAnimation);}
    }
    requestAnimationFrame(stepAnimation); // 启动动画
    
  • 对高频事件(resize, scroll, input等)进行节流(Throttling)或防抖(Debouncing): 这些事件可能在短时间内触发非常多次,如果事件处理函数中包含重排或重绘操作,会造成严重性能问题。使用节流(保证一定时间间隔内最多执行一次)或防抖(事件停止触发后一段时间再执行)来限制处理函数的执行频率。

4. 利用工具诊断

  • Chrome DevTools - Performance 面板:
    • 录制一段时间的操作,查看火焰图 (Flame Chart) 中的 Layout (紫色) 和 Painting (绿色) 部分。长条表示耗时较长的操作,是优化的重点。
    • 留意 Recalculate Style (紫色) 和 Update Layer Tree (紫色) 事件。
    • 寻找红色三角警告,通常表示发生了强制同步布局(Forced Reflow)。点击可以查看调用栈,定位问题代码。
  • Chrome DevTools - Rendering (渲染) 标签页 (通常在 More tools 里):
    • 勾选 Paint flashing:页面上发生重绘的区域会以绿色高亮显示,可以直观看到哪些操作触发了哪些区域的重绘。
    • 勾选 Layout Shift Regions:页面上发生布局变化的区域会以蓝色高亮显示。这对于调试累积布局偏移(CLS - Cumulative Layout Shift)指标尤其有用。

五、总结:性能优化的持续战争

浏览器渲染是一个精密的过程,重排和重绘是其中不可避免但可以被有效管理的环节。优化它们并非一劳永逸,而是在开发过程中需要持续关注的实践。

核心要点回顾:

  • 理解重排(布局计算)和重绘(像素绘制)的触发条件和性能代价。
  • 最小化DOM操作,利用DocumentFragment或隐藏元素进行批量修改。
  • **优先使用transformopacity**进行动画和视觉变换,利用合成层优势。谨慎使用will-change
  • 坚决避免强制同步布局,遵循“读写分离”原则。
  • 使用requestAnimationFrame处理JS动画,对高频事件进行节流/防抖。
  • 利用DevTools等工具进行诊断和验证优化效果。

通过将这些策略融入日常开发习惯,你就能更从容地应对这场“决战”,为用户打造出更加流畅、响应迅速的Web体验。


相关文章:

决战浏览器渲染:减少重绘(Repaint)与重排(Reflow)的性能优化策略

在现代Web开发中&#xff0c;流畅的用户体验是衡量应用质量的关键指标之一。用户与界面的每一次交互&#xff0c;背后都牵动着浏览器复杂而精密的渲染过程。当这个过程不够高效时&#xff0c;用户就会感受到卡顿、延迟&#xff0c;甚至页面“掉帧”。在众多影响渲染性能的因素中…...

深度解析生成对抗网络:原理、应用与未来趋势

在人工智能的浩瀚星空中&#xff0c;生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;犹如一颗璀璨的明星&#xff0c;自 2014 年由 Ian Goodfellow 等人提出以来&#xff0c;便以其独特而强大的生成能力&#xff0c;在计算机视觉、自然语…...

电能质量治理解决方案:构建高效、安全的电力系统

随着“双碳”目标的推进及新型电力系统的快速发展&#xff0c;大量电力电子设备&#xff08;如光伏逆变器、充电桩、变频器等&#xff09;接入电网&#xff0c;导致谐波畸变、无功功率激增、电压波动等问题日益突出。电能质量恶化不仅威胁设备安全&#xff0c;还影响电网稳定运…...

生态篇|多总线融合与网关设计

引言 1. 车内多总线概览 2. 主流车载总线技术对比 3. 网关设计原则与架构 4. 协议转换与映射策略 5. 安全与诊断功能集成...

热门与冷门并存,25西电—电子工程学院(考研录取情况)

1、电子工程学院各个方向 2、电子工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、电子科学与技术25年相较于24年上升20分 2、信息与通信工程、控制科学与工程、新一代电子信息技术&#xff08;专硕&#xff09;25年相较于24年下降25分 3、25vs24推…...

HDFS入门】HDFS安全与权限管理解析:从认证到加密的完整指南

目录 引言 1 认证与授权机制 1.1 Kerberos认证集成 1.2 HDFS ACL细粒度控制 2 数据加密保护 2.1 传输层加密(SSL/TLS) 2.2 静态数据加密 3 审计与监控体系 3.1 操作审计流程 3.2 安全监控指标 4 权限模型详解 4.1 用户/组权限模型 4.2 umask配置原理 5 安全最佳实…...

合成数据中的对抗样本生成与应用:让AI模型更强、更稳、更安全

目录 合成数据中的对抗样本生成与应用&#xff1a;让AI模型更强、更稳、更安全 一、什么是对抗样本&#xff1f; 二、为什么要在合成数据中引入对抗样本&#xff1f; 三、对抗样本在图像合成数据中的生成方法 ✅ 方法1&#xff1a;FGSM&#xff08;Fast Gradient Sign Met…...

考研系列-计算机网络-第二章、物理层

一、通信基础 1.物理层基本概念 2.数据通信基础知识...

uni-app 安卓10以上上传原图解决方案

在Android 10及以上版本中&#xff0c;由于系统对文件访问的限制&#xff0c;使用chooseImage并勾选原图上传后&#xff0c;返回的是图片的外部存储路径&#xff0c;如&#xff1a;file:///storage/emulated/0/DCIM/Camera/。这种外部存储路径&#xff0c;无法直接转换成所需要…...

关于element的dialog的取消(关闭弹窗)方法触发两次

在这里插入图片描述 关闭的时候加个修饰符.native close.native...

vue,uniapp解决h5跨域问题

如果有这样的跨域问题&#xff0c;解决办法&#xff1a; ✅ 第一步&#xff1a;在项目根目录下创建 vue.config.js 和 package.json 同级目录。 // vue.config.js module.exports {devServer: {proxy: {/api: {target: https://app.yycjkb.cn, // 你的后端接口地址changeOrig…...

2025-04-18 李沐深度学习3 —— 线性代数

文章目录 1 线性代数1.1 标量、向量与矩阵1.2 矩阵概念1.3 按特定轴求和 2 实战&#xff1a;线性代数2.1 标量2.2 向量2.3 矩阵2.4 张量2.5 降维2.6 点积2.7 矩阵-向量积2.8 矩阵-矩阵乘法2.9 范数2.10 练习 1 线性代数 1.1 标量、向量与矩阵 标量&#xff08;Scalar&#xff…...

2026《数据结构》考研复习笔记三(C++高级教程)

C高级教程 一、文件和流二、异常处理三、命名空间四、模板五、信号处理六、多线程 一、文件和流 iostream 用于标准输入/输出&#xff08;控制台I/O&#xff09;&#xff0c;处理与终端&#xff08;键盘输入和屏幕输出&#xff09;的交互 包含以下全局流对象&#xff1a; cin&…...

python进阶: 深入了解调试利器 Pdb

Python是一种广泛使用的编程语言&#xff0c;以其简洁和可读性著称。在开发和调试过程中&#xff0c;遇到错误和问题是不可避免的。Python为此提供了一个强大的调试工具——Pdb&#xff08;Python Debugger&#xff09;。 Pdb是Python标准库中自带的调试器&#xff0c;可以帮助…...

前端资源加载失败后重试加载(CSS,JS等引用资源)

前端资源加载失败后的重试 .前端引用资源时出现了资源加载失败(这里针对的是路径引用异常或者url解析错误时) 解决这个问题首先要明确一下几个步骤 1.什么情况或者什么时候重试 2.如何重试 3.重试过程中的边界处理 这里引入里三个测试脚本&#xff0c;分别加载里三个不同的脚…...

每日算法【双指针算法】(Day 2-复写零)

双指针算法 1.算法题目(复写零)2.讲解算法原理3.编写代码 1.算法题目(复写零) 注意&#xff1a;不要越界&#xff0c;不能开额外的数组&#xff0c;只能从现有数组上进行操作&#xff0c;没有返回值。 2.讲解算法原理 解法&#xff1a;双指针操作 先根据“异地”操作&#xf…...

【C++深入系列】:模版详解(上)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 你不需要很厉害才能开始&#xff0c;但你需要开始才能很厉害。 ★★★ 本文前置知识&#xff1a; 类和对象&#xff08;上&#xff09; …...

PyCharm Flask 使用 Tailwind CSS v3 配置

安装 Tailwind CSS 步骤 1&#xff1a;初始化项目 在 PyCharm 终端运行&#xff1a;npm init -y安装 Tailwind CSS&#xff1a;npm install -D tailwindcss3 postcss autoprefixer初始化 Tailwind 配置文件&#xff1a;npx tailwindcss init这会生成 tailwind.config.js。 步…...

设计模式每日硬核训练 Day 15:享元模式(Flyweight Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 14&#xff1a;组合模式小结 在 Day 14 中&#xff0c;我们学习了组合模式&#xff08;Composite Pattern&#xff09;&#xff1a; 适用于构建树状层级结构&#xff0c;使得“单个对象”和“对象集合”统一操作。广泛用于文件系统、UI 控件树、组织结…...

使用Service发布应用程序

使用Service发布应用程序 文章目录 使用Service发布应用程序[toc]一、什么是Service二、通过Endpoints理解Service的工作机制1.什么是Endpoints2.创建Service以验证Endpoints 三、Service的负载均衡机制四、Service的服务发现机制五、定义Service六、Service类型七、无头Servic…...

美家市场2025电视版分享码-美家市场电视直播软件分享码免费获取

美家市场2025电视版作为一款备受欢迎的应用市场&#xff0c;为用户提供了海量的电视直播软件&#xff0c;而分享码则是免费获取这些资源的重要途径。与此同时&#xff0c;乐看家桌面也是一款在智能电视领域极具特色的软件&#xff0c;它能与美家市场搭配使用&#xff0c;为用户…...

动手学深度学习:手语视频在NiN模型中的测试

前言 NiN模型是在LeNet的基础上修改&#xff0c;提出了1x1卷积层和全局平均池化层的概念&#xff0c;减少了全连接所带来的参数量很多的问题。本篇在之前代码的基础上添加了模型保存&#xff0c;loss和acc记录以及记录模型时间等功能&#xff0c;所以模型后面的代码会重新记录…...

医院数据中心智能化数据上报与调数机制设计

针对医院数据中心的智能化数据上报与调数机制设计,需兼顾数据安全性、效率性、合规性及智能化能力。以下为系统性设计方案,分为核心模块、技术架构和关键流程三部分: 一、核心模块设计 1. 数据上报模块 子模块功能描述多源接入层对接HIS/LIS/PACS/EMR等异构系统,支持API/E…...

Ubuntu命令速查

当你在Ubuntu系统中需要快速查询常用命令时&#xff0c;可以使用以下速查表&#xff1a; 列出文件和目录&#xff1a; ls切换目录&#xff1a; cd [目录路径]显示当前工作目录的绝对路径&#xff1a; pwd创建新目录&#xff1a; mkdir [目录名]删除文件或目录&#xff1a; rm […...

一次制作参考网杂志的阅读书源的实操经验总结(附书源)

文章目录 一、背景介绍二、书源文件三、详解制作书源&#xff08;一&#xff09;打开Web服务&#xff08;二&#xff09;参考网结构解释&#xff08;三&#xff09;阅读书源 基础&#xff08;四&#xff09;阅读书源 发现&#xff08;五&#xff09;阅读书源 详细&#xff08;六…...

python抓取HTML页面数据+可视化数据分析(投资者数量趋势)

本文所展示的代码是一个完整的数据采集、处理与可视化工具&#xff0c;主要用于从指定网站下载Excel文件&#xff0c;解析其中的数据&#xff0c;并生成投资者数量的趋势图表。以下是代码的主要功能模块及其作用&#xff1a; 1.网页数据获取 使用fetch_html_page函数从目标网…...

下拉框select标签类型

在我们很多页面里有下拉框的选择&#xff0c;这种元素怎么定位呢&#xff1f;下拉框分为两种类型&#xff1a;我们分别针对这两种元素进行定位和操作 select标签 &#xff1a; 通过select类处理。 非select标签 1、针对下拉框元素&#xff0c;如果是Select标签类型&#xff0c;…...

嵌入式C语言位操作的几种常见用法

作为一名老单片机工程师&#xff0c;我承认&#xff0c;当年刚入行的时候&#xff0c;最怕的就是看那些密密麻麻的寄存器定义&#xff0c;以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器&#xff0c;硬件就是不听话”的情况&#xff0c;简直想把示波器砸了&am…...

数据库原理及应用mysql版陈业斌实验四

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表&#xff08;学生表&…...

【免登录ORACLE,jdk8安装包下载】jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe有什么区别

jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe主要有以下区别&#xff1a; 我用夸克网盘分享了「jdk」&#xff0c;链接&#xff1a;https://pan.quark.cn/s/c72666843e2b 适用系统架构&#xff1a; jdk-8u441-windows-i586.exe适用于32位的Windows操作系统&#x…...

Oracle日志系统之附加日志

Oracle日志系统之附加日志 在 Oracle 数据库中&#xff0c;附加日志&#xff08;Supplemental Log&#xff09;是一种增强日志记录的机制&#xff0c;用于在数据库的 redo log 中记录更多的变更信息&#xff0c;尤其是在进行数据迁移、复制和同步等任务时&#xff0c;能够确保…...

从零到一:管理系统设计新手如何快速上手?

管理系统设计是一项复杂而富有挑战性的任务&#xff0c;它要求设计者具备多方面的知识和技能&#xff0c;包括需求分析、架构设计、数据管理、用户界面设计等。对于初次接触这一领域的新手而言&#xff0c;如何快速上手并成为一名合格的管理系统设计者呢&#xff1f;本文将从管…...

Web 前端包管理工具深度解析:npm、yarn、pnpm 全面对比与实战建议

引言: 在现代web前端开发中,包管理工具的重要性不言而喻,无论是构建项目脚手架,安装ui库,管理依赖版本,还是实现monorepo项目结构,一个高效稳定的包管理工具都会大幅提升开发体验和协作效率 作为一名前端工程师,深入了解这些工具背后的机制与差异,对于提升项目可维护性和团队…...

Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(六)

一、具有多示例抗别名示例访问权限的 UAV Direct3D 11 允许光栅化到无序访问视图&#xff0c; (UAV) 没有呈现目标视图 (RTV) /DSV 绑定。 即使 UAV 可以具有任意大小&#xff0c;实现也可以使用视区/剪刀矩形的像素尺寸来操作光栅器。 DirectX 11 硬件的示例模式仅为单个示例…...

Jenkins 多分支流水线: 如何创建用于 Jenkins 状态检查的 GitHub 应用

使用 Jenkins 多分支流水线时&#xff0c;您可以将状态检查与 GitHub 拉取请求集成。 以下是状态检查的示例 要实现这些类型的状态检查&#xff0c;您需要创建一个与 Jenkins 主实例集成的 GitHub 应用。 在本博客中&#xff0c;我们将介绍如何创建一个 GitHub 应用&#xff…...

LeeCode912. 排序数组

给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2…...

Maven 简介(图文)

Maven 简介 Maven 是一个Java 项目管理和构建的工具。可以定义项目结构、项目依赖&#xff0c;并使用统一的方式进行自动化构建&#xff0c;是Java 项目不可缺少的工具。 Maven 的作用 提供标准化的项目结构&#xff1a;以前不同的开发工具创建的项目结构是不一样的&#xf…...

深入规划 Elasticsearch 索引:策略与实践

一、Elasticsearch 索引概述 &#xff08;一&#xff09;索引基本概念 Elasticsearch 是一个分布式、高性能的全文搜索引擎&#xff0c;其核心概念之一便是索引。索引本质上是一个存储文档的逻辑容器&#xff0c;它使得数据能够在高效的检索机制下被查询到。当我们对文档进行…...

基于X86/RK/全志+FPGA+AI工业一体机在电力接地系统中的应用方案

随着电力技术的发展和需求增加&#xff0c;智能电网建设受到全球关注。电力五防系统建设是确保我国电力安全的核心任务&#xff0c;接地管理系统是其中的关键部分&#xff0c;对电力系统的安全、稳定和高效运行至关重要。工业一体机&#xff0c;凭借其卓越的性能、稳定性和环境…...

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey https://arxiv.org/pdf/2407.18369 https://www.doubao.com/chat/3262156521106434 速览 研究动机&#x…...

JVM对象创建全过程

JVM对象创建全过程深度解析 1. 对象创建的整体流程 JVM创建对象的过程可以分为7个关键步骤&#xff0c;从类检查到内存分配&#xff0c;再到对象初始化&#xff1a; 类加载检查 → 内存分配 → 内存空间初始化 → 对象头设置 → 构造函数执行 → 栈帧引用建立 → 对象使用2.…...

ubuntu 22.04 使用ssh-keygen创建ssh互信账户

现有两台ubuntu 22.04服务器&#xff0c;ip分别为192.168.66.88和192.168.88.66。需要将两台服务器创建新用户并将新用户做互信。 创建账户 adduser user1 # 如果此用户不想使用密码&#xff0c;直接一直回车就行&#xff0c;创建的用户是没法使用用户密码进行登陆的 su - …...

蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)

1.背景 蓝牙这个系列已经很久很久没有更新了&#xff0c;感慨良多。 现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题&#xff0c;想了一些办法&#xff0c;一一克服了&#xff0c;看看对其他做蓝牙的同学有没有启发。 同时也安利一个叫做HACKRF的设备…...

从零构建 Vue3 登录页:结合 Vant 组件与 Axios 实现完整登录功能

在 Web 开发的世界里&#xff0c;登录页是用户与应用交互的第一道门槛&#xff0c;它的体验好坏直接影响着用户对整个应用的印象。本文将详细记录如何使用 Vue3、Vant 组件库和 Axios 构建一个兼具美观与实用的登录页面&#xff0c;并实现完整的登录逻辑与数据验证&#xff0c;…...

AutoSAR从概念到实践系列之MCAL篇(一)——MCAL架构及其模块详解

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 老规矩,…...

多线程编程的简单案例——单例模式[多线程编程篇(3)]

目录 前言 1.wati() 和 notify() wait() 和 notify() 的产生原因 如何使用wait()和notify()? 案例一:单例模式 饿汉式写法: 懒汉式写法 对于它的优化 再次优化 结尾 前言 如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_eclipse查看线程-CSDN博客 浅谈Thread类…...

万物互联时代,AWS IoT Core如何构建企业级物联网中枢平台?

在智能制造、智慧城市、车联网等场景爆发的今天&#xff0c;全球物联网设备数量已突破150亿台。企业如何高效管理海量设备并挖掘数据价值&#xff1f;AWS IoT Core作为亚马逊云科技推出的全托管物联网平台&#xff0c;正在为数千家企业提供设备连接、数据采集、实时分析的一站式…...

论文阅读:2023 arxiv Safe RLHF: Safe Reinforcement Learning from Human Feedback

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe-rlhf 速览 研究动机&#xff…...

链表相关算法题

小细节 初始化问题 我们这样子new一个ListNode 它里面的默认值是0&#xff0c;所以我们不能这样 如果我们为空&#xff0c;我们要返回null 节点结束条件判断&#xff08;多创建节点问题&#xff09; 参考示例3217 解析&#xff1a; 我的答案是多了一个无用节点 这是因为我每…...

招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!

近日&#xff0c;“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布&#xff0c;原点安全申报的《招商信诺&#xff1a;数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…...