It's awesome you're looking to bring the power of Tailwind CSS to your React Native projects! While Tailwind itself is designed for the web, we can achieve a very similar workflow using a library called NativeWind.
Here's a step-by-step guide to get you set up:
Step 1: Set up your React Native project
- If you already have a React Native project, you can skip this step.
-
If you're starting fresh, create a new React Native project using your preferred method (React Native CLI or Expo).
-
React Native CLI:
npx react-native init MyAwesomeApp cd MyAwesomeApp
-
Expo:
npx create-expo-app MyAwesomeApp cd MyAwesomeApp
-
Step 2: Install NativeWind and Tailwind CSS
Now, let's add the necessary packages:
npm install nativewind tailwindcss
-
nativewind
: This library bridges Tailwind's utility-first approach to React Native. -
tailwindcss
: We still need the core Tailwind CSS library for NativeWind to work.
Step 3: (Important) Install react-native-reanimated
NativeWind relies on react-native-reanimated
, so make sure to install it:
npm install react-native-reanimated
Step 4: Set up Tailwind CSS configuration
Generate a tailwind.config.js
file:
npx tailwindcss init
This creates a basic Tailwind configuration file in your project root. You'll likely want to customize this later, but the default is a good starting point.
Step 5: Configure babel.config.js
Open your babel.config.js
and add the NativeWind Babel plugin:
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
'react-native-wind/babel',
// If you're using React Native Reanimated, make sure it's LAST:
// 'react-native-reanimated/plugin',
],
};
-
Crucial: Ensure that
'react-native-wind/babel'
is in your plugins array. - Reanimated: If you use React Native Reanimated, the Reanimated plugin must be the last one in the plugins array.
Step 6: (Crucial) Configure metro.config.js
You need to tell React Native's bundler (Metro) how to handle NativeWind. Create or update your metro.config.js
:
const { getDefaultConfig } = require('metro-config');
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts },
} = await getDefaultConfig();
return {
transformer: {
babelTransformerPath: require.resolve('react-native-wind/babel'),
},
resolver: {
assetExts: assetExts.filter((ext) => ext !== 'svg'), // Important: Exclude svg
sourceExts: [...sourceExts, 'svg'],
},
};
})();
-
babelTransformerPath
: This tells Metro to use NativeWind's Babel transformer. -
assetExts
andsourceExts
: This part is essential, especially if you use SVGs. It prevents conflicts and ensures Metro handles both correctly.
Step 7: Start using Tailwind-like classes!
Now you can style your React Native components with Tailwind-like syntax, using the tw
function.
import React from 'react';
import { View, Text } from 'react-native';
import { tw } from 'nativewind';
const MyComponent = () => {
return (
<View style={tw`bg-blue-500 p-4 rounded-md shadow-lg`}>
<Text style={tw`text-white text-lg font-bold`}>
Hello, NativeWind!
Text>
<Text style={tw`text-blue-200 text-sm mt-2`}>
Styled with NativeWind
Text>
View>
);
};
export default MyComponent;
-
import { tw } from 'nativewind';
: Import thetw
function. -
`
style={tw\
...`}`: Use backticks () and the
tw` tag to write your Tailwind classes.
Step 8: Run your app
You'll probably want to clear your Metro cache to ensure the changes are applied:
`bash
npx react-native start --reset-cache
or
yarn start --reset-cache
`
Then, run your app on your device or emulator as usual:
`bash
npx react-native run-ios # or run-android
or
yarn ios #or android
`
Key things to remember
-
react-native-reanimated
: NativeWind depends on this. -
metro.config.js
: Configuring Metro correctly is crucial for NativeWind to process the styles. -
Babel plugin order: If using Reanimated, make sure its plugin is last in your
babel.config.js
. -
tw
function: Use this to apply styles in your components.
That's it! You've successfully set up NativeWind to use Tailwind-like styling in your React Native application.