springboot3 RestClient、HTTP 客户端区别
1 RestClient使用
RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与 RestTemplate 的比较。
1.1 RestClient 和 RestTemplate
RestTemplate,顾名思义,是基于模板设计模式构建的。它是一种行为设计模式,用于在方法中定义算法的框架,允许子类为某些步骤提供特定的实现。虽然这是一种强大的模式,但它会导致需要进行方法覆写,这可能是不方便的。
为了改进这一点,RestClient 采用了 Fluent API。Fluent API 也是一种设计模式,它允许以一种使代码更易读和表达的方式进行方法链式调用,通常无需使用中间变量。从创建一个基本的 RestClient 开始:
RestClient restClient = RestClient.create();
1.2 使用各种 HTTP 方法发起请求
与 RestTemplate 或其他 REST 客户端类似,RestClient 可以使用不同的 HTTP 方法发起请求。创建一个用于操作的 Article 类:
public class Article {Integer id;String title;// 构造函数和 getter/setter
}
1.2.1 使用 GET 请求获取资源
GET 请求用于检索 Web 服务器上指定资源的数据,而不对其进行修改。通常,这是一个只读的操作!获取服务器响应的字符串(String):
String result = restClient.get().uri(uriBase + "/articles").retrieve().body(String.class);
1.2.2 使用 POST 请求创建资源
POST 请求用于提交数据到 Web 服务器上,进行新的资源创建。资源通常是通过 URI 定义的。向服务器发送一篇 ID 为 1 的 Article:
Article article = new Article(1, "How to use RestClient");
ResponseEntity<Void> response = restClient.post().uri(uriBase + "/articles").contentType(APPLICATION_JSON).body(article).retrieve().toBodilessEntity();
由于指定了 APPLICATION_JSON Content Type,Jackson 库会自动将 Article 类实例序列化为 JSON。在本例中,使用 toBodilessEntity() 方法忽略了响应体。POST 端点不需要返回任何 Payload,通常也不会返回任何 Payload。
1.2.3 使用 PUT 请求更新资源
接下来是 PUT 请求,用于更新或替换已经存在的资源。修改上一段中创建的 Article,URI 中的 ID 即表示要修改的资源:
Article article = new Article(1, "How to use RestClient even better");
ResponseEntity<Void> response = restClient.put().uri(uriBase + "/articles/1").contentType(APPLICATION_JSON).body(article).retrieve().toBodilessEntity();
与 POST 请求一样,依靠 RestClient 对 Payload 进行序列化,并忽略响应。
1.2.4 使用 DELETE 请求删除资源
使用 DELETE 请求从 Web 服务器上删除指定资源。与 GET 类似,通常不提供任何 Payload,而是在 URI 参数中指定要删除的资源:
ResponseEntity<Void> response = restClient.delete().uri(uriBase + "/articles/1").retrieve().toBodilessEntity();
1.3 反序列化响应
通常,我们希望将请求序列化,并将响应反序列化为我们可以操作的类。RestClient 具有执行 JSON 到对象转换的功能,该功能由 Jackson 库提供。此外,由于共享使用了 Message Converter,因此可以使用 RestTemplate 支持的所有数据类型。通过 ID 获取一篇文章,并将其序列化为 Article 类的实例:
Article article = restClient.get().uri(uriBase + "/articles/1").retrieve().body(Article.class);
当我们需要获取 List 等泛型类的实例时,指定 body 的类就比较复杂了。例如,如果我们想获取所有 Article,以 List<Article> 对象形式返回。在这种情况下,可以使用 ParameterizedTypeReference 抽象类来告诉 RestClient 我们要获取什么对象。甚至不需要指定泛型类型,Java 会自动推断出类型:
List<Article> articles = restClient.get().uri(uriBase + "/articles").retrieve().body(new ParameterizedTypeReference<>() {});
1.4 使用 Exchange 解析响应
RestClient 包含 exchange() 方法。通过提供对底层 HTTP 请求和响应的访问权限,用于处理更复杂的情况。在这种情况下,库不会应用默认的 Handler,我们必须自己处理响应的 Status。
比方说,当数据库中没有文章时,服务会返回 204 (No Content)状态代码。由于这种行为略显非标准,我们希望以一种特殊的方式来处理它。当状态代码等于 204 时,抛出一个 ArticleNotFoundException 异常;当状态代码不等于 200 时,抛出一个更通用的异常:
List<Article> article = restClient.get().uri(uriBase + "/articles").exchange((request, response) -> {if (response.getStatusCode().isSameCodeAs(HttpStatusCode.valueOf(204))) {throw new ArticleNotFoundException();} else if (response.getStatusCode().isSameCodeAs(HttpStatusCode.valueOf(200))) {return objectMapper.readValue(response.getBody(), new TypeReference<>() {});} else {throw new InvalidArticleResponseException();}
});
由于我们在这里处理的是原始响应,因此还需要使用 ObjectMapper 对 Response Body 进行反序列化。
1.5 异常处理
默认情况下,当 RestClient 在 HTTP 响应中遇到 4xx 或 5xx 状态码时,它会抛出一个 RestClientException 子类的异常。我们可以通过自定义 Status Handler 来覆盖这一行为。自定义 Status Handler,在找不到文章时抛出一个自定义异常:
Article article = restClient.get().uri(uriBase + "/articles/1234").retrieve().onStatus(status -> status.value() == 404, (request, response) -> {throw new ArticleNotFoundException(response)}).body(Article.class);
1.6 从 RestTemplate 构建 RestClient
如果你已经在项目中使用上了 RestTemplate,也可以可从 RestTemplate 构建 RestClient。
RestTemplate oldRestTemplate;
RestClient restClient = RestClient.create(oldRestTemplate);
2 HTTP 客户端区别
2.1 RestTemplate
RestTemplate 是 Spring 框架提供的同步 HTTP 客户端,专用于发起 RESTful 请求。它通过封装 HTTP 请求和响应的样板代码,提供了一种简洁的方式与 REST 服务进行交互。
2.1.1 核心特性
- 同步API: RestTemplate以同步方式运行,阻塞当前线程直到收到响应。
- 模板方法: 提供了用于常见HTTP操作(GET、POST、PUT、DELETE等)的预定义方法。
- 可定制性: 允许通过拦截器、错误处理程序和消息转换器进行定制。
- 对象映射: 可以使用消息转换器自动将请求和响应体转换为Java对象。
2.1.2 优点和缺点
优点:
- 使用简单易懂:
RestTemplate提供了直观的 API,简化了与 RESTful 服务的交互,开发者可以轻松上手。 - 适用于简单用例: 对于常见的 CRUD 操作和简单的 HTTP 请求处理,
RestTemplate是一种方便的选择。 - 与 Spring 生态系统良好集成: 作为 Spring 框架的一部分,
RestTemplate与 Spring 的其他组件紧密配合,能够无缝融入到 Spring 应用中。
缺点:
- 同步特性可能在高并发场景中影响性能: 由于
RestTemplate是同步的,调用线程会阻塞直到响应返回,这在高并发情况下可能导致性能瓶颈。 - 对异步和响应式编程的支持有限:
RestTemplate不支持异步处理,也无法与响应式编程模式兼容,这使得它在需要非阻塞操作的场景中不够灵活。 - 正在被
WebClient取代: 随着 Spring 5 的推出,WebClient作为更现代的 HTTP 客户端出现,逐渐成为RestTemplate的替代品,尤其是在响应式编程场景下。
2.1.3 使用 RestTemplate 的时机
RestTemplate 适用于那些同步行为可接受且性能要求不高的简单用例。对于需要进行直接 REST 交互的中小型应用程序,RestTemplate 可能是一个理想的选择。特别是在以下情况下,它是不错的工具:
- 简单的 CRUD 操作: 当应用程序主要处理创建、读取、更新和删除等基本 REST 操作时,
RestTemplate提供了简洁易用的 API。 - 同步请求: 如果应用程序可以容忍同步请求,且并发需求不高,那么
RestTemplate可以很好地满足需求。 - 快速原型开发: 在开发阶段,
RestTemplate可以快速帮助构建和测试 RESTful API 的交互逻辑。
然而,当需要处理复杂的异步操作、流式处理或者更高的并发需求时,应该考虑使用 WebClient 或 RestClient。
2.2 WebClient
WebClient 是在 Spring 5 中引入的非阻塞、响应式 HTTP 客户端,被设计为 RestTemplate 的替代品。它基于 Project Reactor 构建,支持异步和非阻塞操作。这种方式非常适合构建现代、可扩展的应用程序,特别是在需要高效处理高并发场景时,WebClient 能够显著提高性能和系统的响应能力。
WebClient 提供了灵活且强大的 API,使开发者能够轻松处理复杂的 HTTP 交互,包括流式数据处理和异步操作。由于它与 Spring 的响应式编程模型紧密集成,因此对于现代微服务架构和高并发应用来说,WebClient 是一个至关重要的工具。
2.2.1 核心特性
- 响应式 API:
WebClient利用Mono和Flux等响应式编程概念来进行异步操作,使开发者可以轻松处理单个或多个异步数据流。 - 流畅接口:
WebClient提供了声明式、可读性强的 API,用于构建和执行 HTTP 请求,开发者可以通过链式调用方式轻松定义复杂的请求逻辑。 - 非阻塞:
WebClient的非阻塞特性允许在不阻塞当前线程的情况下发起请求,从而提高了资源利用率,特别是在高并发场景下表现尤为出色。 - 与 Spring 生态系统集成:
WebClient与Spring Data Reactive、Spring Security等其他 Spring 组件无缝集成,支持响应式数据访问和安全认证等功能,使得它能够完美融入 Spring 响应式堆栈。
2.2.2 优点和缺点
优点:
- 非阻塞和异步:
WebClient支持非阻塞的异步操作,可以更高效地利用系统资源,特别是在处理大量并发请求时表现出色。 - 并发请求的高性能: 通过异步处理和非阻塞 I/O,
WebClient能够处理更高的并发请求量,适合需要高吞吐量的应用场景。 - 支持响应式编程:
WebClient与 Spring 的响应式编程模型紧密集成,支持Mono和Flux,能够更自然地处理流式数据和异步操作。 - 更适合现代应用程序架构: 对于微服务架构、响应式系统等现代架构,
WebClient提供了更丰富的功能和更高的灵活性,能够适应复杂的需求。
缺点:
- 学习曲线更陡峭: 由于
WebClient基于响应式编程模型,开发者可能需要掌握Mono和Flux等响应式编程概念,这对不熟悉响应式编程的开发者来说会有一定的学习难度。 - 更复杂的错误处理: 与
RestTemplate相比,WebClient的错误处理可能更复杂,需要开发者在处理响应状态、异常和重试机制时更加小心和全面。
2.2.3 使用WebClient的时机
WebClient 是大多数现代 Spring 应用程序的首选工具。它非常适合微服务架构、高流量应用程序,以及那些非阻塞行为至关重要的场景。在构建响应式系统或需要高效处理大量并发请求时,WebClient 是一个值得优先考虑的选择。无论是处理复杂的 HTTP 交互,还是构建高度可扩展的系统,WebClient 都能为开发者提供强大的功能和灵活性,使其能够轻松应对现代应用程序的需求。
2.3 RestClient
RestClient 是 Spring HTTP 客户端领域的最新发展,作为 RestTemplate 的现代化和高效替代品引入。它旨在解决 RestTemplate 的一些局限性,同时结合了 WebClient 的最佳实践。
RestClient 提供了更先进的功能,专注于优化性能和提高开发效率,尤其在处理 RESTful API 请求时,结合了响应式编程和非阻塞操作的优点。通过引入 RestClient,Spring 提供了一种更现代的解决方案,能够更好地满足当前和未来的应用需求。
2.3.1 核心特性和改进
- 构建者模式:
RestClient使用构建者模式来构建请求,这种模式提供了更流畅、可读性更高的 API,使得请求的配置和管理更加直观和灵活。 - 异步操作: 尽管
RestClient的异步能力不如WebClient那么全面,但它通过CompletableFuture提供了一定程度的非阻塞能力,适合需要异步处理但不要求完全响应式的场景。 - 响应式支持:
RestClient可以与Project Reactor等响应式编程框架集成,支持响应式编程模型,使其能够更好地适应现代应用程序的需求,并提高应用程序的可扩展性。 - 简化的错误处理:
RestClient提供了改进的错误处理机制,使得异常处理和 HTTP 状态码的管理变得更加简单和直接,有助于提高开发效率和代码质量。
2.3.2 使用RestClient的时机
当我们需要在 RestTemplate 的简单性和 WebClient 的高级特性之间取得平衡时,RestClient 是一个合适的选择。它适用于那些需要异步操作但不需要完全响应式编程的项目,提供了一种折衷方案。
此外,如果您正在从 RestTemplate 迁移并希望逐步过渡,RestClient 也是一个很好的选择。它不仅保留了 RestTemplate 的易用性,还引入了现代化的特性,使得迁移过程更加平滑,同时为未来的需求提供了更多的灵活性。
2.4 三者比较
以下是 RestTemplate、WebClient 和 RestClient 的特性对比表:
| 特性 | RestTemplate | WebClient | RestClient |
|---|---|---|---|
| 同步/异步 | 同步 | 异步 | 同步/异步 |
| API 风格 | 模板方法 | 流畅构建者 | 流畅构建者 |
| 响应式 | 否 | 是 | 部分 |
| 性能 | 较低 | 较高 | 中等 |
| 复杂性 | 较低 | 较高 | 中等 |
| Spring 版本 | 旧版本 | Spring 5+ | Spring 6.1+ |
2.4.1 重要考虑因素
- 性能: 对于需要处理高并发和非阻塞操作的场景,
WebClient显然是最佳选择,它提供了高性能和良好的资源利用效率。 - 复杂性:
RestTemplate提供了简单易用的 API,适合初学者和简单用例;而WebClient和RestClient提供了更多高级特性和灵活性,但复杂性也相应较高。 - 项目需求: 如果您的项目需要同步行为和易用性,
RestTemplate可能已经足够。如果您正在构建现代响应式应用程序,WebClient是最佳选择。RestClient则提供了一种在这两者之间的平衡方案,适合那些需要异步操作但不完全响应式的场景。 - Spring 版本: 选择客户端时,请确保与您当前使用的 Spring 版本兼容。
RestTemplate是较旧版本的选择,而WebClient和RestClient则需要较新的 Spring 版本。
2.4.2 建议
- 新项目: 如果您正在开始一个新项目,优先考虑使用
WebClient,因为它提供了最佳的性能和响应式能力,适合现代应用程序的需求。 - 现有项目: 对于已经使用
RestTemplate的现有项目,如果计划迁移到更现代的客户端,RestClient可以作为一个很好的过渡步骤,逐步引入异步和非阻塞特性。 - 简单用例: 对于简单的 HTTP 请求和同步操作,
RestTemplate仍然是一个合适的选择,特别是在性能和复杂性要求不高的情况下。
相关文章:
springboot3 RestClient、HTTP 客户端区别
1 RestClient使用 RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端,它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应,这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...
分布式存储学习——HBase概述
1.1 HBase概述 1.1.1 理解大数据背景 1.1.2 HBase是什么 1.1.3 HBase与Hadoop的关系 1.1.4 HBase的核心功能模块 1.1.5 HBase的应用场景和经典案例 1.1.6 小结 本文参考于学校《HBase应用于开发》教材 1.1 HBase概述 本节将介绍大数据背景和HBase的基本概念,…...
LLM run
lmstudio lmstudio ollama ollama N 卡使用自带UI gpu加速推理 ,选择满足条件的, ds模型选择列表 https://ollama.com/library/deepseek-r1 a卡当前支持的显卡型号 I卡 gpu加速配置 2025.3 intel Official project optimization https://www.modelscope.cn/m…...
HttpServletRequest、ServerHttpRequest 和 ServerWebRequest作用详解
1、HttpServletRequest 所属框架:Java Servlet API(基于阻塞式 I/O)。 使用场景:传统的 Servlet 应用(如 Spring MVC的Tomcat、常用的容器等等)。 作用:表示客户端的 HTTP 请求。 常用方法&a…...
【大模型基础_毛玉仁】2.2 大语言模型架构概览
【大模型基础_毛玉仁】2.2 大语言模型架构概览 2.2 大语言模型架构概览2.2.1 主流模型架构的类别1)Encoder-only 架构2)Encoder-Decoder 架构3)Decoder-only 架构 2.2.2 模型架构的功能对比1)注意力矩阵2)适用任务 2.2…...
微信小程序点击按钮,将图片下载到本地
前言: 最近在公司完成一个小程序的时候需要实现一个功能:点击按钮获取用户相册权限,将图片下载到用户本地相册,经过了好几次的尝试最终算是实现了。将总结的经验在这里分享给小伙伴们。 实现方式: //.wxml文件 <…...
在Linux系统上集成OpenSlide与SpringBoot
本文档详细介绍如何在Linux系统上安装OpenSlide并将其与Spring Boot应用程序集成,以实现数字病理切片的处理和查看功能。 目录 OpenSlide简介在Linux上安装OpenSlide安装OpenSlide Java绑定在Spring Boot项目中集成OpenSlide示例代码性能优化建议常见问题解决参考资源OpenSli…...
现代密码学体系架构设计原则与实践:基于Python的实现与GPU加速GUI演示
目录 现代密码学体系架构设计原则与实践:基于Python的实现与GPU加速GUI演示一、前言二、现代密码学体系架构设计原则1. 安全性原则2. 模块化设计3. 最小权限原则4. 加密算法的选择5. 硬件加速与GPU应用6. 可扩展性与可维护性三、主要加密算法解析1. 对称加密算法:AES2. 非对称…...
pt-archiver删除数据库的数据表/各种报错类型
这篇帖子是前面文的一部分延申 mysqlimport导入一亿数据的csv文件/一行命令删除表-CSDN博客 如需转载,标记出处 目录 pt-archiver命令格式 如果执行后出现下面报错 1)Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233. …...
LLM 学习(一 序言)
文章目录 LLM 学习(一 序言)知识点1:“Embedding” 在人工智能领域:知识点2:Embedding 引入位置信息的原因知识点3:在 Transformer 的 Decoder 翻译第 i 个单词时进行 Mask 第 i1 个单词的操作 LLM 学习&am…...
STM32-HAL库初始化时钟
使能和失能外设GPIOA 时钟信号初始化函数 HAL_RCC_OscConfig函数: HAL_StatusTypeDef是该函数的返回值类型,最顶上的那句话只是这个函数的原型 HAL_RCC_ClockConfig函数: 因为FLASH实际上只能支持24MHz的时钟信号所以如果用高于24MHz的信号输入则要用到等…...
MySQL主从架构配合ShardingJdbc实现读写分离
文章目录 目录架构搭建读写分离pom.xmlfdy-live-user-provider 模块application.ymlfdy-db-sharding.yamlShardingJdbcDatasourceAutoInitConnectionConfig.java 目录 架构搭建 基于Docker去创建MySQL的主从架构 读写分离 pom.xml <dependency><groupId>mysql…...
批量将 Word 拆分成多个文件
当一个 Word 文档太大的时候,我们通常会将一个大的 Word 文档拆分成多个小的 Word 文档,在 Office 中拆分 Word 文档是比较麻烦的,我们需要将 Word 文档的页面复制到另外一个 Word 文档中去,然后删除原 Word 文档中的内容。当然也…...
【算法系列】桶排序算法介绍及实现
文章目录 桶排序算法介绍及实现桶排序的基本原理算法实现步骤Java代码实现性能优化结论 桶排序算法介绍及实现 桶排序的基本原理 桶排序(Bucket Sort)是一种基于分组的排序算法,其核心思想是将一组数据按某种 规则分配到多个桶中࿰…...
当AI开始“思考“:拆解大模型训练与推理的秘密(以DeepSeek为例)
如果你用过deepseek,可能体验过它在几秒内编故事、写代码的震撼。但你是否想过,这种"智能输出"背后存在两种完全不同的底层机制?就像人类需要先学习知识(训练)才能考试答题(推理)&…...
13.数据结构(软考)
13.数据结构(软考) 13.1:线性表 13.1.1 顺序表 顺序存储方式:数组的内存是连续分配的并且是静态分配的,即在使用数组之前需要分配固定大小的空间。 时间复杂度: 读:O(1) 查询:1,(n1)/2&#x…...
拉拉扯扯adfda
read -p "请输入一个成绩:" sorce if [ "$sorce" -ge 90 -a "$sorce" -le 100 ] thenecho A elif [ "$sorce" -ge 80 -a "$sorce" -lt 90 ] thenecho B elif [ "$sorce" -ge 70 -a "$sorce"…...
【计算机网络】TCP
1.基本概念及报文格式 基本概念: TCP的中文全称为传输控制协议(Transmission Control Protocol),是一种可靠的,面向连接的,基于字节流的传输层通信协议。 报文格式: 序号 :占32⽐…...
doris: PostgreSQL
Doris JDBC Catalog 支持通过标准 JDBC 接口连接 PostgreSQL 数据库。本文档介绍如何配置 PostgreSQL 数据库连接。 使用须知 要连接到 PostgreSQL 数据库,您需要 PostgreSQL 11.x 或更高版本 PostgreSQL 数据库的 JDBC 驱动程序,您可以从 Maven 仓…...
深度学习笔记——神经网络
本文为在拓尔思智能举办的训练营中学习内容的总结,部分内容摘自百度百科 个人在这里推荐一个好用的软件,Trae,主要是免费。 人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多…...
django中路由配置规则的详细说明
在 Django 中,路由配置是将 URL 映射到视图函数或类视图的关键步骤,它决定了用户请求的 URL 会触发哪个视图进行处理。以下将详细介绍 Django 中路由配置的规则、高级使用方法以及多个应用配置的规则。 基本路由配置规则 1. 项目级路由配置 在 Django 项目中,根路由配置文…...
关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题
如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入: <meta charset"UTF-8"> 以jsp为例子,我们…...
pytest结合allure
Allure 一、文档二、指令三、装饰器3.1 allure.step装饰器3.2 allure.description装饰器3.3 allure.title装饰器3.4 allure.link、allure.issue 和 allure.testcase装饰器3.5 allure.epic、allure.feature 和 allure.story装饰器3.6 allure.severity装饰器 一、文档 allure文档…...
机器学习在地图制图学中的应用
原文链接:https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心内容 本文是《制图学与地理信息科学》特刊的扩展评论,系统探讨了机…...
vue2升vue3,uniapp兼容鸿蒙app踩坑记录
前提:最近鸿蒙势头很好,公司的 uniapp vue2 项目,要兼容鸿蒙app。就开始了我的uniapp转鸿蒙踩坑之旅,请看下文(注意下文都是在uniapp开发基础上) 1. 首先鸿蒙开发只支持Vue3,不支持Vue2、不支持…...
Linux基础网络设置
文章目录 Linux基础网络设置介绍查看和配置网络接口查看活动网络接口信息临时修改网卡IP地址永久修改IP地址启用和关闭网卡 主机名设置查看和临时修改主机名永久修改主机名 路由表设置查看路由表信息 网络连接状态和接口统计信息查看网络连接状态 网络连通性测试测试网络连通性…...
DeepSeek × 豆包深度整合指南:工作流全解析
DeepSeek 豆包深度整合指南:工作流全解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 DeepSeek 豆包深度整合指南:工…...
海思Hi3516DV300交叉编译opencv
OpenCV是一个开源的跨平台计算机视觉库,支持C、Python等多种语言,适用于图像处理、目标检测、机器学习等任务。其核心由C编写,高效轻量,提供实时视觉处理功能,广泛应用于工业自动化、医疗影像等领域。 1 环境准备 1…...
【AI赋能】AI 工具生成视频教材:从创意到成品的全流程指南
AI 工具生成视频教材:从创意到成品的全流程指南 目标 通过本教材,您将学会如何利用 AI 工具(Grok、Sora、Speechify 和 CapCut)生成一个完整的视频,包括脚本生成、视频片段制作、字幕添加、音频生成以及最终剪辑合成…...
[FE] React 初窥门径(五):React 组件的加载过程(commit 阶段)
1. 回顾 前一篇文章我们看到,ReactDOM.render 总共包含这些步骤, 然后介绍了 performSyncWorkOnRoot 做的事情,它主要做了两件事, renderRootSync 可称之为 render 阶段:创建了一颗 Fiber Tree(包含 html …...
