从 Vue3 回望 Vue2:性能优化内建化——从黑盒优化到可控编译
文章目录
- 从 Vue3 回望 Vue2:性能优化内建化——从黑盒优化到可控编译
- 1. 引言
- 2. Vue2 的性能优化机制解析
- 3. Vue3 的编译期优化能力拆解
- 3.1 静态提升(Static Hoisting)
- 3.2 Patch Flag 精确标记
- 3.3 Block Tree (块级更新边界)
- 3.3.1. 什么是 Block Tree
- 3.3.2 看一下编译产物
- 3.3.3 图解
- 3.3.4 类比解释
- 3.3.5. DevTools 中如何观察 Block Tree 的效果
- 3.3.6 总结一下
- 4. 代码举例对比优化前后效果
- 5. 编译期优化的实践角度分析
- 6. 编译优化与生态系统的深度联动
- 6.1 构建工具联动:Vite + Vue3 Compiler
- 6.2 SSR 与 Hydration 场景
- 6.3 TypeScript 联动优化
- 6.4 未来展望
- 7. 思维转变:从运行时经验到编译期设计
- 7.1 Vue2 vs Vue3 性能优化机制对比总览
- 7.2 总结建议
- 7.3 迁移建议
- 8. 实战提问 & 面试关注点
- 9. 结尾
从 Vue3 回望 Vue2:性能优化内建化——从黑盒优化到可控编译
1. 引言
性能,一直是前端框架最核心的竞争力之一。过去我们常说 Vue 是轻量、响应快的代表,但这背后依赖的是运行时的各种“魔法操作”。到了 Vue3,官方不再满足于“能跑得快”,而是推动了一个更具透明度、参与度与系统性的优化范式转移——从运行时“黑盒”优化,走向编译期“白盒”优化。
Vue3 的这一转变,不只是底层实现的升级,更重塑了开发者的编码习惯与性能认知模式。本文将带你回顾 Vue2 的优化策略,再深入理解 Vue3 的编译期性能革新,感受从“临场修补”到“提前排兵布阵”的思维跃迁。
2. Vue2 的性能优化机制解析
在 Vue2 中,性能优化主要依赖两大机制:
- 响应式依赖追踪:通过
Object.defineProperty
拦截访问,实现响应式依赖收集与更新; - 虚拟 DOM diff 算法:对比前后两个 VNode 树,最小化真实 DOM 更新。
这些机制自动完成组件更新过程,大大简化了开发者的心智负担。但其运行时的“黑盒”特性也带来了问题:
- 更新粒度粗:以组件为最小单位,组件内部变动会触发整棵组件子树 diff、patch;
- 缺乏静态结构信息:运行时无法判断哪些 DOM 是静态的,只能全部纳入比较;
- 动态模板 runtime 编译:编译过程在运行时发生,无法做编译期优化分析。
示例说明:
<!-- Vue2 模板 -->
<template><div><h1>用户列表</h1><ul><li v-for="user in users" :key="user.id">{{ user.name }}</li></ul><button @click="refresh">刷新</button></div>
</template>
即便只是点击按钮刷新,整个组件的 VDOM 都会重新 diff,哪怕 h1
与无变化的 li
也是重新 patch 的对象。这是所谓的全量扫描
。
总结:Vue2 的优化机制虽自动但不透明,性能瓶颈的识别与解决仍需开发者经验支撑。
3. Vue3 的编译期优化能力拆解
Vue3 的最大性能飞跃,源于其将“模板”由运行时代码变为“编译期产物”。在这个过程中,Vue3 实现了三项关键优化:
3.1 静态提升(Static Hoisting)
将静态 DOM 结构抽离成常量,避免每次渲染时重复创建虚拟节点。
3.2 Patch Flag 精确标记
通过 patchFlag
精确标记哪些节点需要 diff,如文本变化、属性变化等。
// 编译产物(伪代码)
createVNode("div", null, [hoistedStaticVNode, // 静态提升dynamicVNode // 有 patchFlag,精准 diff
])
3.3 Block Tree (块级更新边界)
Vue3 会用 openBlock()
和 createBlock()
将动态区域包起来,只为这些区域重新创建 VNode 和 diff。跳过无变更的 subtree,显著减少 diff 范围。
Block Tree 优化
是 Vue3 编译期优化中非常核心、但也相对抽象的一个概念。我们来一步一步地深入理解这个机制,包括:
- 它是什么?
- 怎么工作的(编译产物是啥)?
- 最后用一个实际例子+DevTools 帮你完全弄懂。
3.3.1. 什么是 Block Tree
Block(块) = 一次更新中 可能会变化 的子树。
Vue3 会:
- 每发现一个有动态内容的区域,就调用
createBlock()
; - 所有动态子节点挂到这个 block 里;
- 静态内容提升出去,不参与这个 block;
- 最终 只对 block 内部做 diff,跳过整块静态区域。
3.3.2 看一下编译产物
<!-- Vue3 模板 -->
<template><div><h1>标题</h1> <!-- 静态 --><span>{{ msg }}</span> <!-- 动态 --></div>
</template>
被编译为:
const _hoisted_1 = createElementVNode("h1", null, "标题", -1)return function render(_ctx, _cache) {return (openBlock(), createBlock("div", null, [_hoisted_1, // 静态提升createElementVNode("span", null, toDisplayString(_ctx.msg), 1) // patchFlag: TEXT]))
}
openBlock()
:开始一个更新块;createBlock()
:标记“这是更新的核心区域”;_hoisted_1
不在 block 中,更新时会跳过;span
被加上patchFlag
,表示只更新它。
3.3.3 图解
[Vue2 更新流程] [Vue3 更新流程]┌──────────────────┐ ┌────────────────┐│ 整个子树 diff │ │ openBlock() ││ 所有 vnode 重建 │ │ createBlock() ││ 静态也走 diff 流程│ │ 仅动态 diff │└──────────────────┘ └────────────────┘
3.3.4 类比解释
比喻 | Vue2 | Vue3 |
---|---|---|
安检流程 | 所有人都过一遍安检 | 只对“可疑人员”安检,其余直接放行 |
更新粒度 | 粗粒度(组件或整树) | 精细粒度(动态节点级) |
性能影响 | 每次都重建和对比整个模板结构 | 只对关键区域重建,对静态直接跳过 |
3.3.5. DevTools 中如何观察 Block Tree 的效果
你可以打开 Vue DevTools:
-
在组件中输入内容或点击按钮;
-
观察:
- 是否整个组件重新渲染?
- 哪些元素有“更新”标记(绿色闪烁)?
- 有无出现 “skipped update” 的提示?
这就是 Vue3 block patch 和静态跳过机制在 DevTools 中的体现。
3.3.6 总结一下
- Block Tree 是 Vue3 编译阶段为模板结构生成的“更新分区”;
- 每个
openBlock
/createBlock
标记了一个更新边界; - 静态内容被提前 hoist 出 block,避免反复 diff;
- 最终实现“只更新必要部分”,大幅提升性能;
- 开发者几乎不需要手动操作,只需写清晰的模板,Vue 会自动优化;
- 借助 DevTools,你可以亲眼看到哪些被更新,哪些被跳过。
这些优化将更新过程从“全量扫描”变为“精准打击”,不仅更快,也更可控。
4. 代码举例对比优化前后效果
示例场景:用户列表 + 搜索框
Vue2 实现:
<template><div><h1>用户表</h1><input v-model="keyword" placeholder="搜索用户"><ul><li v-for="u in filteredUsers" :key="u.id">{{ u.name }}</li></ul></div>
</template>
效果:
每次输入字符,整棵组件都重新 diff,哪怕 h1
与未匹配变化的 li
也被重新 patch。
Vue3 实现(自动静态提升 + PatchFlag):
<template><div><h1>用户表</h1> <!-- 静态提升 --><input v-model="keyword" /><ul><li v-for="u in filteredUsers" :key="u.id">{{ u.name }}</li></ul></div>
</template>
配合 DevTools 观察:
- Vue2:整个组件每次都更新;
- Vue3:只有 input 和动态列表变化,h1 静态跳过更新。
Vue DevTools 中的“跳过更新组件”提示,正是 Vue3 编译期优化的可视化体现。
5. 编译期优化的实践角度分析
Vue3 将性能优化从“靠经验”变为“有策略”,开发者可主动参与:
v-once
:静态节点手动跳过更新;v-memo
:缓存渲染结果,结合依赖表达式使用;defineRender
:手写渲染函数,完全控制渲染过程;<script setup>
:模板更简洁、分析更友好,更利于静态提取与 tree-shaking。
实战建议
- 拆分模板中静态与动态内容;
- 在组件中关注哪些数据会频繁更新,避免“动静搅和”;
- 在 Vue DevTools 中观察 patch 路径与频次,优化组件结构。
Vue3 让“性能”不再是玄学,而是结构决定性能、可控提升体验的工程策略。
6. 编译优化与生态系统的深度联动
6.1 构建工具联动:Vite + Vue3 Compiler
- Vite 的模块预构建机制提升开发速度;
- HMR(热更新)只重载最小作用范围,与 Vue3 的 block patch 精确联动。
6.2 SSR 与 Hydration 场景
- 编译时标记哪些节点可静态 hydrate;
- 提升初始加载速度与交互响应。
6.3 TypeScript 联动优化
- 更精确的类型分析 => 更好地理解模板结构;
- 利于 IDE 提示 + 编译阶段提示潜在性能问题。
6.4 未来展望
- Partial Hydration:只激活交互区域;
- Tree-shaking 指令与模板:按需加载渲染逻辑。
7. 思维转变:从运行时经验到编译期设计
性能优化不再是末期打补丁,而是架构初期的系统设计。
7.1 Vue2 vs Vue3 性能优化机制对比总览
维度 | Vue2(运行时优化) | Vue3(编译期优化) |
---|---|---|
优化时机 | 运行时进行优化 | 编译期生成优化指令 |
更新粒度 | 组件级 diff,VNode 整体扫描 | Block Tree + patchFlag 精细控制更新单元 |
静态内容处理 | 无静态提升,每次重建 VNode | 静态提升(hoisting),只生成一次 |
动态内容识别 | 运行时通过 diff 判别变更 | 编译时生成 patchFlag,精准定位变化 |
VNode diff 范围 | 整棵子树都可能被 diff | 只 diff 变化区域的 block |
性能优化参与度 | 框架主导,开发者“猜测性”调优 | 编译器主导,开发者可参与结构设计与标记 |
调试/可观测性 | DevTools 只能看到整体更新 | DevTools 可标识哪些节点被跳过/重渲染 |
典型优化指令/能力 | v-once 、手动组件拆分 | v-once 、v-memo 、defineRender 、markRaw 等 |
大型系统策略 | 靠经验规避性能陷阱,难以标准化 | 可制定结构优化规范,协同 DevTools 分析调整 |
模板处理方式 | template 编译在运行时进行 | template 编译为可优化的 render 函数(AST 优化) |
对构建工具依赖 | 编译器与构建工具耦合较弱 | 深度融合 Vite、TS、DevTools,构成性能生态闭环 |
代表性比喻 | “临场修补”,问题发生后再处理 | “提前排兵布阵”,架构设计即性能决策 |
7.2 总结建议
Vue2 | Vue3 |
---|---|
遇到性能问题再分析 | 构建阶段就规划好结构 |
黑盒运行,依赖经验规避性能陷阱 | 白盒设计,开发者明确参与优化流程 |
编码习惯偏“能运行” | 编码习惯偏“结构清晰、更新明确” |
- Vue2 更依赖运行时的聪明机制与开发者经验;
- Vue3 将性能变成编译器 + 架构 + 开发者共同驱动的系统工程;
- 从组件级性能调优过渡到 模板结构级设计优化,是 Vue3 性能哲学的核心。
7.3 迁移建议
- 使用
<script setup>
构建新组件; - 学会分析 patch 路径,识别静态与动态结构;
- 逐步引入
v-memo
、v-once
等辅助优化策略; - 将组件设计标准升级为“结构即优化”的范式。
8. 实战提问 & 面试关注点
问题 | 简要回答 / 关键点 |
---|---|
Vue2 的性能优化机制? | 响应式依赖追踪 + 虚拟 DOM diff(运行时驱动) |
Vue3 如何跳过静态 patch? | patchFlag + 静态提升(hoisting)+ block tree(分块更新) |
什么是 patchFlag? | 编译时生成的优化标志,标记节点类型的动态性,如 TEXT , CLASS , PROPS 等,用于精准 diff |
v-memo 使用场景? | 当一个模板子树只依赖特定响应式数据时,用 v-memo="[deps]" 缓存,避免不必要更新 |
如何手动参与性能优化? | 可用指令/函数:v-once , v-memo , markRaw , shallowRef , defineRender 等 |
组件结构设计如何影响性能? | 静态内容与动态内容分离、细粒度组件拆分可减少 diff 范围,提升渲染性能 |
Vue3 性能机制对大型系统有何影响? | 能建立结构化的性能策略标准,如组件粒度规划、模板纯度约束、模板中动态区域的限制与标注,提升整体系统可维护性与性能预期 |
9. 结尾
Vue3 不只是更快,而是让我们能理解为什么快、怎么让它更快。
通过编译期优化,Vue3 不再仅仅依赖运行时的神秘“魔法”,而是让开发者真正成为性能调优的设计者。这种范式转变,不只是框架的进化,也是前端开发理念的一次升华。
相关文章:
从 Vue3 回望 Vue2:性能优化内建化——从黑盒优化到可控编译
文章目录 从 Vue3 回望 Vue2:性能优化内建化——从黑盒优化到可控编译1. 引言2. Vue2 的性能优化机制解析3. Vue3 的编译期优化能力拆解3.1 静态提升(Static Hoisting)3.2 Patch Flag 精确标记3.3 Block Tree (块级更新边界&#…...
HOW - React NextJS 的同构机制
文章目录 一、什么是 Next.js 的同构?二、核心目录结构三、关键函数:如何实现不同渲染方式?1. getServerSideProps —— 实现 SSR(每次请求动态获取数据)2. getStaticProps getStaticPaths —— 实现 SSG(…...
电动汽车直流快充充电桩AEV200-DC240M4的详细介绍
电动汽车直流快充充电桩AEV200-DC240M4产品简介 AEV系列为全新一代分体式电动汽车直流恒功率快速充电机。系统内置 30/40kW 恒功率充电模块,最高输出电压1000V,满足各类车辆充电需求。模块采用隔离风道灌胶设 计 ,可靠性高 ,可应…...
YOLOv7训练时4个类别只出2个类别
正常是4个类别: 但是YOLOv7训练完后预测总是只有两个类别: 而且都是LFM和SFM 我一开始检查了下特征图大小,如果输入是640*640的话,三个尺度特征图是80*80,40*40,20*20;如果输入是416*416的话,三个尺度特征…...
数据赋能(224)——数据与业务协同——数据动态调整原则
概述 数据动态调整原则不仅能帮助组织迅速响应业务需求和技术环境的变化,还能确保数据应用始终与最新的数据处理技术、算法和工具保持同步。通过实施数据动态调整,企业能够更准确地捕捉业务趋势,优化数据质量,以及提高资源利用效…...
Vulfocus靶场-文件上传-3
WSO2 文件上传 (CVE-2022-29464) WSO2是一家成立于 2005 年的开源技术提供商。它提供了一个企业平台,用于在本地和整个 Internet 上 集成应用程序编程接口(API)、应用程序和 Web 服务。 某些 WSO2 产品允许无限制的文件上传和远程代码执行。…...
(for 循环) VS (LINQ) 性能比拼 ——c#
在大多数情况下,for 循环的原始性能会优于 LINQ,尤其是在处理简单遍历、数据筛选或属性提取等场景时。这是由两者的实现机制和抽象层次决定的。以下是具体分析: 一、for 循环与 LINQ 的性能差异原因 1. 抽象层次与执行机制 for 循环&#…...
自学嵌入式 day19-数据结构 链表
二、线性表的链式存储 1.特点: (1)线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上。 (2)所以…...
一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(中)
概述 各位似秃非秃小码农们都知道,在 SwiftUI 中视图是状态的函数,这意味着状态的改变会导致界面被刷新。 但是,对于有些复杂布局的 SwiftUI 视图来说,它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题:状态的改变并没有及时的引起 UI 的变化。 如上图所示…...
UI自动化测试详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、about自动化测试 定义:把人为驱动的测试转化为机器执行的一种过程,重点在于持续集成这个概念; 优势:节约人力…...
数学复习笔记 14
前言 和家里人交流了一下,他们还是希望我全力以赴初试,我确实也得放开了干,不要束手束脚的。好好加油。感觉公共课都没有啥压力,主要是专业课要好好加油,真不能过不了线,要是过不了线,啥都白搭…...
单元化架构
目录 编辑 单元化 逻辑单元 单元化 多地多机房部署,是互联网系统的必然发展方向,一个系统要走到这一步,也就必然要解决上面提到的问题:流量调配、数据拆分、延时等。业界有很多技术方案可以用来解决这些问题&…...
硬件厂商的MIB文档详解 | 如何查询OID? | MIB Browser实战指南-优雅草卓伊凡
硬件厂商的MIB文档详解 | 如何查询OID? | MIB Browser实战指南-优雅草卓伊凡 一、硬件厂商的MIB文档是什么? 1. MIB的本质:设备的”数据字典” MIB(Management Information Base) 是SNMP协议的核心数据库,定义了设备…...
遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1542 标注数量(xml文件个数):1542 标注数量(txt文件个数):1542 …...
【python基础知识】Day 27 函数专题2:装饰器
知识点: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 装饰器教程 作业: 编写一个装饰器 logger,在函数执行前后打印日志信息(如函数名、参数、返回值) def logger(func):def wrapper(*ar…...
游戏站的几种形式
游戏站点的主要形式:单品游戏站、游戏盒子站与单类型游戏盒子站 随着互联网的普及和游戏产业的快速发展,游戏站点作为玩家获取游戏资源和信息的重要平台,呈现出多种形式。本文将分析三种常见的游戏站点形式:单品游戏站、游戏盒子站…...
动态IP赋能业务增效:技术解构与实战应用指南
在数字化转型加速的今天,IP地址作为网络通信的基础设施,其技术特性正深刻影响着企业业务架构的效率与安全性。动态IP(Dynamic IP)作为互联网资源分配的核心机制,早已突破传统认知中的"临时地址"定位…...
Redis 五种类型基础操作(redis-cli + Spring Data Redis)
目录 一、什么是 Redis? 二、Redis 的特点 三、Redis 常见的数据类型 四、Redis 的典型应用场景 五、redis-cli(命令行工具)练习命令 1.1、String 类型(最基本的数据类型) 1.2、List 类型(链表结构&a…...
Gitee DevOps:中国企业数字化转型的加速引擎
随着中国数字经济规模突破50万亿元大关,研发效能已成为企业数字化转型的核心竞争力指标。在2025年这个关键节点,中国企业面临的不再是是否采用DevOps的选择题,而是如何选择最适合本土环境的DevOps平台的战略决策。Gitee DevOps平台凭借其独特…...
【数据仓库面试题合集①】数据建模高频面试题及解析
🧠 面试官爱问什么?——核心考察点 数据建模作为数仓岗位面试的重头戏,考察的不只是模型知识,更是对业务理解、抽象能力和工程落地经验的综合评估。常见题型可分为三类: 概念类:模型类型、建模方法论(如维度建模、范式建模) 场景类:给定一个业务场景进行模型设计(如…...
华为云Flexus+DeepSeek征文|SpringBoot开发实战:基于ModelArts Studio高效集成DeepSeek大模型服务
目录 一、前言 二、ModelArts Studio(MaaS)介绍与使用 2.1ModelArts Studio(MaaS)介绍 2.2 ModelArts Studio(MaaS)使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、MaaS模型服务接口测试 3.1 …...
【C++】类与对象
C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如:之前在数据结构中,用C语言方式实现的栈,结构体中只能定义变量;现在以C方式实现,会发现struct中也可以定义函数。 struct Stack {// 成员函数void Init(int defaultCapacity 4){a (int*)mall…...
mac M芯片运行docker-desktop异常问题
虽然mac已经迭代到m4了,但官方的docker-desktop运行仍然有问题,包括但不限于: 命令行docker找不到docker-desk打不开docker-desktop闪退容器起不来 尝试不同版本后,看到了其他可以在mac跑docker的开源方法,更简单、轻…...
5G 技术在智能制造中的应用:加速工业革命的新引擎
5G 技术在智能制造中的应用:加速工业革命的新引擎 在过去几十年里,制造业经历了从机械化到自动化,再到如今的智能化变革。而 5G 技术的出现,不仅是一次通信技术的升级,更是为 智能制造 注入了新的动力。从 智能工厂、工业物联网(IIoT) 到 远程控制与数据智能分析,5G 正…...
数据治理域——数据同步设计
摘要 本文主要介绍了数据同步的多种方式,包括直连同步、数据文件同步和数据库日志解析同步。每种方式都有其适用场景、技术特点、优缺点以及适用的数据类型和实时性要求。文章还详细探讨了数据直连同步的特点、工作原理、优点、缺点、适用场景等,并对数…...
系统架构设计师案例分析题——web篇
软考高项系统架构设计师,其中的科二案例分析题为5选3,总分75达到45分即合格。本贴来归纳web设计题目中常见的知识点即细节: 目录 一.核心知识 1.常见英文名词 2.私有云 3.面向对象三模型 4.计网相关——TCP和UDP的差异 5.MQTT和AMQP协…...
FC7300 SPI MCAL配置引导
一、MCU 组件 - 配置SPI时钟 MCU中配置的SPI输入时钟频率至少应大于2倍的SPI组件中配置的外设波特率。SPI时钟配置为30MHz 二、SPI 组件 - General Spi Level Delivered: 0 级:仅简单同步行为1 级:基本异步行为,通过中断实现2 级:增强型行为,通过轮询实现根据AUTOSAR SPI…...
【记录】Windows|竖屏怎么调整分辨率使横竖双屏互动鼠标丝滑
本文版本:Windows11,记录一下,我最后调整的比较舒适的分辨率是800*1280。 文章目录 第一步 回到桌面第二步 右键桌面第三步 设置横屏为主显示器第四步 调整分辨率使之符合你的需求第五步 勾选轻松在显示器之间移动光标第六步 拖动屏幕符合物理…...
hghac和hgproxy版本升级相关操作和注意事项
文章目录 环境文档用途详细信息 环境 系统平台:N/A 版本:4.5.6,4.5.7,4.5.8 文档用途 本文档用于高可用集群环境中hghac组件和hgproxy组件替换和升级操作 详细信息 1.关闭服务 所有数据节点都执行 1、关闭hgproxy服务 [roothgdb01 tools]# system…...
【超分辨率专题】一种考量视频编码比特率优化能力的超分辨率基准
这是一个Benchmark,超分辨率视频编码(2024) 专题介绍一、研究背景二、相关工作2.1 SR的发展2.2 SR benchmark的发展 三、Benchmark细节3.1 数据集制作3.2 模型选择3.3 编解码器和压缩标准选择3.4 Benchmark pipeline3.5 质量评估和主观评价研…...
操作系统之进程和线程听课笔记
计算机的上电运行就是构建进程树,进程调度就是在进程树节点进程进行切换 进程间通信的好处 经典模型 生产者和消费者 进程和线程的区别 线程引入带来的问题线程的优势 由于unix70年代产生,90年代有线程,当时数据库系统操作需要线程,操作系统没有来得及重造,出现了用户态线…...
Mac安装Navicat16
我的电脑用的是M3芯片,然后在安装的时候也踩了很多的坑 先分享一下链接 通过网盘分享的文件:Navicat Premium v16.2.dmg 链接: https://pan.baidu.com/s/1ENLtU7VLCvzntLKqSyFiqg?pwd1234 提取码: 1234 其实按理说用navicat17也是可以的 首先下载完成后…...
表的设计、聚合函数
目录 1、表的设计 1.1、一对一 1.2、一对多 1.3、多对多 2、插入查询结果 3、聚合查询 3.1、聚合函数 3.2、GROUP BY子句 1、表的设计 根据实际的需求场景,明确当前要创建几个表,每个表什么样子,这些表之间是否存在一定联系 1. 梳理…...
React学习———React Router
React Router React Router 是 React 应用中用于管理路由的流行库,它允许你在单页应用(SPA)中实现导航和页面切换而无需重新加载页面。 安装 npm install react-router-dom核心组件 <BrowserRouter> 使用HTML5的历史记录API&#…...
【前端】[vue3] [uni-app]使用 vantUI 框架
npm 安装: npm i vant/weapp -S --productionmain.js 中挂载 App.vue 引入 vantUI 样式 完成:...
upload-labs通关笔记-第8关 文件上传之点绕过
目录 一、点绕过原理 二、deldot()函数 三、源码分析 四、渗透实战 1、构建脚本test8.php 2、打开靶场 3、bp开启拦截 4、点击上传 5、bp拦截 6、后缀名增加点 7、发包并获取脚本地址 8、访问脚本 本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗…...
XML简要介绍
实际上现在的Java Web项目中更多的是基于springboot开发的,所以很少再使用xml去配置项目。所以我们的目的就是尽可能快速的去了解如何读懂和使用xml文件,对于DTD,XMLSchema这类约束的学习可以放松,主要是确保自己知道这里面的大致…...
我设计的一个安全的 web 系统用户密码管理流程
作为一名有多年经验的前端,在刚开始学习web后端的时候,就对如何设计一个安全的 web 系统用户密码管理流程有很多疑问。之前自己也实践过几种方法,但一直觉得不是十分安全。 我们知道,用户在注册或登录界面填写的密码是明文的&…...
事件驱动架构:从传统服务到实时响应的IT新风潮
文章目录 事件驱动架构的本质:从请求到事件的范式转变在EDA中: 事件驱动架构的演进:从消息队列到云原生标配核心技术:事件驱动架构的基石与工具链1. 消息队列:事件传递的枢纽2. 消费者:异步处理3. 事件总线…...
YOLOv11改进 | Neck篇 | 轻量化跨尺度跨通道融合颈部CCFM助力YOLOv11有效涨点
YOLOv11改进 | Neck篇 | 轻量化跨尺度跨通道融合颈部CCFM助力YOLOv11有效涨点 引言 在目标检测领域,YOLO系列算法因其卓越的速度-精度平衡而广受欢迎。YOLOv11作为该系列的最新演进版本,在Neck部分引入了创新的跨尺度跨通道融合模块(CCFM, Cross-scale…...
Unity:场景管理系统 —— SceneManagement 模块
目录 🎬 什么是 Scene(场景)? Unity 项目中的 Scene 通常负责什么? 🌍 一个 Scene 包含哪些元素? Scene 的切换与管理 📁 如何创建与管理 Scenes? 什么是Scene Man…...
官方 Elasticsearch SQL NLPChina Elasticsearch SQL
官方的可以在kibana 控制台上进行查询: POST /_sql { “query”: “SELECT client_ip, status FROM logs-2024-05 WHERE status 500” } NLPChina Elasticsearch SQL就无法以在kibana 控制台上进行查询,但是可以使用postman接口进行查询:...
Kubernetes 1.28 无 Docker 运行时环境下的容器化构建实践:Kaniko + Jenkins 全链路详解
背景说明 随着 Kubernetes 1.28 正式弃用 Docker 作为默认容器运行时(CRI 规范演进),传统的 docker build 方式已无法直接在集群内运行。Kaniko 作为 Google 开源的容器镜像构建工具,凭借其无需特权容器、兼容 OCI 标准的特性&am…...
【Linux】序列化与反序列化、会话与进程组、守护进程
一.序列化和反序列化 协议其实就是结构化的数据。但是再网络通信中,我们不直接发送结构化的数据给对方。我们一般会将结构化的数据序列化成字符串/字节流,然后通过网络在发送出去。而接收方收到之后,要对收到的字符串/流式数据进行反序列化&…...
Python机器学习笔记(二十五、算法链与管道)
对于许多机器学习算法,特定数据表示非常重要。首先对数据进行缩放,然后手动合并特征,再利用无监督机器学习来学习特征。因此,大多数机器学习应用不仅需要应用单个算法,而且还需要将许多不同的处理步骤和机器学习模型链接在一起。Pipeline类可以用来简化构建变换和模型链的…...
自媒体工作室如何矩阵?自媒体矩阵养号策略
一、自媒体工作室矩阵搭建方法 1.纵向矩阵:在主流平台都开设账号,覆盖不同用户触达场景。 短视频:抖音、快手、视频号(侧重私域沉淀) 2.主账号导流:通过关联账号、评论区跳转链接实现流量互通 本地生活…...
Pywinauto:轻松实现Windows桌面自动化实战
你是否厌倦了每天重复点击软件界面的枯燥操作?是否希望能像自动化网页那样,轻松控制桌面程序?在自动化测试逐渐扩展到客户端桌面的今天,你还不知道 pywinauto,就真的落后了! 手动测试Windows桌面应用&…...
告别传统的防抖机制,提交按钮的新时代来临
目录 背景 目标 核心代码 样式定义:让图标居中、响应父级颜色 SVG 图标:轻量、无依赖的 loading 图标 指令注册:全局注册 v-bLoading DOM 操作:添加与清除 loading 图标 1. 添加 loading 图标 2. 清除 loading 图标 动画…...
【Linux】Linux安装并配置MongoDB
目录 1.添加仓库 2.安装 MongoDB 包 3.启动 MongoDB 服务 4. 验证安装 5.配置 5.1.进入无认证模式 5.2.1创建用户 5.2.2.开启认证 5.2.3重启 5.2.4.登录 6.端口变更 7.卸载 7.1.停止 MongoDB 服务 7.2.禁用 MongoDB 开机自启动 7.3.卸载 MongoDB 包 7.4.删除数…...
PT2031K单触控单输出触摸IC
1.产品概述 ● PT2031K是一款电容式触摸控制ASIC,支持单通道触摸输入和单路同步开关输出。适用于雾化器、车载用品、电子玩具、消费类电子产品等领域,具有低功耗、高抗干扰、宽工作电压范围的突出优势。 2.主要特性 ● 工作电压范围:2.4~5.5…...