code/tamagui.dev/data/docs/guides/metro.mdx
The default Expo Metro configuration works out of the box:
const { getDefaultConfig } = require('expo/metro-config')
module.exports = getDefaultConfig(__dirname)
For better dev experience, use @tamagui/metro-plugin which loads your Tamagui
config and watches for changes:
yarn add @tamagui/metro-plugin
If you have a tamagui.build.ts (recommended — see
compiler install docs),
no options are needed:
const { getDefaultConfig } = require('expo/metro-config')
const { withTamagui } = require('@tamagui/metro-plugin')
const config = getDefaultConfig(__dirname)
// reads from tamagui.build.ts automatically
module.exports = withTamagui(config)
Or pass options inline:
const { getDefaultConfig } = require('expo/metro-config')
const { withTamagui } = require('@tamagui/metro-plugin')
const config = getDefaultConfig(__dirname)
module.exports = withTamagui(config, {
components: ['tamagui'],
config: './tamagui.config.ts',
})
For maximum optimization, use the tamagui build command which pre-compiles
your components:
# Optimize and build, then restore source files
tamagui build --target web ./app -- expo export --platform web
The -- syntax runs the command after optimization, then automatically restores
your source files. Add this to your package.json:
{
"scripts": {
"build:web": "expo export --platform web",
"build:web:optimized": "tamagui build --target web ./app -- expo export --platform web"
}
}
To debug the compiler output, add // debug at the top of a file:
// debug
import { YStack } from 'tamagui'
export function MyComponent() {
return <YStack flex={1} bg="$background" />
}
This will print detailed compiler output showing what optimizations are happening:
[✅] flattened YStack div
Use // debug-verbose for even more detailed output.