React NativeでTailwind CSSを使う(tailwind-rn@4.0.0以降)

## はじめに
`React Native`で`Tailwind`を使いたい。
そう思った私は、技術記事を漁り、`tailwind-rn`というライブラリを発見し、導入のためにスクリプトを打ちました。

```
❯ npx create-tailwind-rn                                                                                                                                   ─╯
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/create-tailwind-rn - Not found
npm ERR! 404
npm ERR! 404  'create-tailwind-rn@latest' is not in this registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
```

しかし、エラーが。公式のリポジトリ漁るか。
すると、2022年1月末にセットアップ方法が変わっているじゃありませんか(執筆時2022年4月上旬)。
ネットに記事が落ちていないので、後世の方々へ導入方法を書き残しておこうと思い執筆しました。

## 目次
1. 環境情報
2. やること/やらないこと
3. `tailwind-rn`の導入
4. 初期設定
5. 動作確認

## 1. 環境情報
- `expo: "~44.0.0"
- "react": "17.0.1"
- "react-native": "0.64.3"
- "typescript": "~4.3.5"
- "tailwind-rn": "^4.2.0"

## 2. やること/やらないこと
- やること
  - `tailwind-rn`の導入方法
  - `tailwind-rn`の使用法の初歩(動作確認程度)

- やらないこと
  - `Tailwind`の設定方法
  - `Tailwind`の使い方
  - `React Native`, `Expo`の導入方法

## 3. `tailwind-rn`の導入
はじめにで書きましたが、`npx create-tailwind-rn`はver4.0.0以前のものです。
ver4.0.0以降は、よくライブラリ導入で使うであろう`yarn add tailwind-rn`すら不要です。

```zsh shell
npx setup-tailwind-rn
```

このコマンド一つで、`tailwind-rn`のインストールから、依存関係のインストール、設定ファイルの作成までやってくれます。
コマンドを叩いたあとで以下のような表示が出たら成功です。

```zsh shell
❯ npx setup-tailwind-rn                                                                                                                                    ─╯
Need to install the following packages:
  setup-tailwind-rn
Ok to proceed? (y) y

  ✔ Install dependencies
  ✔ Create Tailwind config
  ✔ Add scripts

  ★ Summary

  New scripts in package.json:

   build:tailwind - Build CSS file and transform it for use with tailwind-rn
   dev:tailwind - Watch mode for the command above

  New files:

   tailwind.config.js - Tailwind configuration
   input.css - Entrypoint for Tailwind compiler
   tailwind.css - Generated CSS by Tailwind compiler
   tailwind.json - Generated CSS converted into JSON for `tailwind-rn`

  ↓ What's next?

  1. Run tailwind-rn in development mode:

   $ yarn dev:tailwind

  2. Import TailwindProvider and tailwind.json in the root of your app

   import {TailwindProvider} from 'tailwind-rn';
   import utilities from './tailwind.json';

  3. Wrap the root of your app into TailwindProvider:

   <TailwindProvider utilities={utilities}>
     <MyComponent/>
   </TailwindProvider>

  4. Use Tailwind

   import {useTailwind} from 'tailwind-rn';

   const MyComponent = () => {
     const tailwind = useTailwind();

     return <Text style={tailwind('text-blue-600')}>Hello world</Text>;
   };

```

## 4. 初期設定
上記のログを見ていただけるとわかりますが、ほとんどのことは自動でやってくれているのでここからは確認作業になります。

- ライブラリのインストール確認
  `npm ll | grep -e tailwind-rn -e tailwindcss -e postcss -e concurrently`で必要なライブラリがインストールされているか確認しましょう。

- `tailwind.config.js`の確認
  `tailwind.config.js`とは、テーマなどをカスタマイズする際にそれを定義するファイルになります。
  今回は`tailwind-rn`の導入の話がメインなのでこちらの設定ファイルの説明はしません。`tailwind-rn`の使用には以下の2つがあれば最低限問題はありません。

```tailwind.config.js
module.exports = {
+    content : ['./src/**/*.{js,jsx,ts,tsx}'] // デフォルトは空なので、任意のパスを書き足してください
  ...
+    corePlugins: require('tailwind-rn/unsupported-core-plugins') // こちらはセットアップスクリプトに自動で書き足されています
};
```

- `package.json`の確認
  セットアップスクリプトによって、以下の2つのnpmスクリプトが追加されていることを確認します。
  ```package.json
  {
	"scripts":
     {
  +		"build:tailwind": "tailwindcss --input input.css --output tailwind.css --no-autoprefixer && tailwind-rn",
  +		"dev:tailwind": "concurrently \"tailwindcss --input input.css --output tailwind.css --no-autoprefixer --watch\" \"tailwind-rn --watch\""
     }
  }
  ```

## 5. 動作確認
上記の確認が終われば動作確認をしましょう。

   1. `App.tsx`に`TailwindProvider`を追加します。
      ```App.tsx
      import {TailwindProvider} from 'tailwind-rn';
      import utilities from './tailwind.json';
      
      const App = () => (
        <TailwindProvider utilities={utilities}>
          <MyComponent />
        </TailwindProvider>
      );
      
      export default App;
      ```

   2. `useTailwind`をインポートします。
      ```Test.tsx
      import {useTailwind} from 'tailwind-rn';
      
      const MyComponent = () => {
        const tailwind = useTailwind();
      
        return <Text style={tailwind('text-blue-600')}>Hello world</Text>;
      };
      ```

   3. `npm run dev:tailwind`を打って、`css`ファイルを生成します。  
   
   -  `tailwind.css`
      `Tailwind`で作られたCSSで、アプリ内で使用されたスタイルがスクリプトによって書きこまれます。

   - `tailwind.json`
      上記の`tailwind.css`を`tailwind-rn`用にjsonファイルに変換したものです。

### 終わりに
かなり簡単ではありましたが、`tailwind-rn`の導入方法について書かせていただきました。

新しいライブラリを導入するときなどは日本語の記事で楽をしたくなりますが、英語のめんどくささを考慮しても公式ドキュメントの情報の正確さには敵わないなと痛感した導入録となりました。

少しでもこの記事が皆様の開発の役に立てれば幸いです。
お読みいただきありがとうございました。