Back to blog

React Native SVG Import Guide: react-native-svg + SvgXml

Learn two practical ways to use SVG in React Native with react-native-svg: transformer-based imports and SvgXml dynamic rendering.

Jan 26, 2026React NativeSVGreact-native-svgMobile DevelopmentSVG Integrationreact-native-svg-transformer

React Native SVG Import Guide: react-native-svg + SvgXml

SVG (Scalable Vector Graphics) has become an essential graphic resource format in React Native development. Compared to traditional bitmap formats (PNG, JPG), SVG offers lossless scaling, smaller file sizes, and more flexible style control. This article provides a detailed introduction to two mainstream methods for importing and using SVG files in React Native projects, along with complete code examples and performance optimization recommendations.

Why Use SVG in React Native

SVG (Scalable Vector Graphics) brings several key advantages to mobile application development:

  • Perfect Scaling: Graphics remain crisp regardless of screen size or resolution
  • Smaller File Size: SVG files are typically lighter than multiple PNG asset sets
  • Dynamic Styling: Colors, sizes, and other attributes can be modified dynamically via props
  • Consistency: Renders identically on both iOS and Android platforms

Core Dependency: react-native-svg

The first step to using SVG images in React Native is installing the react-native-svg library, which allows us to natively render SVG files in React Native applications.

npm install react-native-svg
# or
yarn add react-native-svg

Note: For React Native 0.60 and above, linking is usually automatic. For earlier versions, you may need to manually link native modules.

Method 1: Using react-native-svg-transformer

This is the most recommended approach, allowing you to directly import SVG files as components, just like in web React projects.

Installation and Configuration

First, install the transformer:

npm install --save-dev react-native-svg-transformer
# or
yarn add --dev react-native-svg-transformer

Then create or modify metro.config.js in your project root:

const { getDefaultConfig } = require("metro-config");

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts },
  } = await getDefaultConfig();

  return {
    transformer: {
      babelTransformerPath: require.resolve("react-native-svg-transformer"),
    },
    resolver: {
      assetExts: assetExts.filter((ext) => ext !== "svg"),
      sourceExts: [...sourceExts, "svg"],
    },
  };
})();

Usage Example

After configuration, you can directly import SVG files:

import React from "react";
import { View } from "react-native";
import Logo from "./assets/logo.svg";

const MyComponent = () => (
  <View>
    <Logo width={100} height={100} fill="#3B82F6" />
  </View>
);

export default MyComponent;

This method allows you to treat SVG files as regular React Native components, making them easy to import and use throughout your application.

Advantages:

  • Type-safe with excellent developer experience
  • Supports dynamic style control via props
  • Excellent performance with compile-time transformation

Use Cases: Static icon libraries, fixed assets in design systems

Method 2: Using SvgXml for Dynamic Loading

The SvgXml component from react-native-svg allows you to render SVGs from XML strings, providing more flexibility for dynamic scenarios.

Basic Usage

import React from "react";
import { SvgXml } from "react-native-svg";

const svgMarkup = `
  <svg width="100" height="100" viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="40" fill="#10B981" />
  </svg>
`;

const DynamicIcon = () => <SvgXml xml={svgMarkup} width="100%" height="100%" />;

export default DynamicIcon;

Loading from Files Dynamically

SvgXml is particularly useful when you need to load SVGs from the file system or network:

import React, { useState, useEffect } from "react";
import { SvgXml } from "react-native-svg";
import RNFS from "react-native-fs";

const LoadableSvg = ({ filePath }) => {
  const [xml, setXml] = useState("");

  useEffect(() => {
    async function loadSvg() {
      try {
        const svgContent = await RNFS.readFile(filePath);
        setXml(svgContent);
      } catch (error) {
        console.error("Error loading SVG file", error);
      }
    }
    loadSvg();
  }, [filePath]);

  return xml ? <SvgXml xml={xml} width="100%" height="100%" /> : null;
};

Advantages:

  • Supports runtime dynamic loading
  • Can fetch SVGs from APIs or remote servers
  • Flexible handling of user-generated content

Considerations: May have performance issues when repeatedly rendering complex or dynamic SVGs, as it parses XML at runtime.

SVG File Storage and Organization

In React Native projects, you typically store SVG files in an assets folder within your project structure, then import them like other resources.

Recommended directory structure:

src/
  assets/
    icons/
      arrow-left.svg
      arrow-right.svg
    logos/
      brand-primary.svg
      brand-secondary.svg
  components/
    icon.tsx

Preview and Validate in SVG Viewer

Before integrating SVGs into your React Native project, it's recommended to preview and validate them in SVG Viewer:

  1. Check viewBox: Ensure viewBox is set correctly to avoid cropping or scaling issues
  2. Clean redundant code: Remove metadata and editor attributes added by design tools
  3. Verify paths: Confirm path data is complete and optimized
  4. Test scaling: Preview at different sizes to ensure visual effects meet expectations

Using an SVG Viewer helps you discover issues during development, saving time debugging on mobile devices.

Optimizing SVGs for Better Performance

When using SVGs in React Native, file optimization is particularly important:

  1. Simplify paths: Use tools like SVG Optimizer or SVGO to reduce path points
  2. Remove unused elements: Delete hidden layers and empty groups
  3. Merge duplicate styles: Extract repeated attributes into shared styles
  4. Control precision: Keep path coordinates to 2-3 decimal places

Optimized SVGs not only load faster but also render better, especially in high-frequency scenarios like list scrolling.

Practical Recommendations

Based on real project experience, here are some practical tips:

  1. Unified naming convention: Establish clear naming conventions for SVG files, such as icon-home.svg, logo-brand.svg
  2. Encapsulate common components: Create an Icon component to centrally manage all icon imports and usage
  3. Type definitions: Add TypeScript type definitions to SVG components for better development experience
  4. Lazy loading strategy: For large icon sets, consider on-demand loading rather than bundling everything

Summary

There are multiple ways to use SVG in React Native, and choosing the right method depends on your specific scenario:

  • Static icon libraries: Use react-native-svg-transformer for the best development experience
  • Dynamic content: Use SvgXml for runtime loading and processing
  • Performance-critical scenarios: Optimize SVG files in advance and control complexity

Regardless of which method you choose, it's recommended to validate file quality in an SVG Viewer beforehand to ensure ideal visual effects on mobile devices. Through proper workflows and tool support, SVG will become an indispensable graphic resource in React Native applications.

Next Steps

  • Use SVG Viewer to verify viewBox, alignment, and scaling before import.
  • Run SVG Optimizer to reduce SVG complexity for smoother mobile rendering.
  • Convert assets with SVG to React Native when you want copy-ready component code.

Related Articles

Keep exploring SVG workflows and production tips.