Skip to main content
Metro is the JavaScript bundler for React Native. Learn how to configure Metro for optimal development and production builds.

Overview

Metro configuration is defined in metro.config.js at your project root. React Native provides sensible defaults through the @react-native/metro-config package.

Basic Configuration

Default Setup

Create metro.config.js:
metro.config.js
This uses React Native’s default Metro configuration.

Configuration Options

Metro configuration is divided into several sections:

Resolver

Controls how Metro resolves modules.
metro.config.js

Transformer

Controls how files are transformed.
metro.config.js

Serializer

Controls how modules are serialized into bundles.
metro.config.js

Server

Controls Metro development server.
metro.config.js

Watcher

Controls file watching behavior.
metro.config.js

Common Configurations

Add Custom File Extensions

metro.config.js

Support SVG

Using react-native-svg-transformer:
metro.config.js

Monorepo Setup

metro.config.js

Block Specific Modules

metro.config.js

Custom Asset Handling

metro.config.js

Environment-Specific Config

metro.config.js

Performance Optimization

Enable Inline Requires

metro.config.js
This defers module loading until actually needed, reducing initial bundle size.

Cache Configuration

metro.config.js

Limit Worker Threads

metro.config.js
Useful for limiting CPU usage on lower-end machines.

Tree Shaking

metro.config.js

Production Optimizations

Remove Console Logs

metro.config.js

Aggressive Minification

metro.config.js

Advanced Use Cases

Custom Transformer

custom-transformer.js
metro.config.js

Platform-Specific Extensions

metro.config.js
File resolution order:
  1. Component.ios.js (on iOS)
  2. Component.android.js (on Android)
  3. Component.native.js
  4. Component.js

Custom Resolver

metro.config.js

Debugging Metro Config

Verbose Logging

Inspect Config

Create inspect-config.js:
inspect-config.js
Run:

Test Config Changes

Integration with Tools

Storybook

metro.config.js

Web Support (React Native Web)

metro.config.js

Troubleshooting

Module Not Found

Solution: Check resolver configuration:

Cache Issues

Solution:

Slow Bundling

Solution:
  1. Limit workers:
  1. Use persistent cache
  2. Exclude unnecessary files from watching

Duplicate Module

Error: Requiring module 'X', which was already loaded Solution:

React Native Defaults

The default Metro configuration from @react-native/metro-config includes:

Best Practices

Use mergeConfig to preserve React Native defaults:
Add comments explaining why custom configurations are needed.

Next Steps

Start Command

Start Metro development server

Bundle Command

Create production bundles

Metro Docs

Official Metro documentation

Performance

Optimize bundle performance