跳到正文
SvgJsx
语言: 中文

SVG 转 JSX 与 React 组件转换器

粘贴 SVG 代码或拖入 .svg 文件,即可得到可直接提交的 React、TypeScript、React Native、Vue 或 Solid 组件。所有处理都在你的浏览器本地完成。

快速预设:
将 .svg 文件拖放到这里,或文件通过 FileReader 在本地读取,绝不会上传。
选项
导出方式:
const HeartIcon = (props) => (
  <svg width="24" height="24" viewBox="0 0 24 24" className="icon icon-heart" {...props}>
    <g id="Layer_1" fill="none" stroke="#e11d48" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
      <path d="M19.0001 14.0002c1.4900-1.4600 3.0000-3.2100 3.0000-5.5000A5.5000 5.5000 0 0 0 16.5000 3c-1.7600 0-3.0000.5000-4.5000 2-1.5000-1.5000-2.7400-2-4.5000-2A5.5000 5.5000 0 0 0 2 8.5000c0 2.3000 1.5000 4.0500 3 5.5000l7 7Z" style={{ fillOpacity: "0.15", fill: "#e11d48" }} />
    </g>
  </svg>
);

export default HeartIcon;

预览

转换后 SVG 的预览
原始 SVG
706 B
优化后 SVG
538 B(-24%)
组件
566 B

这个 SVG 转换器能做什么

从 Figma、Illustrator、Sketch 或 Inkscape 导出的 SVG 是合法的 XML,却不是合法的 JSX。React 要求使用驼峰式属性(例如用 strokeWidth 代替 stroke-width)、用 className 代替 class,并且 style 必须是对象而不是 CSS 字符串。设计工具还会附带 XML 声明、注释、元数据块和带命名空间的属性,这些内容既会增大打包体积,也会引发警告。

SvgJsx 使用一个小巧的 XML 解析器读取 SVG,把每个属性改写成目标框架需要的形式,再输出格式整齐的组件代码。你可以选择 TypeScript 类型、size 属性、currentColor 填充、forwardRef、memo 以及导出方式,然后复制代码或直接下载文件。

如何把 SVG 转换成 React 组件

整个流程只需几秒钟:

  • 把 SVG 代码粘贴到输入框,或将一个或多个 .svg 文件拖放到输入框上。
  • 选择输出格式:React、React Native、Vue、Solid 或纯 JSX 片段。
  • 设置组件名称,并按需开启 TypeScript、currentColor、size 属性等选项。
  • 查看实时预览和体积对比,然后复制代码或下载文件。多个文件会被打包成一个 ZIP。

自动完成的转换

带连字符的属性会变成驼峰式(stroke-linecap → strokeLinecap),带命名空间的属性会被展平(xlink:href → xlinkHref),内联 style 字符串会变成 JavaScript 对象。data-* 和 aria-* 属性保持不变,因为 React 原样支持它们。script 元素和内联事件处理器会被移除,确保粘贴进来的文件无法把代码偷偷带进你的应用。

轻量优化会压缩空白字符,还可以把坐标统一保留到指定的小数位数。对大多数图标集来说,这能减少 20%–40% 的代码量,而且不需要引入笨重的 SVGO 依赖。

常见问题

这个 SVG 转 JSX 工具免费吗?

完全免费。SvgJsx 无需注册账号,也没有使用次数限制。它是一个静态网站,不存在需要转嫁给你的服务器成本。

我的 SVG 文件会被上传吗?

不会。文件通过浏览器的 FileReader API 读取,并在你的设备上用 JavaScript 完成转换,不会发送到任何服务器,因此可以放心处理公司内部的 Logo 和图标。

SVG 和 JSX 有什么区别?

SVG 是 XML 标记语言,而 JSX 是 JavaScript 的语法扩展。JSX 需要驼峰式属性名、用 className 代替 class、用对象而不是字符串表示 style,并且特殊字符要用花括号包裹,所以原始 SVG 直接放进去往往无法编译。

支持 Figma 和 Illustrator 导出的文件吗?

支持。编辑器特有的元数据、注释、sodipodi 和 inkscape 属性以及 XML 声明默认都会被移除;被引用的 id 会保留,所以渐变、遮罩和裁剪路径依然正常工作。

可以一次转换很多 SVG 图标吗?

可以。同时拖入多个 .svg 文件,每个文件都会生成一个以文件名命名的组件。你可以把它们打包成 ZIP 下载,其中还包含一个统一导出所有图标的 index 文件。