无缝对接:SVG To React Native — Numio
将 SVG 标记转换为从 react-native-svg 导入 Svg、Path、G 等元素的 React Native 组件。先运行 SVGO 优化,属性变为 JSX prop,数值以数字形式输出(strokeWidth={2})。
把从 Figma 或 Sketch 导出的图标转换为组件,用于使用 react-native-svg 的 Expo 或 React Native 应用。
适用场景
- 把从 Figma 或 Sketch 导出的图标转换为组件,用于使用 react-native-svg 的 Expo 或 React Native 应用。
- 在作为原生组件发布前,精简臃肿的 SVG(title、编辑器元数据、未使用的 defs)。
使用方法
- 将 SVG 标记粘贴到 SVG 编辑器或拖入 .svg 文件;输入必须是有效的 SVG,否则会提示 "This is not a valid svg code."
- 打开 SVGO 设置,可关闭优化或切换单个插件,例如 remove title、remove view box 或 merge paths;编辑器下方的预览会对比原始 SVG 和优化后的 SVG。
- 将 React Native 面板的输出复制到 .js 或 .tsx 文件中,并在应用中安装 react-native-svg。
SVG 标记
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<title>Check</title>
<g fill="none" stroke="#16a34a" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<path d="M7 12.5l3 3 7-7"/>
</g>
</svg>React Native 组件(react-native-svg)
import * as React from "react"
import Svg, { G, Circle, Path } from "react-native-svg"
const SvgComponent = (props) => (
<Svg
xmlns="http://www.w3.org/2000/svg"
width={24}
height={24}
viewBox="0 0 24 24"
{...props}
>
<G fill="none" stroke="#16a34a" strokeWidth={2}>
<Circle cx={12} cy={12} r={10} />
<Path d="m7 12.5 3 3 7-7" />
</G>
</Svg>
)
export default SvgComponent功能与限制
SVGO 优化在浏览器的 Web Worker 中运行,但 JSX 生成在服务器上完成:优化后的 SVG 会 POST 到 /api/svg-to-jsx,由其以 native: true 运行 SVGR。
react-native-svg 不支持的元素会被移除,SVGR 会添加 /* SVGR has dropped some elements not supported by react-native-svg: filter */ 这样的注释。
SVGO 会内联 <style> 规则,再把样式声明转为属性,因此 style="stroke:blue" 会变为 stroke="#00f"(stroke prop)。<title> 默认会被移除。
width、height 和 viewBox 会保留,{...props} 展开在根 Svg 上,便于覆盖尺寸或颜色。
FAQ
输出需要 react-native-svg 吗?
需要。组件从 react-native-svg 导入 Svg 以及 Path、Circle、G 等元素组件,必须在项目中安装该库;它无法用普通的 React Native View 工作。
能保留 viewBox 让图标可缩放吗?
可以。remove view box 默认关闭,因此 viewBox 会保留在 Svg 元素上。使用组件时传入 width 和 height prop 即可缩放。
滤镜和渐变会怎样?
没有 react-native-svg 对应元素的元素(例如 filter)会被丢弃,并在文件顶部添加注释。未使用的渐变会被 SVGO 的 remove useless defs 移除。
我的 SVG 会被上传吗?
优化后的 SVG 会发送到页面的 /api/svg-to-jsx 端点以生成组件;优化步骤和预览都在浏览器中完成。