ReactNativeにTailwindを導入

2024/11/16
reactnative-tailwind

はじめに

ReactNative に Tailwind を導入したので、備忘録として記事を書きます。
ドキュメントでは、どこにファイルを作るのかとなど少し分かりにくい点があったため、その辺りで詰まらないよう記事を書きたいと思います。
実際に導入するパッケージとしては、NativeWind になります。

NativeWindの導入

こちらのNeitiveWindドキュメントを参考に ReactNative プロジェクトにパッケージをインストールしていきます。

ReactNative プロジェクトの作成がまだの場合は、以下のコマンドを実行して作成します。

npm uninstall -g react-native-cli @react-native-community/cli    // 予期しないエラーを防ぐため削除
npx @react-native-community/cli@latest init NativeWindProject    // NativeWindProjectを作成

1. パッケージのインストール

ReactNative プロジェクトに npm パッケージと pod パッケージをインストールします。

nativewind パッケージのインストールに合わせて、依存するパッケージもインストールします。

npm install nativewind tailwindcss react-native-reanimated react-native-safe-area-context    // npm パッケージをインストール

npm パッケージがインストールできたら、以下のコマンドを実行し、pod パッケージをインストールします。
うまくいかない場合は、ios ディレクトリへ移動し、`bundle exec pod install` を実行します。
npx pod-install    // pod install を実行し、pod パッケージをインストール

// 失敗する場合は、iosディレクトリで bundle exec pod install を実行
// cd ios                     // iosディレクトリへ移動
// bundle exec pod install    // bundlerのcocoapodsでpodパッケージをインストール

2. Tailwindの設定

以下のコマンドを実行し、tailwind.config.js ファイルを作成します。

cd NativeWindProject    // ReactNativeプロジェクトへ移動
npx tailwindcss init    // tailwind.config.js ファイルを作成

作成された tailwind.config.js ファイルを以下のように修正します。
content には、tailwind を使用するコンテンツファイルのパスを指定します。
presets には、nativewind/preset を指定し、nativewind に必要な設定を読み込むようにします。
// tailwind.config.js

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./app/**/*.{js,jsx,ts,tsx}', './*.{js,jsx,ts,tsx}'], // App.tsx に適用するため、'./*.{js,jsx,ts,tsx}' を追記
  presets: [require('nativewind/preset')],
  theme: {
    extend: {},
  },
  plugins: [],
}

次に、global.css ファイルを作成し、以下のように設定します。
global.css を作成する場所はどこでもいいのですが、既存のプロジェクトに src/assets/styles フォルダなどがあれば、その配下にファイルを作成します。

// global.css

@tailwind base;
@tailwind components;
@tailwind utilities;

参考:https://tailwindcss.com/docs/configuration


3. Babelの設定

babel.config.js を以下のように修正します。
Expo フレームワークを使用している場合、別の設定が必要になるので、こちらをご確認ください。

// babel.config.js

module.exports = {
  presets: ['module:@react-native/babel-preset', 'nativewind/babel'],
}

4. Metroの設定

metro.config.js を以下のように修正します。
Expo フレームワークを使用している場合、別の設定が必要になるので、こちらをご確認ください。

// metro.config.js

const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config')
const { withNativeWind } = require('nativewind/metro')

const config = mergeConfig(getDefaultConfig(__dirname), {
  /* your config */
})

module.exports = withNativeWind(config, { input: './global.css' }) // 作成したglobal.cssのパスを指定

5. CSSの読み込み

App.tsx で global.css を読み込みます。

// App.tsx

import "./global.css"    // 作成したglobal.cssのパスを指定

export default App() {
  /* Your App */
}

6. TypeScriptの設定

nativewind-env.d.ts ファイルを作成し、nativewind の型定義ファイルをプロジェクトに読み込みます。
こうすることにより、コンポーネントの props で className が補完されるようになります。

VSCode で className に入力する文字列(Tailwind CSS)を補完するには、Tailwind CSS IntelliSense の拡張機能をインストールします。
拡張機能をインストールすることで、Tailwind CSS の文字列が保管されるようになります。

// nativewind-env.d.ts
// プロジェクトのルートディレクトに作成

/// <reference types="nativewind/types" />

動作確認

App.tsx で適当なコンポーネントを返すよう実装し、問題なくスタイルが適用されていることを確認します。

// App.tsx

function App(): React.JSX.Element {
  return (
    <SafeAreaView className='bg-orange-300'>
      <Text>Hello World !</Text>
    </SafeAreaView>
  );
}

export default App;

おわりに

今回、ReactNative での Tailwind 導入について記事を書きました。
この記事が、未来の自分や他の方のお役に立てば幸いです。
ここまで、ご覧いただきありがとうございました。

Imakyo
imakyo

未経験からエンジニアへ転職。メインはSwiftとDartを用いたモバイルアプリ開発。個人開発や業務での経験を備忘録として発信していきます。