Astro中Prismic asHTML()渲染富文本时HTML被转义问题
问题原因
Astro 框架默认会对模板中通过 {} 插值语法输出的所有字符串做 HTML 特殊字符转义,这是框架内置的XSS安全防护机制,和 @prismicio/helpers 的 asHTML 方法逻辑无关。
你通过 asHTML 拿到的富文本转换结果本身是完全符合预期的,只是转义逻辑把字符串里的 <、> 等标签符号转换成了HTML实体,最终才会在页面上直接显示HTML源码,而不是解析渲染成对应的DOM结构。
另外你贴的模板代码里还有一处笔误:{textItem1) 的右侧闭合符号写错成了小括号,应该是大括号 },这个也需要修正。
解决方法
不需要调整Prismic相关的配置,直接用Astro内置的 set:html 指令渲染转换后的HTML字符串即可,这个指令会明确告知框架跳过对指定内容的转义逻辑,直接将原始HTML插入到对应元素内部。
具体写法如下:
--- // 前置数据拉取逻辑保持不变即可 import Layout from '../layouts/Layout.astro'; import * as prismicH from '@prismicio/helpers'; import {getFrontPage} from '../prismic.js'; const fp = await getFrontPage(); const {data} = fp.results[0]; const headerText = prismicH.asHTML(data.header_text); const textItem1 = prismicH.asHTML(data.text_item_1); --- <Layout> <!-- 用set:html绑定富文本内容 --> <div set:html={headerText}></div> <div set:html={textItem1}></div> </Layout>
注意:
set:html等同于其他框架里的v-html、dangerouslySetInnerHTML,只应该用来渲染你完全信任的内容(比如你自己从Prismic后台管控的富文本内容),不要用它渲染不可信的用户提交内容,避免XSS风险。
如果后续你的Prismic富文本里需要自定义链接解析、嵌入块渲染等复杂逻辑,也可以使用Prismic官方提供的Astro专属富文本渲染组件,不过当前你这个无额外配置的场景,直接用set:html就足够满足需求。
内容的提问来源于stack exchange,提问作者wonder95
相关产品推荐
相关产品推荐

