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

Vite+React项目构建后SVG资源缺失问题求助

Vite+React项目build后SVG文件缺失问题

我用Vite+React搭建项目,通过@svgr/rollup插件把SVG当作React组件使用。执行build命令后,src/assets里的PNG图片能正常出现在dist/assets目录,但SVG文件不见了。想部署到Vercel这类平台,不知道问题出在哪。

文件夹结构

|-- index.html
|-- ... 其他配置文件
|-- package.json
|-- vite.config.ts
|-- tsconfig.json
|-- src
|   |-- App.tsx
|   |-- ...
|   |-- vite-env.d.ts
|   |-- assets
|       |-- avatar-1.png
|       |-- avatar-2.png
|       |-- avatar-3.png
|       |-- ... .png
|       |-- Social-X.svg
|       |-- ... .svg
|       |-- Social-Pin.svg

vite.config.ts配置

import path from "path";

import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
import svgr from "@svgr/rollup";

export default defineConfig({
  plugins: [
    react(),
    svgr({
      exportType: "named",
      ref: true,
      svgo: false,
      dimensions: false,
      typescript: true,
    }),
    
  ],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
});

SVG引入方式

import { ReactComponent as ArrowRight } from "@/assets/arrow-right.svg"

问题原因

当你通过@svgr/rollup把SVG作为React组件引入时,插件会直接将SVG代码编译成React组件的JS逻辑,嵌入到打包后的JS文件中,不会把SVG文件作为静态资源复制到dist/assets。而PNG这类图片是作为静态资源被复制到输出目录,代码中只引用其路径,所以两者处理逻辑完全不同。

解决办法

1. 区分SVG的两种使用场景

修改vite.config.ts,通过include/exclude规则指定哪些SVG作为组件编译,哪些作为静态资源复制:

svgr({
  exportType: "named",
  ref: true,
  svgo: false,
  dimensions: false,
  typescript: true,
  // 仅处理带-component后缀的SVG为组件,其余作为静态资源
  include: "**/*-component.svg",
}),

2. 同时支持组件和静态资源引入

如果需要对同一个SVG同时使用两种方式,引入时添加?url后缀获取静态资源路径:

// 作为静态资源引入,获取文件路径(会被复制到dist/assets)
import arrowRightUrl from "@/assets/arrow-right.svg?url";
// 作为React组件引入(编译到JS中)
import { ReactComponent as ArrowRight } from "@/assets/arrow-right.svg";

3. 检查未被引用的SVG

如果某个SVG没有在代码中被任何方式引入,Vite的tree-shaking会忽略它,不会复制到输出目录。确保所有需要的SVG都有对应的引入语句。

内容的提问来源于stack exchange,提问作者Basem A. Sleem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:02:44