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

Vue3+Vite使用Font Loading API从assets加载字体出现404错误

Vue 3 + Vite 动态加载字体404问题解决

问题原因

你用import.meta.glob('@/assets/fonts/*.otf')获取的是模块加载函数,不是资源的实际访问URL。直接使用循环里的path(如@/assets/fonts/xxx.otf)作为请求路径时,浏览器会直接请求这个原始路径,但Vite打包后资源会被哈希重命名,原路径不存在,因此触发404错误。

修复代码

方式1:同步加载(推荐,适合字体数量不多的场景)

const fonts = import.meta.glob('@/assets/fonts/*.otf', { eager: true, as: 'url' })

async function loadFonts() {
  for (const [path, fontUrl] of Object.entries(fonts)) {
    const fontName = path.split('/')[3].split('-')[0]
    const myFont = new FontFace(fontName, `url('${fontUrl}')`)
    await myFont.load()
    document.fonts.add(myFont)
  }
}

loadFonts()

方式2:异步加载

const fonts = import.meta.glob('@/assets/fonts/*.otf', { as: 'url' })

async function loadFonts() {
  for (const [path, getFontUrl] of Object.entries(fonts)) {
    const fontName = path.split('/')[3].split('-')[0]
    const fontUrl = await getFontUrl()
    const myFont = new FontFace(fontName, `url('${fontUrl}')`)
    await myFont.load()
    document.fonts.add(myFont)
  }
}

loadFonts()

关键说明

  • { as: 'url' }:告诉Vite将字体文件处理为可直接访问的URL字符串,而非模块。
  • { eager: true }:让Vite在启动时就加载所有匹配的字体资源,无需异步调用加载函数;如果不需要预加载,可去掉该选项,改用异步调用getFontUrl()获取URL。
  • 字体名称提取逻辑保持你原有代码的逻辑,确保和字体文件命名规则匹配即可。

额外检查

  • 确认字体文件确实存放在src/assets/fonts目录下,后缀为.otf,和glob匹配规则一致。
  • 确保tsconfig.json中已配置@指向src目录(Vite默认已配置,若未配置需添加"paths": { "@/*": ["src/*"] })。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:45:35