Tailwind CSS

Edit this page

Learn how to configure and use Tailwind CSS in your Expo project.


Standard Tailwind CSS supports only web platform. For universal support, use a library such as NativeWind, which allows creating styled React Native components with Tailwind CSS.

Tailwind CSS is a utility-first CSS framework and can be used with Metro for web projects. This guide explains how to configure your Expo project to use the framework.

Prerequisites

The following files will be modified to set the Tailwind CSS configuration:

app.json
package.json
global.css
tailwind.config.js
index.js

Ensure that your project is using Metro for web. You can verify this by checking the web.bundler field which is set to metro in the app.json file.

app.json
{
  "expo": {
    "web": {
      "bundler": "metro"
    }
  }
}

Configuration

Configure Tailwind CSS in your Expo project according to the Tailwind PostCSS documentation.]

1

Install tailwindcss and its required peer dependencies. Then, the run initialization command to create tailwind.config.js and post.config.js files in the root of your project.

Terminal
# Install Tailwind and its peer dependencies
npx expo add tailwindcss postcss autoprefixer -- --dev

# Create a Tailwind config file
npx tailwindcss init -p

2

Add paths to all of your template files inside tailwind.config.js.

tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    // Ensure this points to your source code
    './app/**/*.{js,tsx,ts,jsx}',
    // If you use a `src` directory, add: './src/**/*.{js,tsx,ts,jsx}'
    // Do the same with `components`, `hooks`, `styles`, or any other top-level directories
  ],
  theme: {
    extend: {},
  },
  plugins: [],
};

If you are using Expo Router, consider using a root src directory to simplify this step. Learn more about top-level src directory.

3

Create a global.css file in the root of your project and directives for each of Tailwind's layers:

global.css
/* This file adds the requisite utility classes for Tailwind to work. */
@tailwind base;
@tailwind components;
@tailwind utilities;

4

Import the global.css file in your app/_layout.tsx (if using Expo Router) or index.js file:

app/_layout.tsx
import '../global.css';
index.js
// Import the global.css file in the index.js file:
import './global.css';
If you are using DOM components, add this file import to each module using the "use dom" directive since they don't share globals.

5

You now start your project and use Tailwind CSS classes in your components.

Terminal
npx expo start

Usage

You can use Tailwind with React DOM elements as-is:

app/index.tsx
export default function Index() {
  return (
    <div className="bg-slate-100 rounded-xl">
      <p className="text-lg font-medium">Welcome to Tailwind</p>
    </div>
  );
}

You can use the { $$css: true } syntax to use Tailwind with React Native web elements:

app/index.tsx
import { View, Text } from 'react-native';

export default function Index() {
  return (
    <View style={{ $$css: true, _: 'bg-slate-100 rounded-xl' }}>
      <Text style={{ $$css: true, _: 'text-lg font-medium' }}>Welcome to Tailwind</Text>
    </View>
  );
}

Tailwind for Android and iOS

Tailwind does not support Android and iOS platforms. You can use a compatibility library such as NativeWind for universal support.

Alternative for Android and iOS

Alternatively, you can use DOM components to render your Tailwind web code in a WebView on native.

app/index.tsx
'use dom';

// Remember to import the global.css file in each DOM component.
import '../global.css';

export default function Page() {
  return (
    <div className="bg-slate-100 rounded-xl">
      <p className="text-lg font-medium">Welcome to Tailwind</p>
    </div>
  );
}

Troubleshooting

If you have a custom config.cacheStores in your metro.config.js, you need to extend the Expo superclass of FileStore:

metro.config.js
// Import the Expo superclass which has support for PostCSS.
const { FileStore } = require('@expo/metro-config/file-store');

config.cacheStores = [
  new FileStore({
    root: '/path/to/custom/cache',
  }),
];

module.exports = config;

Ensure you don't have CSS disabled in your metro.config.js:

metro.config.js
/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(__dirname, {
  // Do not disable CSS support when using Tailwind.
  isCSSEnabled: true,
});