rich-text不能直接渲染HTML字符串,因其仅支持结构化nodes数组,需用uParse或mp-html等工具转换;它过滤script/style/iframe,忽略class/id,限制标签和样式,嵌套过深会截断。
直接用 rich-text 渲染后端返回的 html 字符串,90% 的情况会出问题——白屏、图片不显示、样式丢失、链接点不动,甚至在小程序里直接被过滤成空节点。这不是你代码写错了,是它本来就不支持完整 html。
为什么 rich-text 不能直接塞 HTML 字符串
rich-text 要的是结构化 nodes 数组,不是字符串。你传个 <p><strong>hello</strong></p> 过去,它会原样当文本渲染,而不是解析成加粗段落。
- 所有
script、style、iframe标签会被静默丢弃,连 warning 都没有 -
img必须带合法src(HTTPS 或本地路径),相对路径如./img.png在小程序里必然失败 -
class、id、data-属性全被忽略,别指望用 CSS 类控制样式 - 嵌套超过 5 层(比如
div > article > section > p > span)可能触发内部截断,内容莫名消失
uParse 是最省心的跨端方案
如果你需要在 H5、微信/支付宝/百度小程序、App 三端都稳定渲染复杂富文本(含表格、视频、自定义样式、图片预览),uParse 是目前兼容性最好、开箱即用程度最高的选择。
- 它把 HTML 字符串在运行时解析成平台原生可识别的节点树,自动处理
img懒加载、a标签跳转拦截、style内联提取 - 不需要你手动剥离
script或转义属性,自带 XSS 白名单过滤(可配置) - 图片点击自动唤起预览,不用再写
bindtap+uni.previewImage - 注意:必须从 DCloud 插件市场下载官方版,npm 安装的某些 fork 版本依赖
document,在小程序里直接报错
mp-html 更适合微信小程序重度场景
如果项目只上微信小程序,且对性能、扩展性要求高(比如要支持 LaTeX、SVG、锚点跳转、长按复制),mp-html 是更轻量、更可控的选择——体积仅约 25KB,且针对小程序 WXML 渲染链深度优化。
- 它不走 Vue 组件生命周期,而是直接生成 WXML 节点,所以滚动、缩放、图片加载帧率更稳
- 支持通过
config对象精细控制标签映射(比如把h2渲染成view class="title-h2") - 图片默认不设宽高,需手动加
img: { mode: 'aspectFill' }避免拉伸变形 - 注意:
mp-html的 H5 端是降级为v-html的,若后端 HTML 含不安全属性,必须额外做 DOMPurify 过滤
千万别用 v-html 或 web-view 做通用渲染
v-html 在 H5 可用,但在所有小程序平台完全不可用;web-view 虽能跑任意 HTML,但和 Vue 页面通信成本高、iOS 光标偏移、Android 图片上传失败率高,且无法响应 uni-app 的主题切换、字体缩放等系统级设置。
- 用
web-view加载 Quill 编辑器可以,但仅限「编辑」场景;「展示」场景用它,等于放弃小程序原生体验 - 试图用正则替换 HTML 字符串来适配
rich-text,短期能跑通简单内容,一旦后端加个table或blockquote,立刻崩 - 真正容易被忽略的点是:所有方案都要求后端返回的 HTML 必须是「语义正确」的——比如
<p></p> <div>xxx</div>这种非法嵌套,uParse和mp-html都可能静默修复或丢弃,但行为不一致,测试时得拿真数据过一遍











