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

如何在Svelte中动态导入SVG文本文件?

解决方法

Vite 无法分析完全由运行时生成的动态导入路径,因为它需要在构建阶段明确要打包的文件范围。以下两种方案可以解决你的问题:

方法一:使用 Vite Glob 预加载所有 SVG 文件

这种方式会在组件初始化时一次性加载所有目标 SVG 文件,适合文件数量不多(如你的50个)的场景:

<script>
export let src;
export let hex;

// 预加载指定目录下所有 SVG 文件的原始内容
const svgMap = import.meta.glob('/src/lib/svg/*.svg?raw', { eager: true });

// 根据传入的 src 匹配对应的 SVG 内容
$: svgContent = svgMap[`/src/lib/svg/${src}.svg?raw`]?.default || '';
</script>

<!-- 渲染 SVG 内容并应用颜色样式 -->
<div style="color: {hex}">{@html svgContent}</div>

方法二:带静态前缀的动态导入

如果希望按需加载 SVG 文件(仅当 src 变化时才加载对应文件),可以使用带有静态前缀的动态导入,让 Vite 能识别需要打包的文件范围:

<script>
export let src;
export let hex;
let svgContent = '';

// 动态加载指定 SVG 文件
async function loadSvg(targetSrc) {
  try {
    const module = await import(`/src/lib/svg/${targetSrc}.svg?raw`);
    svgContent = module.default;
  } catch (err) {
    console.error(`加载 SVG 失败: ${targetSrc}`, err);
    svgContent = '';
  }
}

// 当 src 变化时重新加载 SVG
$: if (src) {
  loadSvg(src);
}
</script>

{#if svgContent}
  <div style="color: {hex}">{@html svgContent}</div>
{:else}
  <div>SVG 加载中...</div>
{/if}

原方法报错原因

你通过 new URL 生成的文件路径是纯运行时动态生成的,Vite 无法在构建阶段识别这些路径对应的文件,因此无法将它们纳入打包范围,导致动态导入失败。上述两种方案都给了 Vite 明确的文件匹配规则,让它能提前处理需要打包的 SVG 文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:35:29