Hubert
10 min
13 marca, 2025

NativeWind czyli jak używać Tailwind CSS w React Native?

W React Native tradycyjne metody, jak StyleSheet czy Styled Components, często prowadzą do nadmiernie rozbudowanego kodu i trudności w zarządzaniu stylami. Tailwind CSS, popularny w aplikacjach webowych, upraszcza ten proces dzięki podejściu utility-first, oferując czytelność i elastyczność. Dzięki bibliotece NativeWind można korzystać z Tailwind CSS również w React Native. W artykule wyjaśniamy, jak skonfigurować NativeWind i efektywnie stylizować aplikacje mobilne, przyspieszając proces budowy interfejsu.

Czytaj więcej
NativeWind czyli jak używać Tailwind CSS w React Native?
Umów się na bezpłatną konsultację

    Twoje dane przetwarzamy zgodnie z naszą polityką prywatności.

    Co to jest NativeWind?

    NativeWind to biblioteka stylizacji dla React Native, która umożliwia korzystanie z Tailwind CSS w aplikacjach mobilnych. Działa jako interpreter klas Tailwind, konwertując je na natywne style React Native, co pozwala na szybsze i bardziej intuicyjne stylowanie komponentów. Dzięki integracji z Tailwind CSS, NativeWind zapewnia spójność stylu między platformami oraz wysoką wydajność, eliminując konieczność ręcznego definiowania stylów w obiektach StyleSheet.

    Co to jest Tailwind CSS?

    Tailwind CSS to framework CSS typu utility-first, który dostarcza zestaw gotowych klas, takich jak flex, pt-4 czy text-center, umożliwiających szybkie stylizowanie interfejsów bez pisania niestandardowego CSS. Pozwala na bezpośrednie definiowanie wyglądu w HTML lub JSX, wspiera podejście mobile-first i responsywny design. Dzięki temu ułatwia tworzenie spójnych, skalowalnych projektów i jest szczególnie popularny wśród programistów webowych i mobilnych, którzy chcą szybko prototypować oraz budować interfejsy użytkownika.

    Jak używać NativeWind w React Native? – krok po kroku

    Krok 1. Skonfiguruj nowy projekt w React Native

    Zanim zaczniemy używać Tailwind CSS w React Native, musimy przygotować projekt. Istnieją dwie główne metody tworzenia aplikacji React Native: za pomocą Expo lub przy użyciu React Native CLI. Sprawdź szczegółowe informacje jak rozpocząć projekt w React Native?

    Opcja 1: React Native CLI (pełna kontrola)

    Jeśli chcesz mieć dostęp do natywnych modułów, użyj React Native CLI:

    npx react-native init MyApp
    
    cd MyApp
    
    npx react-native run-android  # dla Androida
    
    npx react-native run-ios      # dla iOS (tylko na macOS)

    Opcja 2: Expo (prostsze i szybsze)

    Expo to narzędzie ułatwiające tworzenie aplikacji React Native bez potrzeby konfigurowania środowiska natywnego. Jeśli jeszcze go nie masz, zainstaluj Expo CLI:

    npm install -g expo-cli

    Następnie utwórz i uruchom nowy projekt:

    npx create-expo-app my-app
    
    cd my-app
    
    npx expo start

    Aplikację można testować na urządzeniu mobilnym za pomocą Expo Go.

    Krok 2. Zainstaluj NativeWind

    Aby dodać NativeWind  do projektu, wykonaj następującą komendę:

    npm install nativewind

    NativeWind wymaga również konfiguracji Babel, aby poprawnie interpretować klasy Tailwind CSS. Otwórz plik babel.config.js i dodaj wtyczkę NativeWind:

    module.exports = function (api) {
    
      api.cache(true);
    
      return {
    
        presets: ["babel-preset-expo"],
    
        plugins: ["nativewind/babel"],
    
      };
    
    };

    Dzięki tej konfiguracji NativeWind będzie mógł dynamicznie przetwarzać klasy Tailwind CSS w kodzie React Native.

    Potrzebujesz wsparcia w projektach mobilnych?
    Potrzebujesz wsparcia w projektach mobilnych?
    Potrzebujesz wsparcia w projektach mobilnych?
    Skontaktuj się z nami!

    Krok 3. Konfiguracja Tailwind CSS

    Kolejnym krokiem jest instalacja Tailwind CSS i utworzenie pliku konfiguracyjnego:

    npm install tailwindcss
    
    npx tailwindcss init

    Po wykonaniu tej komendy w katalogu projektu pojawi się plik tailwind.config.js. Otwórz go i dostosuj konfigurację, dodając ścieżki do plików komponentów React Native:

    /** @type {import('tailwindcss').Config} */
    
    module.exports = {
    
      content: ["./App.{js,jsx,ts,tsx}", "./components/**/*.{js,jsx,ts,tsx}"],
    
      theme: {
    
        extend: {},
    
      },
    
      plugins: [],
    
    };

    Dzięki temu Tailwind CSS będzie wiedział, które pliki analizować i gdzie stosować swoje klasy.

    Krok 4. Konfiguracja Babela dla NativeWind

    Aby NativeWind poprawnie interpretował klasy Tailwind CSS w React Native, konieczna jest konfiguracja Babela, który umożliwia przekształcanie kodu JavaScript przed jego wykonaniem.

    Najpierw upewnij się, że masz już zainstalowany NativeWind w projekcie.Następnie otwórz plik babel.config.js znajdujący się w katalogu głównym projektu i dodaj do niego wtyczkę NativeWind:

    module.exports = function (api) {
    
      api.cache(true);
    
      return {
    
        presets: ["babel-preset-expo"],
    
        plugins: ["nativewind/babel"],
    
      };
    
    };

    Co robi ta konfiguracja?

    • api.cache(true) – optymalizuje działanie Babela poprzez pamięć podręczną.
    • presets: [„babel-preset-expo”] – zapewnia wsparcie dla kodu w Expo (jeśli go używasz).
    • plugins: [„nativewind/babel”] – umożliwia interpretację klas Tailwind CSS w React Native.

    Krok 5. Tworzenie i stylowanie komponentów za pomocą NativeWind

    Po poprawnej instalacji NativeWind oraz konfiguracji Tailwind CSS możemy przejść do praktycznego zastosowania. W tym rozdziale przedstawimy, jak korzystać z klas Tailwind CSS w komponentach React Native, aby szybko i efektywnie stylować interfejs użytkownika.

    Podstawowe użycie klas Tailwind w React Native

    Dzięki NativeWind możemy stosować klasy Tailwind CSS bezpośrednio w atrybucie className komponentów React Native. Oto prosty przykład:

    import { View, Text } from 'react-native';
    
    export default function App() {
    
      return (
    
        <View className="flex-1 justify-center items-center bg-blue-500">
    
          <Text className="text-white text-lg font-bold">Witaj w NativeWind!</Text>
    
        </View>
    
      );
    
    }

    Co się tutaj dzieje?

    • flex-1 – ustawia komponent nadrzędny na pełną wysokość ekranu.
    • justify-center – wyrównuje elementy w pionie na środku.
    • items-center – wyrównuje elementy w poziomie na środku.
    • bg-blue-500 – ustawia kolor tła na niebieski.
    • text-white – zmienia kolor tekstu na biały.
    • text-lg – ustawia większy rozmiar czcionki.
    • font-bold – pogrubia tekst.

    Dzięki temu kod jest czytelniejszy i bardziej zwięzły, a cały styl jest zdefiniowany w jednym miejscu.

    Stylowanie warunkowe

    NativeWind pozwala na dynamiczne zmienianie stylów na podstawie stanu komponentu. Możemy użyć operatora warunkowego do nadawania różnych klas w zależności od wartości zmiennej:

    import { useState } from 'react';
    import { View, Text, TouchableOpacity } from 'react-native';
    
    export default function App() {
      const [darkMode, setDarkMode] = useState(false);
    
      return (
        <View className={`flex-1 justify-center items-center ${darkMode ? 'bg-gray-900' : 'bg-white'}`}>
          <Text className={`text-lg ${darkMode ? 'text-white' : 'text-black'}`}>
            {darkMode ? 'Tryb ciemny' : 'Tryb jasny'}
          </Text>
          <TouchableOpacity 
            className="mt-4 px-4 py-2 bg-blue-500 rounded-lg"
            onPress={() => setDarkMode(!darkMode)}
          >
            <Text className="text-white font-bold">Zmień tryb</Text>
          </TouchableOpacity>
        </View>
      );
    }
    

    Jak to działa?

    • Używamy useState, aby śledzić stan trybu ciemnego.
    • Tło View zmienia kolor w zależności od wartości darkMode.
    • Tekst Text zmienia kolor na biały w trybie ciemnym i czarny w trybie jasnym.
    • TouchableOpacity działa jako przycisk do zmiany trybu.

    Dzięki NativeWind możemy dynamicznie zarządzać stylami w prosty i przejrzysty sposób.

    Obsługa responsywności

    NativeWind obsługuje wbudowane klasy responsywne, co pozwala na dostosowanie interfejsu do różnych rozmiarów ekranów:

    <View className="w-full sm:w-1/2 md:w-1/3 lg:w-1/4 bg-green-500 p-4">
    
      <Text className="text-white text-center">Przykładowy blok</Text>
    
    </View>

    Dzięki temu komponenty automatycznie dostosowują się do różnych rozdzielczości ekranów.

    Zalety używania NativeWind w React Native

    Wykorzystanie NativeWind w React Native niesie za sobą szereg korzyści, które czynią stylowanie prostszym i bardziej intuicyjnym:

    Spójność stylowania na różnych platformach

    Jednym z największych wyzwań w stylowaniu aplikacji mobilnych jest zapewnienie, że wygląd pozostaje spójny na różnych urządzeniach i systemach operacyjnych. Tailwind CSS w połączeniu z NativeWind pozwala na łatwiejsze zarządzanie stylem zarówno na Androidzie, jak i iOS, bez konieczności stosowania osobnych rozwiązań dla każdej platformy.

    Szybkie tworzenie interfejsu użytkownika

    Dzięki podejściu utility-first, nie trzeba pisać długich stylów w plikach JavaScript. Zamiast tego można używać klas Tailwind CSS bezpośrednio w komponentach, co znacząco przyspiesza proces budowania interfejsu użytkownika.

    Przykład tradycyjnego stylowania w React Native:

    import { View, Text, StyleSheet } from 'react-native';
    
    export default function App() {
      return (
        <View style={styles.container}>
          <Text style={styles.text}>Witaj w aplikacji!</Text>
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#3498db',
      },
      text: {
        color: '#ffffff',
        fontSize: 18,
      },
    });
    

    Przykład z NativeWind i Tailwind CSS:

    jsx
    
    import { View, Text } from 'react-native';
    
    export default function App() {
      return (
        <View className="flex-1 justify-center items-center bg-blue-500">
          <Text className="text-white text-lg">Witaj w aplikacji!</Text>
        </View>
      );
    }
    

    Lepsza organizacja kodu i jego czytelność

    Dzięki zastosowaniu klas użytkowych w komponentach React Native, nie musimy tworzyć długich obiektów StyleSheet, co ułatwia zarządzanie stylami. Dzięki temu kod jest bardziej zwięzły, a zmiany w wyglądzie komponentów można wprowadzać szybciej.

    Łatwa implementacja responsywności

    Tailwind CSS oferuje wbudowane narzędzia do tworzenia interfejsów responsywnych. Dzięki temu możemy stosować klasy sm, md, lg i inne, aby dostosować wygląd komponentów do różnych rozmiarów ekranów.

    Obsługa trybu ciemnego

    NativeWind pozwala na łatwą implementację trybu ciemnego, co jest coraz bardziej popularnym wymaganiem w nowoczesnych aplikacjach mobilnych. Wystarczy dodać odpowiednie klasy, np.:

    <Text className="text-black dark:text-white">Tryb jasny i ciemny</Text>

    Dzięki temu aplikacja automatycznie dostosuje kolory do preferencji użytkownika.

    Rozwiązywanie najczęstszych problemów

    Podczas pracy z NativeWind i Tailwind CSS w React Native, możesz napotkać pewne błędy. Poniżej znajdziesz rozwiązania dla najczęstszych problemów oraz wskazówki, jak sobie z nimi radzić.

    1. Klasy Tailwind CSS nie działają

    Problem: Po dodaniu klas Tailwind CSS komponenty nie zmieniają wyglądu.
    Rozwiązanie:
    –  sprawdź, czy poprawnie skonfigurowałeś plik tailwind.config.js i czy zawiera odpowiednie ścieżki
    – upewnij się, że dodałeś wtyczkę NativeWind w babel.config.js:
    – zrestartuj serwer deweloperski

    2. Aplikacja nie rozpoznaje className

    Problem: React Native zgłasza błąd, że className nie jest poprawnym atrybutem.
    Rozwiązanie: 
    – sprawdź, czy na pewno zainstalowałeś NativeWind
    – upewnij się, że używasz Expo w wersji SDK 48 lub nowszej (w przypadku starszych wersji mogą występować problemy)
    – jeżeli problem nadal występuje, użyj styled zamiast className:

    3. Tailwind nie działa na Androidzie

    Problem: Aplikacja działa poprawnie na iOS, ale na Androidzie klasy Tailwind nie są stosowane.

    Rozwiązanie:
    – sprawdź, czy Twoja aplikacja korzysta z najnowszej wersji React Native i Expo.
    – sprawdź logi w terminalu, aby znaleźć ewentualne błędy związane z renderowaniem.
    – wykonaj pełne wyczyszczenie cache i uruchom aplikację ponownie

    4. Nie działa tryb ciemny (dark:)

    Problem: Klasy Tailwind odpowiedzialne za tryb ciemny (dark:) nie są stosowane.

    Rozwiązanie:
    – upewnij się, że system operacyjny ma włączony tryb ciemny.
    – jeśli chcesz wymusić tryb ciemny, w tailwind.config.js dodaj opcję darkMode: „class”:
    – możesz ręcznie zmieniać tryb ciemny w kodzie:

    FAQ – Najczęściej zadawane pytania

    Czy NativeWind jest stabilne?

    Tak, NativeWind jest stabilnym rozwiązaniem i jest aktywnie rozwijane przez społeczność. Jest szeroko stosowane w projektach produkcyjnych React Native.

    Jak używać NativeWind w Expo?

    Wystarczy zainstalować NativeWind i Tailwind CSS w projekcie Expo za pomocą:

    npm install nativewind tailwindcss
    
    npx tailwindcss init

    Następnie skonfigurować tailwind.config.js i dodać plugin NativeWind w babel.config.js.

    Czy można używać Tailwind w React Native?
    Tak, można używać Tailwind CSS w React Native dzięki bibliotece NativeWind, która interpretuje klasy Tailwind i konwertuje je na natywne style.

    Czy NativeWind działa na Androidzie?
    Tak, NativeWind działa zarówno na Androidzie, jak i iOS, ponieważ wykorzystuje natywne API React Native do renderowania stylów.

    Jak korzystać z NativeWind?
    Po instalacji NativeWind można używać klas Tailwind CSS bezpośrednio w atrybucie className komponentów React Native, np.:

    <View className="bg-blue-500 p-4 rounded-lg">
    
      <Text className="text-white font-bold">Hello, NativeWind!</Text>
    
    </View>

    Czy można używać Tailwind w React?
    Tak, Tailwind CSS jest natywnie przeznaczony dla aplikacji React i React Native. W przypadku aplikacji mobilnych konieczne jest użycie NativeWind, natomiast w aplikacjach webowych można stosować Tailwind bez dodatkowych bibliotek.

    Powiązane artykuły
    Zobacz wszystkie
    Odkryj więcej tematów