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

前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》

一、使用插件

插件名称:marked
版本:15.0.11
安装插件:npm install marked@15.0.11
作用:marked 是一个用于将 Markdown 语法转换为 HTML 的 JavaScript 库

插件2名称:dompurify
版本:3.2.5
安装插件:npm install dompurify@3.2.5
作用:DOMPurify 是一个专门用于防止 XSS(跨站脚本攻击)的快速、易用且强大的工具。

二、代码实现

  <div v-html="MdHtml"></div>import { marked } from 'marked'import DOMPurify from 'dompurify'// 推荐使用fetch function Fetch({ url, method, data }) {return new Promise(async (resolve, reject) => {window.controller = new AbortController();let sig = window.controller.signal;try {var response = await fetch(url, {headers: {'Authorization': 'Bearer ' + gettoken(),'Content-Type': 'application/json'},method: method,body: JSON.stringify(data),signal:sig })if (response.status != 200) {reject(response)} else {resolve(response)}} catch (err) {reject(err)}})
}
const MdHtml = ref('')
// 发送网络请求
const API = async () => {let param = {"id": 'xxx',}let outText = '' // 用于存储所有接收到的数据块的文本。Fetch({url: `/xxx/xxx/xxx`,method: 'post',data: param}).then(async res => {// res.body 是一个可读的流const reader = res.body.getReader() // getReader 方法返回一个读取器(ReadableStreamDefaultReader),用于读取流中的数据块const dec = new TextDecoder() //  用于将二进制数据解码为文本(解码当前数据块)while (true) {/*** reader.read() 返回一个 Promise,解析为一个对象,包含 done 和 value。* done 表示流是否已经结束。* value 是当前数据块的二进制数据。* 如果 done 为 true,表示流已经结束,调用 getComparsonHistoryNet() 并退出循环*/const { done, value } = await reader.read()if (done) { // 结束后调用别的函数break}const ck = dec.decode(value, { stream: true }) // stream: true 表示这是一个流式解码,适用于部分数据。outText += ck// 解码后的文本块添加到 outText 中const outHtml = marked.parse(outText) // 使用 marked 库将 outText 转换为 HTMLMdHtml.value = DOMPurify.sanitize(outHtml) //使用 DOMPurify 库对生成的 HTML 进行安全处理,防止 XSS 攻击 (将处理后的 HTML 赋值给 MdHtml.value,通常用于更新 Vue 组件的响应式数据)};onMounted(() => {API()
})

三、为什么用 fetch 但是不用 axios
在前端实现流式输出(例如处理服务器发送的事件流,如 SSE 或者分块传输的响应),fetch API 相比 axios 更受推荐的原因主要在于其对流式数据处理的原生支持以及更灵活的控制能力。以下是具体原因:

1. 原生支持流处理
fetch 提供了对 ReadableStream 的直接支持,允许你通过 .body 属性访问响应体作为一个可读流。这意味着你可以逐块读取数据,并且可以在数据到达时立即开始处理,而不是等待整个响应完成。

fetch('your-stream-endpoint').then(response => {const reader = response.body.getReader();const decoder = new TextDecoder('utf-8');function read() {reader.read().then(({ done, value }) => {if (done) {console.log('Stream complete');return;}console.log(decoder.decode(value, { stream: true }));read(); // Continue reading});}read();});

axios 默认情况下不支持流式处理,尽管可以通过配置 responseType: ‘stream’ 来尝试获取流数据,但这通常仅限于 Node.js 环境下使用,并且对于浏览器端的支持不如 fetch 自然和直接。

四、总结
当涉及到流式数据处理时,fetch 因为其对 ReadableStream 的原生支持、更轻量的特点以及更高的灵活性,成为了更优的选择。然而,这并不意味着 axios 不好,它在很多其他场景下仍然是一个强大的 HTTP 客户端工具,尤其是在需要高级功能如请求/响应拦截、自动转换 JSON 数据等方面表现突出。选择哪个工具应基于具体的项目需求来决定。如果项目中大量使用了 axios 并且对流式处理的需求不多,可能继续使用 axios 加上适当的扩展也是可行的。但如果主要是为了处理流式数据,那么 fetch 将是更好的选择。

相关文章:

前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》

一、使用插件 插件名称&#xff1a;marked 版本&#xff1a;15.0.11 安装插件&#xff1a;npm install marked15.0.11 作用&#xff1a;marked 是一个用于将 Markdown 语法转换为 HTML 的 JavaScript 库 插件2名称&#xff1a;dompurify 版本&#xff1a;3.2.5 安装插件&…...

Python字符串常用方法详解

文章目录 Python字符串常用方法详解一、字符串大小写转换方法(常用)1. 基础大小写转换2. 案例&#xff1a;验证码检查&#xff08;不区分大小写&#xff09; 二、字符串查找与替换方法1. 查找相关方法2. 替换相关方法 三、字符串判断方法1. 内容判断方法 四、字符串分割与连接方…...

深度学习中的归一化:提升模型性能的关键因素

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助完成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...

【C++】 —— 笔试刷题day_30

一、爱吃素 题目解析 这道题&#xff0c;简单来说就是给定两个数a和b&#xff0c;然后让我们判断a*b是否是素数。 算法思路 这道题还是比较简单的 首先&#xff0c;输入两个数a和b&#xff0c;这两个数的数据范围都是[1, 10^11]&#xff1b;10的11次方&#xff0c;那a*b不就是…...

WebMvcConfigurer介绍-笔记

1.WebMvcConfigurer功能简介 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 是 Spring MVC 提供的一个接口&#xff0c;用于自定义 Web 应用的配置。通过实现该接口&#xff0c;开发者可以灵活地添加拦截器&#xff08;Interceptors&#xff09;、配置…...

简单图像自适应亮度对比度调整

一、背景介绍 继续在刷对比度调整相关算法&#xff0c;偶然间发现了这个简单的亮度/对比度自适应调整算法&#xff0c;做个简单笔记记录。也许后面用得到。 二、自适应亮度调整 1、基本原理 方法来自论文:Adaptive Local Tone Mapping Based on Retinex for High Dynamic Ran…...

[SpringBoot]Spring MVC(2.0)

紧接上文&#xff0c;这篇我们继续讲剩下的HTTp请求 传递JSON数据 简单来说&#xff1a;JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换 JSON的语法 1. 数据在 键值对(Key/Value) …...

GDB 高级调试技术深度解析

1. 引言 GNU调试器(GDB)是软件开发和逆向工程领域中不可或缺的工具。它为开发者提供了一个强大的环境,用于检查正在运行的程序或程序崩溃后产生的核心转储文件的内部状态。虽然许多开发者熟悉GDB的基本命令,如设置断点和单步执行,但GDB的真正威力在于其丰富的高级功能集。…...

【Kuberbetes】详谈网络(第三篇)

目录 前言 一、K8S的三种网络 1.1 Pod 内容器与容器之间的通信 1.2 同一个 Node 内 Pod 之间的通信 1.3 不同 Node 上 Pod 之间的通信 1.4 汇总 二、K8S的三种接口 三、VLAN 和 VXLAN 的区别 3.1 使用场景不同 3.2 支持的数量不同 3.3 是否记录到MAC地址表中…...

【科普】具身智能

一、具身智能的基本概念与理论框架 具身智能&#xff08;Embodied Intelligence, EI&#xff09;是指智能体通过物理身体与环境的实时交互&#xff0c;实现感知、决策和行动的能力。其核心思想是“智能源于身体与环境的互动”&#xff0c;而非仅仅依赖于抽象的计算或符号处理。…...

java -jar命令运行 jar包时如何运行外部依赖jar包

java -jar命令运行 jar包时如何运行外部依赖jar包 场景&#xff1a; 打包发不完,运行时。发现一个问题&#xff0c; java java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils 显示此&#xff0c;基本表明&#xff0c;没有这个依赖&#xff0c;如果在开发…...

Linux进程信号(一)之信号的入门

文章目录 信号入门1. 生活角度的信号2. 技术应用角度的信号3. 注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式 信号入门 1. 生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也…...

腾讯云MCP数据智能处理:简化数据探索与分析的全流程指南

引言 在当今数据驱动的商业环境中&#xff0c;企业面临着海量数据处理和分析的挑战。腾讯云MCP(Managed Cloud Platform)提供的数据智能处理解决方案&#xff0c;为数据科学家和分析师提供了强大的工具集&#xff0c;能够显著简化数据探索、分析流程&#xff0c;并增强数据科学…...

曝光融合(Exposure Fusion)

一、背景介绍 图像融合算法里面&#xff0c;hdr图像进行融合&#xff0c;拓宽动态范围的操作非常常见。 常用的hdr融合算法通常有两类&#xff1a; 1、不同曝光的ldr图像先进行hdr融合&#xff0c;得到高bit位的hdr图像&#xff0c;再通过tonemaping算法得到结果如图像。 2、不…...

无人机减震模块运行与技术要点分析!

一、减震模块的运行方式 1. 多级减震结构 两级减震设计&#xff1a;采用第一级减震组件&#xff08;如减震球、锥面减震垫&#xff09;吸收高频振动&#xff0c;第二级减震组件&#xff08;如减震环、负重物&#xff09;进一步过滤低频振动。例如&#xff0c;通过硅胶减震球…...

CVPR2025 | 首个多光谱无人机单目标跟踪大规模数据集与统一框架, 数据可直接下载

论文介绍 题目&#xff1a;MUST: The First Dataset and Unified Framework for Multispectral UAV Single Object Tracking 期刊&#xff1a;IEEE/CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://arxiv.org/abs/2503.17699 数据&#x…...

嵌入式故障码管理系统设计实现

文章目录 前言一、故障码管理系统概述二、核心数据结构设计2.1 故障严重等级定义2.2 模块 ID 定义2.3 故障代码结构2.4 故障记录结构 三、故障管理核心功能实现3.1 初始化功能3.2 故障记录功能3.3 记录查询与清除功能3.4 系统自检功能 四、故障存储实现4.1 Flash 存储实现4.2 R…...

若依框架Consul微服务版本

1、最近使用若依前后端分离框架改造为Consul微服务版本 在这里分享出来供大家参考 # Consul微服务配置参数已经放置/bin/Consul微服务配置目录 仓库地址&#xff1a; gitee&#xff1a;https://gitee.com/zlxls/Ruoyi-Consul-Cloud.git gitcode&#xff1a;https://gitcode.c…...

【风控】用户特征画像体系

一、体系架构概述 1.1 核心价值定位 风控特征画像体系是通过多维度数据融合分析&#xff0c;构建客户风险全景视图的智能化工具。其核心价值体现在&#xff1a; 全周期覆盖&#xff1a;贯穿客户生命周期的营销、贷前、贷中、贷后四大场景立体化刻画&#xff1a;整合基础数据…...

【Java微服务组件】分布式协调P1-数据共享中心简单设计与实现

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 欢迎评论交流&#xff0c;感谢您的阅读&#x1f604;。 目录 引言设计一个共享数据中心选择数据模型键值对设计 数据可靠性设计持久化快照 &#xff08…...

数据库--向量化基础

本文包含内容有: 向量化、SIMD的概念及关系SSE,AVX-512八种基础的SIMD操作,并用具体例子解释,给出伪代码。一、快速了解向量化、SIMD 1.1 向量化 向量化是指将原本需要循环处理的多个数据元素,通过一条指令同时处理多个数据,从而减少循环次数,提高计算效率。 传统方式…...

handsome主题美化及优化:10.1.0最新版 - 2

文章目录 前言基础设置优化开启全站 HTTPS添加 GZIP 压缩美化永久链接自定义后台路径启用 Emoji 支持 功能增强每日新闻自动更新文章嵌入外部网页时光机栏目配置自定义音乐播放器音量 自定义CSS配置文章标题居中显示标题背景美化文章版式优化LOGO 扫光特效头像动画效果图片悬停…...

JWT令牌

1. JWT概述 JWT即JSON Web Token&#xff0c;是一个开放标准&#xff0c;用于在各方之间安全地传输信息。并且JWT经过数字签名&#xff0c;安全性高。通俗来说&#xff0c;也就是以JSON形式作为Web应用中的令牌&#xff0c;用于信息传输&#xff0c;在数据传输过程中可以完成数…...

Qwen3技术报告解读

https://github.com/QwenLM/Qwen3/blob/main/Qwen3_Technical_Report.pdf 节前放模型&#xff0c;大晚上的发技术报告。通义&#xff0c;真有你的~ 文章目录 预训练后训练Long-CoT Cold StartReasoning RLThinking Mode FusionGeneral RLStrong-to-Weak Distillation 模型结构…...

RAG-MCP:突破大模型工具调用瓶颈,告别Prompt膨胀

大语言模型&#xff08;LLM&#xff09;的浪潮正席卷全球&#xff0c;其强大的自然语言理解、生成和推理能力&#xff0c;为各行各业带来了前所未有的机遇。然而&#xff0c;正如我们在之前的探讨中多次提及&#xff0c;LLM并非万能。它们受限于训练数据的时效性和范围&#xf…...

Flask框架入门与实践

Flask框架入门与实践 Flask是一个轻量级的Python Web框架&#xff0c;以其简洁、灵活和易于上手的特点深受开发者喜爱。本文将带您深入了解Flask的核心概念、基本用法以及实际应用。 什么是Flask&#xff1f; Flask是由Armin Ronacher于2010年开发的微型Web框架。与Django等…...

PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践

为了适应 PD 分离式推理部署架构&#xff0c;百度智能云从物理网络层面的「4us 端到端低时延」HPN 集群建设&#xff0c;到网络流量层面的设备配置和管理&#xff0c;再到通信组件和算子层面的优化&#xff0c;显著提升了上层推理服务的整体性能。 百度智能云在大规模 PD 分离…...

罗杰斯高频板技术解析:低损耗基材如何定义 5G 通信未来

在 5G 通信与尖端电子技术加速融合的时代&#xff0c;高频 PCB 作为信号传输的核心载体&#xff0c;对材料性能与工艺精度提出了极致要求。猎板 PCB 深耕行业多年&#xff0c;始终以罗杰斯&#xff08;Rogers&#xff09;板材为核心介质&#xff0c;构建起从材料适配到精密制造…...

QML 动画控制、顺序动画与并行动画

目录 引言相关阅读基础属性说明工程结构示例代码解析示例1&#xff1a;手动控制动画&#xff08;ControlledAnimation.qml&#xff09;示例2&#xff1a;顺序动画&#xff08;SequentialAnimationDemo.qml&#xff09;示例3&#xff1a;并行动画&#xff08;ParallelAnimationD…...

【动态导通电阻】GaN HEMT动态导通电阻的精确测量

2023 年 7 月,瑞士洛桑联邦理工学院的 Hongkeng Zhu 和 Elison Matioli 在《IEEE Transactions on Power Electronics》期刊发表了题为《Accurate Measurement of Dynamic ON-Resistance in GaN Transistors at Steady-State》的文章,基于提出的稳态测量方法,研究了氮化镓(…...

2:OpenCV—加载显示图像

加载和显示图像 从文件和显示加载图像 在本节中&#xff0c;我将向您展示如何使用 OpenCV 库函数从文件加载图像并在窗口中显示图像。 首先&#xff0c;打开C IDE并创建一个新项目。然后&#xff0c;必须为 OpenCV 配置新项目。 #include <iostream> #include <ope…...

Qt控件:交互控件

交互控件 1. QAction核心功能API 1.2 实例应用情况应用场景 1. QAction ##1. 1简介与API QAction 是一个核心类&#xff0c;用于表示应用程序中的一个操作&#xff08;如菜单项、工具栏按钮或快捷键触发的功能&#xff09;。它将操作的逻辑与 UI 表现分离&#xff0c;使代码更…...

在vue3中使用Cesium的保姆教程

1. 软件下载与安装 1. node安装 Vue.js 的开发依赖于 Node.js 环境&#xff0c;因此我们首先需要安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许你在服务器端运行 JavaScript 代码&#xff0c;同时也为前端开发提供了强大的工具支…...

zst-2001 下午题-历年真题 试题一到三

试题一 问题一 1 问题一 2 注意每句话中的“给”… 问题一 3 问题二 1 问题二 2 问题二 3 问题三 1 步骤一.看父图的数据流在子图有没有缺失 步骤二.看加工有没有输入输出 步骤三.阅读理解 问题三 2 实体和存储不能划线 问题三 3 试题二 问题一 1 问题一 2 问题一 3 问题二…...

STM32的ADC模块中,**采样时机(Sampling Time)**和**转换时机(Conversion Time),获取数据的时机详解

在STM32的ADC模块中&#xff0c;**采样时机&#xff08;Sampling Time&#xff09;和转换时机&#xff08;Conversion Time&#xff09;**是ADC工作流程中的两个关键阶段&#xff0c;直接影响采样精度和系统实时性。以下是详细解析&#xff1a; 1. 采样时机&#xff08;Samplin…...

iOS音视频解封装分析

首先是进行解封装的简单的配置 /// 解封装配置 class KFDemuxerConfig {// 媒体资源var asset: AVAsset?// 解封装类型&#xff0c;指定是音频、视频或两者都需要var demuxerType: KFMediaType .avinit() {} }然后是实现解封装控制器 import Foundation import CoreMedia i…...

探究电阻分压的带负载能力

我们经常使用两个电阻去分压来获得特定的电压,那么我是两个大阻值电阻分压获得的电压驱动能力强,还是小阻值电阻分压得到的电压驱动能力强呢? 一、电压相同时,电流的大小 下面是两个阻值分压得到的仿真图 电路分析: VCC都是5V,探针1和探针2测到的电压都是1.67V; 根据…...

14、Python时间表示:Unix时间戳、毫秒微秒精度与time模块实战

适合人群&#xff1a;零基础自学者 | 编程小白快速入门 阅读时长&#xff1a;约5分钟 文章目录 一、问题&#xff1a;计算机中的时间的表示、Unix时间点&#xff1f;1、例子1&#xff1a;计算机的“生日”&#xff1a;Unix时间点2、答案&#xff1a;&#xff08;1&#xff09;U…...

PCL 绘制二次曲面

文章目录 一、简介二、实现代码三、实现效果一、简介 这里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a...

消息队列与Kafka基础:从概念到集群部署

目录 一、消息队列 1.什么是消息队列 2.消息队列的特征 3.为什么需要消息队列 二、Kafka基础与入门 1.Kafka基本概念 2.Kafka相关术语 3.Kafka拓扑架构 4.Topic与partition 5.Producer生产机制 6.Consumer消费机制 三、Zookeeper概念介绍 1.zookeeper概述 2.zooke…...

计算机指令分类和具体的表示的方式

1.关于计算机的指令系统 下面的这个就是我们的一个简单的计算机里面涉及到的指令&#xff1a; m就是我们的存储器里面的地址&#xff0c;可以理解为memory这个意思&#xff0c;r可以理解为rom这样的单词的首字母&#xff0c;帮助我们去进行这个相关的指令的记忆&#xff0c;不…...

pcie phy-电气层-gen1/2(TX)

S IP物理层讲解 在synopsys IP中对于phy层的内容分离的比较多&#xff1a; cxpl中&#xff1a; u_cx_phy_logical&#xff1a;包含ts序列的解析&#xff08;smlh&#xff09;&#xff1b; pipe层协议的转换&#xff08;rmlh,xmlh)&#xff1b;pipe转dllp包&#xff08;rplh&…...

Baklib加速企业AI数据智理转型

Baklib智理AI数据资产 在AI技术深度渗透业务场景的背景下&#xff0c;Baklib通过构建企业级知识中台架构&#xff0c;重塑了数据资产的治理范式。该平台采用智能分类引擎与语义分析模型&#xff0c;将分散在邮件、文档、数据库中的非结构化数据转化为标准化的知识单元&#xf…...

深度学习驱动下的目标检测技术:原理、算法与应用创新

一、引言​ 1.1 研究背景与意义​ 目标检测作为计算机视觉领域的核心任务之一&#xff0c;旨在识别图像或视频中感兴趣目标的类别&#xff0c;并确定其在图像中的位置&#xff0c;通常以边界框&#xff08;Bounding Box&#xff09;的形式表示 。其在现实生活中有着极为广泛且…...

window 显示驱动开发-使用有保证的协定 DMA 缓冲区模型

Windows Vista 的显示驱动程序模型保证呈现设备的 DMA 缓冲区和修补程序位置列表的大小。 修补程序位置列表包含 DMA 缓冲区中命令引用的资源的物理内存地址。 在有保证的协定模式下&#xff0c;用户模式显示驱动程序知道 DMA 缓冲区和修补程序位置列表的确切大小&#xff0c;…...

《指针与整数相加减的深入解析》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、指针与整数相加的原理二、指针与整数相减的原理三、使用场景&#xff08;一&#xff09;数组操作&#xff08;二&#xff09;内存遍历 四、注意事项&…...

C++_STL_map与set

1. 关联式容器 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身。那什么是…...

1949-2022年各省农作物播种面积数据(22个指标)

1949-2022年各省农作物播种面积数据&#xff08;22个指标&#xff09; 1、时间&#xff1a;1949-2022年 2、来源&#xff1a;各省年鉴、国家统计局、农业部、农业年鉴 3、范围&#xff1a;31省 4、指标&#xff1a;年度标识、省份编码、省份名称、农作物总播种面积、粮食作…...

汽车二自由度系统模型以及电动助力转向系统模型

汽车二自由度系统模型与电动助力转向系统&#xff08;EPS&#xff09;的详细建模方案&#xff0c;包含理论推导、MATLAB/Simulink实现代码及参数说明&#xff1a; 一、二自由度汽车模型 1. 模型描述 包含以下两个自由度&#xff1a; 横向运动&#xff08;侧向加速度&#xf…...

【学习笔记】计算机操作系统(四)—— 存储器管理

第四章 存储器管理 文章目录 第四章 存储器管理4.1 存储器的层次结构4.1.1 多层结构的存储器系统4.1.2 主存储器与寄存器4.1.3 高速缓存和磁盘缓存 4.2 程序的装入和链接4.2.1 程序的装入4.2.2 程序的链接 4.3 连续分配存储管理方式4.3.1 单一连续分配4.3.2 固定分区分配4.3.3 …...