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

Vue 3 Diff 算法深度解析:与 Vue 2 双端比对对比

在这里插入图片描述

文章目录

    • 1. 核心算法概述
      • 1.1 Vue 2 双端比对算法
      • 1.2 Vue 3 快速 Diff 算法
    • 2. 算法复杂度分析
      • 2.1 时间复杂度对比
      • 2.2 空间复杂度对比
    • 3. 核心实现解析
      • 3.1 Vue 2 双端比对代码
      • 3.2 Vue 3 快速 Diff 代码
    • 4. 性能优化分析
      • 4.1 性能测试数据
      • 4.2 内存使用对比
    • 5. 使用场景分析
      • 5.1 Vue 2 双端比对适用场景
      • 5.2 Vue 3 快速 Diff 适用场景
    • 6. 最佳实践建议
      • 6.1 优化策略
      • 6.2 代码示例
    • 7. 常见问题与解决方案
      • 7.1 问题列表
      • 7.2 调试技巧
    • 8. 扩展阅读

1. 核心算法概述

1.1 Vue 2 双端比对算法

旧节点列表
首尾节点相同?
移动节点
中间节点相同?
复用节点
创建新节点

1.2 Vue 3 快速 Diff 算法

预处理
最长递增子序列
最小化 DOM 操作
高效更新

2. 算法复杂度分析

2.1 时间复杂度对比

操作Vue 2Vue 3
预处理O(n)O(n)
节点匹配O(n^2)O(n)
DOM 操作O(n)O(n)
总复杂度O(n^2)O(n)

2.2 空间复杂度对比

算法空间复杂度
Vue 2O(n)
Vue 3O(n)

3. 核心实现解析

3.1 Vue 2 双端比对代码

function updateChildren(parentElm, oldCh, newCh) {let oldStartIdx = 0let newStartIdx = 0let oldEndIdx = oldCh.length - 1let newEndIdx = newCh.length - 1while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {// 双端比较逻辑...}// 处理剩余节点...
}

3.2 Vue 3 快速 Diff 代码

function patchKeyedChildren(c1, // 旧子节点c2, // 新子节点container,parentAnchor,parentComponent
) {let i = 0const l2 = c2.lengthlet e1 = c1.length - 1let e2 = l2 - 1// 1. 预处理while (i <= e1 && i <= e2) {const n1 = c1[i]const n2 = c2[i]if (isSameVNodeType(n1, n2)) {patch(n1, n2, container, null, parentComponent)} else {break}i++}// 2. 最长递增子序列const source = new Array(s2).fill(-1)const keyIndex = {}for (let i = s2; i <= e2; i++) {keyIndex[c2[i].key] = i}// 3. 最小化 DOM 操作for (let i = s1; i <= e1; i++) {const prevChild = c1[i]if (patched >= toBePatched) {unmount(prevChild, parentComponent)continue}let newIndexif (prevChild.key != null) {newIndex = keyIndex[prevChild.key]}if (newIndex === undefined) {unmount(prevChild, parentComponent)} else {source[newIndex - s2] = ipatch(prevChild, c2[newIndex], container, null, parentComponent)patched++}}// 4. 移动节点const seq = getSequence(source)let j = seq.length - 1for (let i = toBePatched - 1; i >= 0; i--) {const nextIndex = s2 + iconst nextChild = c2[nextIndex]const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchorif (source[i] === -1) {patch(null, nextChild, container, anchor, parentComponent)} else if (i !== seq[j]) {move(nextChild, container, anchor)} else {j--}}
}

4. 性能优化分析

4.1 性能测试数据

操作Vue 2 (ms)Vue 3 (ms)提升
1000 节点更新1208033%
5000 节点更新60035042%
10000 节点更新150080047%

4.2 内存使用对比

操作Vue 2 (MB)Vue 3 (MB)减少
1000 节点504510%
5000 节点25022012%
10000 节点50044012%

5. 使用场景分析

5.1 Vue 2 双端比对适用场景

  1. 简单列表:节点数量较少
  2. 顺序更新:节点顺序变化不大
  3. 静态内容:节点内容较少变化

5.2 Vue 3 快速 Diff 适用场景

  1. 复杂列表:节点数量较多
  2. 频繁更新:节点顺序经常变化
  3. 动态内容:节点内容频繁更新

6. 最佳实践建议

6.1 优化策略

  1. 合理使用 key:确保 key 的唯一性和稳定性
  2. 避免深层嵌套:减少 DOM 层级
  3. 使用虚拟列表:处理大数据量
  4. 组件拆分:提高复用性

6.2 代码示例

<template><div><!-- 使用 key 优化列表渲染 --><ul><li v-for="item in items" :key="item.id">{{ item.text }}</li></ul><!-- 使用虚拟列表处理大数据量 --><virtual-list :size="50" :remain="10"><template v-slot:default="{ item }"><div>{{ item }}</div></template></virtual-list></div>
</template>

7. 常见问题与解决方案

7.1 问题列表

问题原因解决方案
列表渲染卡顿节点数量过多使用虚拟列表
更新顺序错误key 不稳定使用唯一 key
内存占用过高未及时销毁使用 keep-alive
更新效率低下嵌套层级过深优化组件结构

7.2 调试技巧

  1. Chrome DevTools
    • 检查 DOM 结构变化
    • 监控内存使用情况
  2. Vue Devtools
    • 观察组件更新
    • 跟踪节点状态

8. 扩展阅读

  • Vue 官方文档 - 渲染机制
  • Vue 源码解析 - Diff 算法
  • 前端性能优化指南

通过本文的深度解析,开发者可以全面理解 Vue 3 Diff 算法的优势与实现原理。建议在实际开发中合理应用这些优化策略,以提升应用性能与用户体验。

在这里插入图片描述

相关文章:

Vue 3 Diff 算法深度解析:与 Vue 2 双端比对对比

文章目录 1. 核心算法概述1.1 Vue 2 双端比对算法1.2 Vue 3 快速 Diff 算法 2. 算法复杂度分析2.1 时间复杂度对比2.2 空间复杂度对比 3. 核心实现解析3.1 Vue 2 双端比对代码3.2 Vue 3 快速 Diff 代码 4. 性能优化分析4.1 性能测试数据4.2 内存使用对比 5. 使用场景分析5.1 Vu…...

启动桌面Docker提示虚拟服务未启动

在启动 Docker Desktop 时&#xff0c;可能会遇到以下提示&#xff1a; Docker Desktop - Virtual Machine Platform not enabled Virtual Machine Platform not enabled该错误通常是由于 Windows 未启用 “Virtual Machine Platform” 功能导致的&#xff0c;这是运行 Docker…...

【SpringBoot】实现登录功能

在上一篇博客中&#xff0c;我们讲解了注册页面的实现。在此基础上会跳转到登录页面&#xff0c;今天给大家带来的是使用 SpringBoot&#xff0c;MyBatis&#xff0c;Html&#xff0c;CSS&#xff0c;JavaScript&#xff0c;前后端交互实现一个登录功能。 目录 一、效果 二、…...

DataWhale 速通AI编程开发:(进阶篇)第3章 提示词(Prompts)配置项

学习网址&#xff1a;Datawhale-学用 AI,从此开始 3.1 Roo Code提示词配置了什么 众所周知&#xff0c;提示词&#xff08;Prompt&#xff09;是用户向大语言模型输入的一段文本&#xff0c;用于指导大语言模型生成符合用户要求的输出。在ai编程领域更是如此&#xff0c;提示…...

VUE中VNode(虚拟节点)是个啥?

用 JavaScript 生成 Virtual DOM&#xff08;VNode&#xff09; 在 Vue 中&#xff0c;Virtual DOM&#xff08;虚拟 DOM&#xff09;是一个用 JavaScript 对象表示真实 DOM 结构的抽象层。通过这种方式&#xff0c;Vue 可以通过比较 Virtual DOM 与真实 DOM 的差异来最小化更…...

力扣:3. 无重复字符的最长子串(滑动窗口)

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09;3. 无重复字符的最长子串 - 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1:输入: s "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc"…...

注解+AOP实现权限控制

注解与AOP实战&#xff1a;实现权限控制 在现代Java开发中&#xff0c;注解&#xff08;Annotation&#xff09;和面向切面编程&#xff08;AOP&#xff09;是两种强大的技术&#xff0c;它们能够帮助我们实现代码的解耦&#xff0c;提高代码的可读性和可维护性。本文将通过一…...

2.5 python接口编程

在现代软件开发的复杂生态系统中&#xff0c;不同系统、模块之间的交互协作至关重要。接口编程作为一种关键机制&#xff0c;定义了组件之间的通信规范与交互方式。Python 凭借其卓越的灵活性、丰富的库资源以及简洁易读的语法&#xff0c;在接口编程领域占据了重要地位&#x…...

睡不着运动锻炼贴士

在快节奏的现代生活中&#xff0c;失眠似乎已成为许多人的“夜间伴侣”。夜晚辗转反侧&#xff0c;白天精神不振&#xff0c;这样的恶性循环让许多人苦不堪言。其实&#xff0c;除了调整作息和饮食习惯&#xff0c;适当的运动也是改善睡眠的一剂良药。今天&#xff0c;就让我们…...

【Python入门】一篇掌握Python中的字典(创建、访问、修改、字典方法)【详细版】

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《Python/PyTorch极简课》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目…...

深入理解 HTML 表单与输入

在网页开发的广袤领域中&#xff0c;HTML 表单如同搭建用户与服务器沟通桥梁的基石。它是收集用户输入信息的关键渠道&#xff0c;承载着交互的重任。今天&#xff0c;就让我们一同深入探索 HTML 表单与输入的奥秘。​ HTML 表单在文档中划定出一片独特的区域&#xff0c;这片…...

宝塔docker切换存储目录

1、 停止 Docker 服务 sudo systemctl stop docker2、迁移 Docker 数据目录 sudo mkdir -p /newpath/docker sudo rsync -avz /var/lib/docker/ /newpath/docker/3、修改 Docker 配置文件 vi /etc/docker/daemon.json 内容 {"data-root": "/newpath/docker&q…...

IPoIB驱动中RSS与TSS技术的深度解析:多队列机制与性能优化

在高速网络通信中,IP over InfiniBand(IPoIB) 是实现低延迟、高吞吐的关键技术之一。为了充分发挥多核处理器的性能潜力,IPoIB驱动通过 接收侧扩展(RSS) 和 发送侧扩展(TSS) 技术,实现了数据包处理的多队列并行化。本文结合源码实现与性能优化策略,深入解析其核心机制…...

目前人工智能的发展,判断10年、20年后的人工智能发展的主要方向,或者带动的主要产业

根据2025年的最新行业研究和技术演进趋势&#xff0c;结合历史发展轨迹&#xff0c;未来10-20年人工智能发展的主要方向及带动的产业将呈现以下六大核心趋势&#xff1a; 一、算力革命与底层架构优化 核心地位&#xff1a;算力将成为类似“新能源电池”的基础设施&#xff0c;…...

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…...

并发编程面试题二

1、java线程常见的基本状态有哪些&#xff0c;这些状态分别是做什么的 &#xff08;1&#xff09;创建&#xff08;New&#xff09;&#xff1a;new Thread()&#xff0c;生成线程对象。 &#xff08;2&#xff09;就绪&#xff08;Runnable&#xff09;:当调用线程对象的sta…...

【NLP】 8. 处理常见词(Stopwords)的不同策略

处理常见词&#xff08;Stopwords&#xff09;的不同策略 在自然语言处理 (NLP) 和信息检索 (IR) 任务中&#xff0c;常见词&#xff08;Stopwords&#xff09; 是指在文本中频繁出现但通常对主要任务贡献较小的词&#xff0c;例如 “the”、“is”、“in”、“and” 等。这些…...

【Java基础】java中的lambda表达式

Java Lambda表达式深度解析&#xff1a;语法、简化规则与实战 前言 Java 8的Lambda表达式通过简化匿名内部类和引入函数式编程&#xff0c;极大提升了代码的简洁性和可读性。 一、Lambda表达式的核心语法 Lambda表达式由参数列表、->符号和表达式主体组成&#xff0c;其基…...

【RS】OneRec快手-生成式推荐模型

note 本文提出了一种名为 OneRec 的统一生成式推荐框架&#xff0c;旨在替代传统的多阶段排序策略&#xff0c;通过一个端到端的生成模型直接生成推荐结果。OneRec 的主要贡献包括&#xff1a; 编码器-解码器结构&#xff1a;采用稀疏混合专家&#xff08;MoE&#xff09;架构…...

DQN 玩 2048 实战|第一期!搭建游戏环境(附 PyGame 可视化源码)

视频讲解&#xff1a; DQN 玩 2048 实战&#xff5c;第一期&#xff01;搭建游戏环境&#xff08;附 PyGame 可视化源码&#xff09; 代码仓库&#xff1a;GitHub - LitchiCheng/DRL-learning: 深度强化学习 2048游戏介绍&#xff0c;引用维基百科 《2048》在44的网格上进行。…...

练习题:87

目录 Python题目 题目 题目分析 代码实现 代码解释 列表推导式部分&#xff1a; 变量赋值和输出&#xff1a; 运行思路 结束语 Python题目 题目 使用列表推导式生成一个包含 1 到 100 中所有偶数的列表。 题目分析 本题要求使用 Python 的列表推导式生成一个包含 …...

二叉树的层序遍历(102)

102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

NVMe集群:加速数据处理

随着大数据和云计算的快速发展&#xff0c;企业面临着前所未有的数据处理挑战。传统的存储技术和架构已经难以满足现代应用对高性能和低延迟的需求。在这种背景下&#xff0c;NVMe&#xff08;Non-Volatile Memory Express&#xff09;集群应运而生&#xff0c;它以其卓越的性能…...

JUC并发编程:共享模型之管程

一、共享带来的问题 &#xff08;1&#xff09;Java的体现 两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; &#xff08;2&#xff09;问题分析 以上的结果可能是正数、负数、零。为什么呢…...

Java构造方法详解:从入门到实战

目录 一、什么是构造方法&#xff1f; 二、构造方法的作用 三、构造方法分类与使用 1. 默认构造方法 2. 有参构造方法 3. 构造方法重载 四、注意事项&#xff08;避坑指南&#xff09; 五、经典面试题解析 六、实战应用场景 七、总结 一、什么是构造方法&#xff1f; …...

Uniapp 字体加载问题(文件本地存储)

项目场景&#xff1a; 在最近公司开发一款小程序&#xff0c;但是小程序的文字需要用艺术字&#xff0c;就是那种不能用切图绕开的那种&#xff01; 问题描述 我们在使用uni.loadfontface Api请求数据字体文件的时候总是会报错&#xff0c;就是那种网上也找不到解决方法的那种…...

HTML 新手入门:从零基础到搭建第一个静态页面(一)

开启 HTML 学习之旅 在互联网的广袤世界中&#xff0c;网页是我们与信息交互的主要窗口。而 HTML&#xff0c;作为构建网页的基石&#xff0c;就像是搭建房屋的砖块&#xff0c;是网页开发中不可或缺的基础。无论你是对网页开发充满好奇的小白&#xff0c;还是渴望系统学习前端…...

使用multiprocessing实现进程间共享内存

在 Python 中,可以使用多种方法来实现几个进程之间的通信。 简单消息传递:使用 multiprocessing.Queue 或 multiprocessing.Pipe。 共享简单数据:使用 multiprocessing.Value 或 multiprocessing.Array。 共享复杂数据:使用 multiprocessing.Manager。 进程间信号控制:使用…...

在IDEA中连接达梦数据库:详细配置指南

达梦数据库&#xff08;DM Database&#xff09;作为国产关系型数据库的代表&#xff0c;广泛应用于企业级系统开发。本文将详细介绍如何在IntelliJ IDEA中配置并连接达梦数据库&#xff0c;助力开发者高效完成数据库开发工作。 准备工作 1. 下载达梦JDBC驱动 访问达梦官方资…...

docker无法正常拉取镜像问题的解决

目录 1.前言 2.解决方案 1.前言 安装docker后拉取镜像&#xff0c;遇见了如下问题&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded whil…...

如何在保持安全/合规的同时更快地构建应用程序:DevOps 指南

随着敏捷思维方式的兴起&#xff0c;开发和 DevOps 团队都面临着持续的压力&#xff0c;他们需要以迭代方式缩短发布周期并加快部署速度&#xff0c;以满足不断增长的客户期望。随着这种对速度的追求越来越强烈&#xff0c;维护安全性和合规性标准的复杂性也随之增加。 当今 D…...

SQL Server查询优化

最常用&#xff0c;最有效的数据库优化方式 查询语句层面 避免全表扫描 使用索引&#xff1a;确保查询条件中的字段有索引。例如&#xff0c;查询语句 SELECT * FROM users WHERE age > 20&#xff0c;若 age 字段有索引&#xff0c;数据库会利用索引快速定位符合条件的记…...

iOS底层原理系列04-并发编程

在移动应用开发中&#xff0c;流畅的用户体验至关重要&#xff0c;而并发编程是实现这一目标的关键技术。本文将深入探讨iOS平台上的并发编程和多线程架构&#xff0c;帮助你构建高性能、响应迅速的应用程序。 1. iOS线程调度机制 1.1 线程本质和iOS线程调度机制 线程是操作…...

企业数字化转型数据治理解决方案(119页PPT)(文末有下载方式)

资料解读&#xff1a;企业数字化转型数据治理解决方案 详细资料请看本解读文章的最后内容。 在当今数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。然而&#xff0c;随着数据量的激增和数据来源的多样化&#xff0c;如何有效管理和利用这些数据成为了企业面临的一…...

git报错:“fatal:refusing to merge unrelated histories“

新建仓库&#xff0c;克隆本地项目到新仓库&#xff0c;首次同步本地已提交的代码到远程时&#xff0c;报错&#xff1a;"fatal:refusing to merge unrelated histories" 。 报错意思是&#xff1a;致命的&#xff1a;拒绝合并无关的历史。 一、问题背景&#xff…...

Jmeter下载及环境配置

Jmeter下载及环境配置 java环境变量配置配置jdk环境变量检查是否配置成功JMeter下载 java环境变量配置 访问地址&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/ 注意&#xff1a;需要自己注册账号 下载完成&#xff0c;解压后的目录为&#xff1a; …...

K8S学习之基础二十四:k8s的持久化存储之pv和pvc

K8S的存储之pv和pvc 在 Kubernetes (k8s) 中&#xff0c;持久化存储是通过 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 来实现的。PVC 是用户对存储资源的请求&#xff0c;而 PV 是集群中的实际存储资源。PVC 和 PV 的关系类似于 Pod 和 Node 的关系。 Persisten…...

1.5、Java构造方法重载

构造方法重载的实现 &#xff08;1&#xff09;定义多个构造方法 class Person {private String name;private int age;// 无参构造方法public Person() {this.name "Unknown";this.age 0;}// 带一个参数的构造方法public Person(String name) {this.name name;…...

领域驱动设计(DDD)技术分享:从三层架构到DDD的进化之旅

一、开篇话&#xff1a;我们为什么要聊DDD&#xff1f; 如果你像我一样有着Java开发背景&#xff0c;那Spring的三层架构可能是你的老朋友了。Controller-Service-DAO这种模式简直就像我们编程的"家常便饭"。但是&#xff0c;随着业务越来越复杂&#xff0c;你是否也…...

LeetCode - #227 基于 Swift 实现基本计算器

摘要 在这篇文章中&#xff0c;我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 、-、* 和 / 的数学表达式&#xff0c;并且遵循运算符的优先级规则。整数除法仅保留整数部分&#xff0c;不能使用 eval() 这样的内置解析方法。 描述 给你一个字符串表…...

Elasticsearch Java High Level Client [7.17] 使用

es 的 HighLevelClient存在es源代码的引用&#xff0c;结合springboot使用时&#xff0c;会存在es版本的冲突&#xff0c;这里记录下解决冲突和使用方式&#xff08;es已经不建议使用这个了&#xff09;。 注意es服务端的版本需要与client的版本对齐&#xff0c;否则返回数据可…...

[多线程]基于环形队列(RingQueue)的生产者-消费者模型的实现

标题&#xff1a;[多线程]基于环形队列&#xff08;RingQueue&#xff09;的生产者-消费者模型 水墨不写bug 一、模型实现 接下来我们要实现一个基于环形队列&#xff08;RingQueue&#xff09;的生产者-消费者模型。该模型使用信号量和互斥锁来保证生产者和消费者之间的同步与…...

HAL库STM32常用外设—— CAN通信(一)

文章目录 一、CAN是什么&#xff1f;1.1 CAN应用场景1.2 CAN通信优势 二、CAN基础知识介绍2.1 CAN总线结构2.2 CAN总线特点2.2.1 CAN总线的数据传输特点2.2.2 位时序和波特率 2.3 CAN位时序和波特率2.3 CAN物理层2.3.1 CAN 物理层特性2.3.2 CAN 收发器芯片介绍 2.4 CAN协议层2.…...

分页查询的实现

目录 前言 一.问题描述 二.后端实现步骤 2.1配置PageHelper插件 ①导入依赖 ②在application.yml配置文件中添加相关配置 2.2编写一个入门的程序&#xff0c;体验分页过程 2.3定义一个vo&#xff0c;用来收集分页后的所有信息 2.4修改serviceImpl层的代码 2.5动态设…...

Sourcetree——使用.gitignore忽略文件或者文件夹

一、为何需要文件忽略机制&#xff1f; 1.1 为什么要会略&#xff1f; 对于开发者而言&#xff0c;明智地选择忽略某些文件类型&#xff0c;能带来三大核心优势&#xff1a; 仓库纯净性&#xff1a;避免二进制文件、编译产物等污染代码库 安全防护&#xff1a;防止敏感信息&…...

Thinkphp的belongsToMany(多对多) 和 hasManyThrough(远程一对多)的区别是什么?

虽然 belongsToMany&#xff08;多对多&#xff09; 和 hasManyThrough&#xff08;远程一对多&#xff09; 都会使用 JOIN 查询&#xff0c;但它们的核心区别在于 关联关系的本质不同&#xff0c;具体如下&#xff1a; 1️⃣ belongsToMany&#xff08;多对多&#xff09; &a…...

DataWhale 大语言模型 - 大模型技术基础

本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的核心技术。并且&#xff0c;课程…...

Docker+Flask 实战:打造高并发微服务架构

DockerFlask 实战&#xff1a;打造高并发微服务架构 今天我们要深入探讨一个非常热门且实用的主题&#xff1a;基于 Docker 部署 Python Flask 应用。Docker 作为当下最流行的容器化技术&#xff0c;已经广泛应用于各种开发和部署场景&#xff0c;尤其是在微服务架构中。而 Fl…...

前端跨域如何调试,以及相关概念梳理【环境变量 本地代理 正向代理 反向代理 OPTIONS请求 CDN 等】

跨域报错 一 前端日常开发时&#xff0c;项目的部署地址和接口请求的地址一般是同源的&#xff0c;不会跨域。 例如项目的测试环境部署在https://my-dev.BeatingWorldLine.com/xxx, 测试环境的访问接口域名也要相同来保证不跨域https://my-dev.BeatingWorldLine.com/api/xxx, …...

【区块链】以太坊

学习视频源链接&#xff1a; https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根据肖老师的视频进行的笔记记录 bitcoin 1.0 区块链 以太坊 2.0区块链 以太坊 设置了 memory hard mining puzzle &#xff0c;这造成了asic resistance&#xff0c; 后续 proof of work &a…...