You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Astro中动态加载未知数量Webfonts的实现问题

在Astro中动态加载未知数量WebFont的正确方式

问题原因

你遇到的问题本质是Astro的模板解析规则导致的:

  • 直接在<style>标签内使用{fonts}时,Astro会将其当作CSS语法处理,而CSS不支持模板变量,因此触发"unknown word"错误。
  • 若未使用正确的渲染指令,Astro会自动转义字符串内容,导致CSS代码被当作纯文本输出,而非生效的样式。

解决方案一:使用set:html渲染原始CSS字符串

这是最简洁的方案,利用Astro的set:html指令直接将生成的CSS字符串注入到<style>标签中,绕过CSS语法解析的限制:

---
function getFonts() {
    return global.font.map(item => `
@font-face {
    font-family: ${item.name};
    src: url(${item.url2}) format('woff2'),
         url(${item.url1}) format('woff');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
}
`).join('\n');
}

const fonts = getFonts();
---

<head>
  <!-- 使用set:html指令渲染原始CSS -->
  <style set:html={fonts}></style>
</head>

解决方案二:动态创建Style元素(备选)

如果需要更灵活的控制,可以通过内联脚本动态创建样式元素并插入到页面头部:

---
const fontList = global.font;
---

<head>
  <script is:inline>
    const styleEl = document.createElement('style');
    styleEl.textContent = `
      ${fontList.map(item => `
@font-face {
    font-family: ${item.name};
    src: url(${item.url2}) format('woff2'),
         url(${item.url1}) format('woff');
    font-weight: normal;
    font-style: normal;
    font-display: swap;
}
      `).join('\n')}
    `;
    document.head.appendChild(styleEl);
  </script>
</head>

注意事项

  • 确保global.font是结构合法的数组,每个元素包含name、url1、url2字段。
  • 若字体数据来自用户输入,需做内容过滤避免XSS风险;静态数据则无需担心。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:17:09