Vite插件在HTML注入动态脚本时标签被转义怎么办?
我在用Vite写插件时想在HTML头部动态注入一个带有data-api-key的script标签,但发现内容被转义成文本了。比如用transformIndexHtml钩子处理时:
// 插件代码片段
export default ({ transformIndexHtml }) => {
transformIndexHtml(html => {
return html.replace('',
<script src="https://cdn.example.com/sdk.js" data-api-key="123"></script>
</head>)
})
}
构建后却变成了<script>标签的纯文本,而不是实际的DOM节点。试过用html.prettyPrint()和手动创建节点都没效果,这是Vite插件处理HTML节点时的特殊规则吗?
正确的做法是利用transformIndexHtml钩子的第二个参数,它提供了一个叫
server的对象,里面有个injectTag方法可以直接插入DOM节点。你可以这样改:我当时也是试了一圈字符串替换的方式,结果全被转义了。后来翻Vite的源码才发现这个方法,官方文档上还真没详细说明。用这种对象形式注入标签,才能绕过转义直接插入DOM节点。