富文本配置渲染场景问题杂谈

背景

可视化页面搭建场景,需要支持配置富文本内容并在页面中渲染,富文本编辑器SDK采用了@tinymce/tinymce-react

问题场景

问题1 :文本数据转义

富文本编辑器生成的HTML富文本在服务端存储时会对字符串进行转义,比如:

'<p>3245003</p>' ----> "&lt;p&gt;3245003&lt;/p&gt;"

解决方案:
利用浏览器默认行为,通过innerHTML方法生成dom节点进行转义,然后通过DOMParser将html文本转化成dom树
参考:https://developer.mozilla.org/zh-CN/docs/Web/API/DOMParser

const htmlToElement = (html) => {const parser = new DOMParser();const doc = parser.parseFromString(html, 'text/html');return doc.body.firstChild;}
const transformStr = (content) => {let div = document.createElement('div');div.innerHTML = content;return htmlToElement(`<div>${div.innerText}</div>`)
}

问题2:SSR场景hydrate模式禁用了innerHTML或者dangerouslySetInnerHTML直接渲染

使用最原始的js API

方案1:innerHTML

const C = props => {const {content, isSSR} = props;const wrapRef = useRef<any>();useEffect(() => {if(wrapRef.current && !isSSR) {wrapRef.current.innerHTML = content;}}, []);return (<div ref={wrapRef} />)
}export default C;

方案2:appendChild

const C = props => {const {content, isSSR} = props;const wrapRef = useRef<any>();useEffect(() => {if (wrapRef.current) {function htmlToElement(html) {const parser = new DOMParser();const doc = parser.parseFromString(html, 'text/html');console.log('htmlToElement', doc, doc.body.firstChild);return doc.body.firstChild;}//@ts-ignoreif (!isSSR) {let div = document.createElement('div');div.innerHTML = content;wrapRef.current.appendChild(htmlToElement(`<div>${div.innerText}</div>`));}}}, []);return (<div ref={wrapRef} />)
}

问题3:生成富文本体积太大

方案1

生成的富文本内容,生成文件,然后上传至oss,富文本编辑器和渲染页面分别通过cdn拉取数据内容进行渲染,

方案2

文本简化压缩,采用类似html-minifier-terser的库对生成的html文本进行处理压缩,删除无用标签、空格等内容减少体积

方案3

成本略高,只提供思路,小型编译器通过将html内容解析转化成AST,分析css样式结构进行优化,减少css样式内容,分析dom结构减少无用dom和层级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744622.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置服务器自启动极简方式 /etc/rc.d/rc.local

配置服务器自启动有三种方式&#xff0c;本文采用极简方式 1. 修改 脚本 /etc/rc.d/rc.local 设置启动应用的脚本 vim /etc/rc.d/rc.local --追加以下内容 /home/init.sh >> /var/log/my_init.log 2>&1 &exit 0 脚本注释&#xff1a;命令中 2>&…

css选择器nth-last-child(n)的学习理解

上一节我们介绍了:nth-child(n)的使用&#xff0c;这一节我们来介绍一下:nth-last-child(n) :nth-last-child(n)&#xff1a;此选择器和nth-child(n)类似都是选择其父元素的第 n 个子元素&#xff0c;唯一的区别在于它是从父元素的子元素末尾开始往前数&#xff0c;一直到第一个…

多项式回归算法模拟

python3.6 环境 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures# 生成随机数作为x变量&#xff0c;范围在-5到5之间&#xff0c;共100个样本 x np.random.un…

深度学习训练GPU显卡选型攻略

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f4d1;上期文章&#xff1a;『仪酷LabVIEW OD实战(5)——Object DetectionTensorRT工具包快速实现yolo目标检测』 &#x1f37b;本文由virobotics(仪酷智能)原创…

Web框架开发-web框架

一、web框架 web框架&#xff08;web framwork&#xff09;是一种开发框架&#xff0c;用来支持动态网站&#xff0c;网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行为提供了一套通用的方法。web框架已经实现了很多功能&…

51单片机的万年历闹钟及温度补偿

撰写一篇基于51单片机的万年历闹钟及温度补偿的论文&#xff0c;你需要按照学术论文的标准格式和结构来组织内容。以下是一个大致的论文框架和内容建议&#xff1a; 基于51单片机的万年历闹钟及温度补偿系统设计与实现 摘要&#xff1a; 简要介绍论文的研究背景、目的、方法、…

C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构 2. 继承的切片 3. 重定义/隐藏 重定义/隐藏&#xff1a;派生类和基类有同名的成员&#xff0c;就叫隐藏。派生类的成员隐藏了基类的成员。 隐藏时可以通过类作用限定符来访问被隐藏的成员。 class Person { public:void Print(){…

代码学习记录19

随想录日记part19 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.14 主要内容&#xff1a;今天的主要内容是二叉树的第七部分&#xff0c;主要涉及修剪二叉搜索树 &#xff1b;将有序数组转换为二叉搜索树&#xff1b;把二叉搜索树转换为累加树。 669. 修剪…

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

如何实现系统的高可用性

实现系统的高可用性是确保系统持续提供服务的关键要素。下面是一些常见的高可用方案&#xff1a; 冗余部署&#xff1a;将系统的关键组件部署在多台服务器上&#xff0c;通过搭建主备或者集群的架构来实现冗余。当主服务器出现故障时&#xff0c;备用服务器能够自动接管&#…

Flutter可重排的列表控件ReorderableListView详解

文章目录 ReorderableListView 介绍主要属性使用示例注意事项 ReorderableListView 介绍 ReorderableListView 是 Flutter 中一个可重排的列表控件&#xff0c;允许用户通过拖动来改变列表项的顺序。它继承自 ListView&#xff0c;并提供了一些额外的功能来实现重排功能。 主…

面试 Java 并发编程八股文十问十答第六期

面试 Java 并发编程八股文十问十答第六期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;synchronized 和 R…

安卓通过termux部署ChatGLM

一、安装Termux并进行相关配置 1、安装termux Termux 是一个 Android 终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的 Linux 环境。 不需要 root 权限 Termux 就可以正常运行。Termux 基本实现 Linux 下的许多基本操作。可以使用 Termux 安装 python&…

23.查询所有列

选择所有列 SELECT * FROM 表名; 用跟在SELECT关键字后面的星号(*),你能够显示表中数据的所有列。 实例&#xff1a; 查询departments表中的所有数据 select * from departments; 选择指定列 select 列名1,列名2... from 表名; 能够用SELECT语句显示表的指定列&#xf…

DB算法原理与构建

参考&#xff1a; https://aistudio.baidu.com/projectdetail/4483048 Real-Time Scene Text Detection with Differentiable Binarization 如何读论文-by 李沐 DB (Real-Time Scene Text Detection with Differentiable Binarization) 原理 DB是一个基于分割的文本检测算…

区块链基础知识(上):区块链基本原理、加密哈希、公钥加密

目录 基本原理 加密哈希&#xff1a; 公钥加密&#xff1a; 希望有人向你发送只有你才能打开的加密文档/消息时使用 PKC 希望向其他人发送加密文档/消息并证明它确实由你发送时使用 PKC 使用 PKC 和加密哈希对文档/消息进行数字签名 交易哈希链使用数字签名转让数字资产所…

SenseNova 商汤日日新大模型 Function Call(函数调用)功能讲解和应用示例

考虑到使用 magic 申请 OpenAPI 的账号挺麻烦的&#xff0c;这里以商汤日日新大模型 SenseNova 介绍 Function Call 的功能。 官方链接&#xff1a;日日新开放平台 一、Function Call 是个啥&#xff1f; 在 LLM&#xff08;Large Language Model&#xff09; 语言大模型时代&…

[论文笔记]DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning

引言 今天带来21年一篇关于用强化学习玩斗地主的论文:DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning。 斗地主是一个具有竞争、合作、信息不完全、状态空间庞大以及大量可能动作的极具挑战性的领域,尤其是合法动作在每一轮中变化显著。在这项工…

SpringBoot 过滤器和拦截器的区别

SpringBoot 过滤器和拦截器的区别 SpringBoot 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都可以在请求处理的不同阶段执行特定的操作&#xff0c;但它们之间存在一些关键的区别&#xff1a; 1. 执行层级 过滤器&#xff08;Filt…