React Native
でTailwind CSS
を使用したいということで調べてみると下記2つが該当した。
tailwind-rnとnativewindの比較
スターはtailwind-rn
が上回っているけど、活動の多さではnativewind
が上回っているようなので、nativewind
を採用した。
nativewindの導入
ドキュメントも丁寧なのでなぞって行っていく。
npm i nativewind
npm i --dev tailwindcss
上記コマンドで該当パッケージをインストールする。
npx tailwindcss init
次に上記コマンドでtailwind.config.js
を作成し、下記のように記載する。
// tailwind.config.js
module.exports = {
- content: [],
+ content: ["./App.{js,jsx,ts,tsx}", "./<custom directory>/**/*.{js,jsx,ts,tsx}"],
theme: {
extend: {},
},
plugins: [],
}
<custom directory>
は自身のディレクトリに編集する。
次にbabel.config.js
を下記のように編集していく。
// babel.config.js
module.exports = function (api) {
api.cache(true);
return {
presets: ["babel-preset-expo"],
+ plugins: ["nativewind/babel"],
};
};
以上とのことなので、起動してみる。 無事に開発環境は動いている。
次にnativewind
の記述を反映することができるか確認してみる。
<View style={styles.container}>
<Text>Hello World!</Text>
<StatusBar style="auto" />
</View>
を
<View className="flex-1 items-center justify-center bg-white">
<Text>Hello World!</Text>
<StatusBar style="auto" />
</View>
に変換した。結果大量のエラーが出現した。
No overload matches this call.
Overload 1 of 2, '(props: ViewProps | Readonly<ViewProps>): View', gave the following error.
Type '{ children: Element[]; className: string; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<View> & Readonly<ViewProps>'.
Property 'className' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<View> & Readonly<ViewProps>'.
Overload 2 of 2, '(props: ViewProps, context: any): View', gave the following error.
Type '{ children: Element[]; className: string; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<View> & Readonly<ViewProps>'.
Property 'className' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<View> & Readonly<ViewProps>'.ts(2769)
エラーの解消
エラーを解消していく。
そもそもnativewind
をexpo
で使用するサンプルがGithub
に用意されていたので、それを見つつ解消していく。
まず最初に変更したtailwind.config.js
を
content: ["./App.tsx"],
に変更する。
次に、babel.config.js
はそのまま。
で、ここまでで不足しているっぽいファイルを追加していく。
まずは、styles.css
をルートに追加する。 内容は
@tailwind base;
@tailwind components;
@tailwind utilities;
あとnativewind.d.ts
という型ファイル。
中身は
/// <reference types="nativewind/types" />
これにの追加によりclassName
の型エラーが解消された。
最後にapp.tsxにimport "./styles.css";
という感じで追加したstyle.css
をインポートする。
で、実行すると
error: App.tsx: ~\App.tsx: Use process(css).then(cb) to work with async plugins
というエラーが出た。 https://github.com/marklawlor/nativewind/issues/556 も上がっている。
過去issueで解決済だったので、それを参照し tailwind
のバージョンを"^3.3.2”に変更したところ、
error: App.tsx: ~\App.tsx: Use process(css).then(cb) to work with async plugins
このエラーは消えた。
次に、下記エラーと遭遇する。
Unable to resolve "./styles.css" from "App.tsx"
このエラーはApp.tsx
のimport "./styles.css";
を削除したら消えた。
動作確認
最後に起動したところ、無事にnativewind
の記述が反映されていることを確認できた。