Front-end

NativeWind - czym jest i jak działa Tailwind CSS w React Native?

NativeWind pozwala stylować aplikacje mobilne w React Native tymi samymi klasami Tailwind CSS, których używa się na stronach internetowych. Wyjaśniamy, jak działa pod spodem, co daje firmie, gdzie przeglądarka i telefon się rozjeżdżają i którą wersję wybrać.

29 sie 2026

NativeWind to biblioteka, która pozwala pisać style aplikacji mobilnej w React Native tak samo, jak pisze się je na stronach internetowych w Tailwind CSS. Programista dopisuje do przycisku klasy w rodzaju bg-blue-600 rounded-xl px-4, a na telefonie z iOS czy Androidem pojawia się niebieski, zaokrąglony przycisk z odpowiednimi marginesami. Tak w praktyce działa Tailwind CSS w React Native: ten sam zapis, inna platforma.

Dla kogoś spoza zespołu technicznego to szczegół. Dla firmy, która ma stronę lub panel w przeglądarce i do tego aplikację mobilną, już niekoniecznie. Od sposobu stylowania zależy, czy zmiana koloru marki to godzina pracy, czy tydzień poprawek w dwóch miejscach. I czy nowy programista po tygodniu rozumie kod, czy dopiero po miesiącu.

Telefon nie zna CSS

Strony internetowe wyglądają tak, a nie inaczej, dzięki CSS, czyli językowi opisującemu kolory, odstępy i układ elementów. Przeglądarka czyta te reguły i rysuje stronę. Aplikacja w React Native nie działa w przeglądarce. Rysuje prawdziwe, natywne elementy systemu iOS i Androida, a te o CSS nigdy nie słyszały. Dlatego React Native ma własny sposób opisywania wyglądu: obiekty w JavaScripcie, tworzone przez wbudowane narzędzie StyleSheet. Przypominają CSS nazwami właściwości, ale nie ma w nich klas, kaskady ani zapytań o rozmiar ekranu. Każdy komponent dostaje swój zestaw stylów, zapisany zwykle na dole pliku.

Na stronach internetowych w ostatnich latach wygrało inne podejście. Tailwind CSS zamiast pisać osobne arkusze stylów podsuwa setki małych, gotowych klas: jedna ustawia kolor tła, druga zaokrąglenie, trzecia odstęp. Wygląd składa się z nich jak z klocków bezpośrednio w kodzie komponentu. Czym ten model różni się od frameworków z gotowymi komponentami, dobrze pokazuje porównanie Tailwind CSS z Bootstrapem. Problem pojawia się, gdy ta sama firma ma oba światy. Zespół pisze klasy Tailwind w panelu na Next.js, a w aplikacji mobilnej przełącza się na obiekty StyleSheet. Dwa języki stylów, dwie listy kolorów, dwa źródła błędów. NativeWind powstał, żeby ten podział zniknąć.

Jak działa Tailwind CSS w React Native dzięki NativeWind

Najprościej opisać to jako tłumacza, który większość pracy wykonuje zawczasu. Kiedy programista uruchamia budowanie aplikacji, NativeWind przegląda kod, wyszukuje użyte klasy Tailwind i zamienia je na gotowe obiekty stylów, które React Native rozumie natywnie. Dokumentacja wersji 5 opisuje to wprost: przy budowaniu style są kompilowane do obiektów StyleSheet.create. Część decyzji nie da się jednak podjąć przed uruchomieniem aplikacji. Czy użytkownik ma włączony tryb ciemny? Czy właśnie dotyka przycisku? Czy telefon jest obrócony poziomo? Tym zajmuje się niewielka warstwa działająca w aplikacji, która w odpowiednim momencie podmienia przygotowane wcześniej style. Ciężka praca dzieje się więc raz, na komputerze programisty. Na telefonie zostaje tylko wybór gotowego wariantu. To odróżnia NativeWind od starszych bibliotek typu CSS-in-JS, takich jak styled-components, które przeliczały style w trakcie działania aplikacji. Takie liczenie w locie to jedna z głównych wad podejścia CSS-in-JS, odczuwalna zwłaszcza na słabszych telefonach. Podobną filozofię kompilowania stylów zawczasu ma w świecie webowym Panda CSS.

Od strony projektu wdrożenie to kilka plików konfiguracyjnych. W wersji 4 dochodzi plik z ustawieniami Tailwind, arkusz z dyrektywami Tailwind, wpis w konfiguracji Babel i Metro, czyli narzędzi, które składają kod aplikacji w całość. Najwygodniej idzie to z Expo. Sama dokumentacja Expo, gdy mowa o Tailwind na iOS i Androidzie, odsyła do NativeWind albo Uniwind.

Schemat pokazujący drogę klasy Tailwind CSS przez kompilator NativeWind do natywnych stylów React Native

Ten sam przycisk w dwóch zapisach

Żeby różnica była namacalna, weźmy jeden przycisk „Zarezerwuj" z ekranu rezerwacji. Najpierw klasycznie, przez StyleSheet:

<Pressable style={styles.button}>
  <Text style={styles.label}>Zarezerwuj</Text>
</Pressable>

const styles = StyleSheet.create({
  button: { backgroundColor: '#2563eb', borderRadius: 12, paddingVertical: 12, paddingHorizontal: 16 },
  label: { color: '#ffffff', fontWeight: '600', textAlign: 'center' },
});

// To samo w NativeWind:
<Pressable className="bg-blue-600 active:bg-blue-700 dark:bg-blue-500 rounded-xl py-3 px-4">
  <Text className="text-white font-semibold text-center">Zarezerwuj</Text>
</Pressable>

Wersja z NativeWind jest krótsza, ale nie to jest najważniejsze. Ważniejsze, że w jednej linii widać trzy stany przycisku: zwykły, wciśnięty i w trybie ciemnym. W StyleSheet każdy z nich wymaga osobnej logiki w kodzie. Druga rzecz: klasa bg-blue-600 znaczy dokładnie to samo w aplikacji mobilnej i na stronie zbudowanej w React.js. Programista, który zna jedno, czyta drugie bez tłumaczenia.

Jest też koszt. Długi ciąg klas w jednym komponencie potrafi być mniej czytelny niż nazwany obiekt styles.button. Dobre zespoły radzą sobie z tym, wydzielając powtarzalne elementy do własnych komponentów, a nie kopiując ten sam łańcuch klas po całej aplikacji.

Kompilacja stylów z wyprzedzeniem

NativeWind wykonuje ciężką pracę raz - na komputerze programisty, podczas budowania aplikacji. Na telefonie użytkownika nie ma żadnych obliczeń: aplikacja wybiera gotowy obiekt ze skompilowanej mapy. To zasadnicza różnica w stosunku do CSS-in-JS, który przelicza style przy każdym renderowaniu. Na słabszych urządzeniach ta różnica przekłada się na płynność przewijania i responsywność interfejsu.

Co z tego ma firma

Pierwsza korzyść to wspólny słownik wyglądu. Kolory marki, odstępy, wielkości fontów i zaokrąglenia definiuje się raz, w konfiguracji Tailwind. Projektant w Figmie nazywa kolor „primary", programista webowy używa klasy bg-primary, mobilny dokładnie tej samej. Przy rebrandingu zmienia się jedną wartość, a nie szuka odcieni po dwóch repozytoriach. Takie uporządkowanie to fundament każdego design systemu. Druga to ludzie. Programista frontendu, który zna Tailwind, siada do aplikacji mobilnej bez nauki nowego sposobu stylowania. W firmie z jednym zespołem od weba i mobile to realnie skraca wdrażanie nowych osób. W projektowaniu UX/UI pracujemy w Figmie i wdrażamy widoki w React i Tailwind, dlatego zgodność tokenów projektowych z kodem traktujemy jako warunek, a nie dodatek.

Osobny temat to tryb ciemny, który w ankiecie State of React Native 2025 był najczęściej wymienianym problemem przy stylowaniu. Z prefiksem dark: wariant ciemny powstaje w tym samym miejscu co jasny, bez osobnej logiki motywów. Zasady projektowania samego ciemnego trybu pozostają bez zmian, łatwiejsze staje się tylko ich wdrożenie.

W tej samej ankiecie, wypełnionej przez ponad tysiąc programistów, z NativeWind korzystało 42,1% osób. Więcej odpowiedzi zebrały tylko wbudowane metody: style w linii i StyleSheet. Z kolei rejestr npm odnotował w tygodniu od 28 września do 4 października 2026 roku ponad 2,2 mln pobrań paczki (npm, nativewind). Wybierając NativeWind, firma nie stawia więc na niszowe narzędzie, które za rok może zniknąć.

Tam, gdzie przeglądarka i telefon się rozjeżdżają

NativeWind nie robi z aplikacji mobilnej strony internetowej. Pod spodem wciąż działa silnik układu React Native, a ten ma swoje zasady. Kto przenosi nawyki z weba jeden do jednego, trafi na kilka niespodzianek, które dokumentacja opisuje otwarcie:

  • elementy w React Native domyślnie układają się w kolumnie, a nie w wierszu jak na stronie, więc ten sam kod potrafi dać inny układ;
  • na telefonie nie ma siatki CSS Grid, dostępny jest tylko flexbox, dlatego złożone siatki z wersji webowej trzeba przebudować;
  • bazowa jednostka „rem" to w aplikacji 14 pikseli, a nie 16 jak w przeglądarce, co zmienia proporcje tekstu;
  • część klas z przezroczystością kolorów jest w wersji 4 wyłączona ze względu na wydajność.


Z perspektywy biznesu wniosek jest prosty. Wspólne są język i wartości, nie gotowe ekrany. Panel w przeglądarce i aplikacja w telefonie nadal są projektowane osobno, bo użytkownik trzyma je w ręku inaczej. Zyskiem jest spójność i szybkość zmian, a nie kopiowanie interfejsu.

Drugie ograniczenie dotyczy gotowych bibliotek komponentów. Kalendarz czy mapa od zewnętrznego dostawcy nie zawsze przyjmie klasy Tailwind. W wersji 4 obchodzi się to specjalną funkcją, która „uczy" komponent rozumieć klasy, ale to dodatkowa praca przy każdym takim elemencie. Przy wyborze bibliotek do projektu warto to sprawdzić wcześniej niż później.

Najczęstszy błąd przy pierwszym projekcie z NativeWind

Programiści przyzwyczajeni do webowego Tailwind często sięgają po grid-cols-2 i grid-cols-3. W React Native CSS Grid nie istnieje - dostępny jest tylko flexbox. Siatki z wersji webowej trzeba przepisać na flex flex-wrap albo na zagnieżdżone rzędy. Drugie zaskoczenie to jednostka rem: w React Native to 14 pikseli, a nie 16 jak w przeglądarce, przez co typografia wygląda nieco inaczej bez korekty konfiguracji.

Wersja 4, wersja 5 i Uniwind - stan na październik 2026

Stabilną, zalecaną do produkcji wersją jest dziś NativeWind 4 (4.2.7), oparty na Tailwind CSS 3.4. Na nim działa zdecydowana większość aplikacji korzystających z biblioteki. Wersja 5 ma status kandydata do wydania (5.0.0-rc.0) i przechodzi na Tailwind CSS 4 oraz nowy silnik react-native-css. Dokumentacja wprost zastrzega, że to wydanie przedpremierowe, nieprzeznaczone do użytku produkcyjnego. Co zmienia piątka? Konfigurację przenosi z pliku JavaScript do CSS, zgodnie z kierunkiem Tailwind 4. Dodaje lepszą obsługę zmiennych CSS do motywów, zapytania o rozmiar kontenera i stylowanie zależne od stanu rodzica. Dla nowego projektu startującego dziś oznacza to wybór: stabilna czwórka z perspektywą migracji albo poczekanie na pełne wydanie piątki.

Jest też konkurent. Uniwind, rozwijany przez Codemask, twórców biblioteki Unistyles, od początku obsługuje Tailwind CSS 4 i używa tego samego zapisu przez className. Wersja podstawowa jest darmowa, na licencji MIT, a płatna wersja Pro przenosi część pracy do silnika w C++. Autorzy publikują testy, według których ich biblioteka jest kilkukrotnie szybsza od NativeWind. To pomiary producenta, więc traktujemy je jako punkt wyjścia do własnego testu, a nie rozstrzygnięcie.

Nasze podejście jest na razie zachowawcze. Nowe aplikacje produkcyjne budujemy na stabilnej wersji, a decyzję o przejściu na v5 lub Uniwind podejmujemy po teście na konkretnych ekranach. Dzięki temu, że oba narzędzia używają tych samych klas, zmiana nie oznacza przepisywania interfejsu.

Kiedy NativeWind, a kiedy zostajemy przy StyleSheet

Technologię dobieramy do produktu, a nie odwrotnie. Tak samo podchodzimy do wyboru między React Native a Flutterem i do decyzji o stylowaniu. Poniżej zestawienie sytuacji, które spotykamy najczęściej.

 

SytuacjaNasz wybór
Firma ma stronę lub panel w Tailwind i buduje aplikację mobilnąNativeWind - wspólne tokeny i jeden sposób pisania stylów
Nowa aplikacja w Expo, zespół zna TailwindNativeWind 4 lub test Uniwind na pierwszych ekranach
Duża, działająca aplikacja z dopracowanym StyleSheetZostajemy, ewentualnie NativeWind tylko w nowych modułach
Interfejs oparty na grafice i animacjach, np. wykresy rysowane na płótnieStyl ma mniejsze znaczenie niż silnik rysowania, np. React Native Skia
Aplikacja wyłącznie na iOS lub Android pisana natywnieNativeWind nie dotyczy - tu pracuje się w Swift lub Kotlinie


Ostatni wiersz bywa pomijany. NativeWind działa tylko w React Native. Jeśli analiza wymagań wskazuje na aplikację natywną, dyskusja o Tailwind w telefonie się kończy. O tym, czy aplikacja będzie natywna, decydują te same kryteria co zawsze przy wyborze między aplikacjami natywnymi i hybrydowymi: budżet, wymagania wydajnościowe, dostęp do funkcji telefonu i plany rozwoju.

Przykład z praktyki: w projekcie SAO Life aplikacja mobilna w React Native i serwis w Next.js korzystają ze wspólnego backendu. W takim układzie naturalnym kolejnym krokiem jest wspólny słownik wyglądu, bo te same osoby rozwijają oba interfejsy. Właśnie w takich firmach NativeWind daje najwięcej.

FAQ

FAQ - Najczęściej zadawane pytania o NativeWind

  • Tak, NativeWind jest biblioteką open source na licencji MIT, więc można go bezpłatnie używać w aplikacjach komercyjnych, także w zamkniętym kodzie. Licencja nie wymaga publikowania własnego kodu ani opłat zależnych od liczby użytkowników czy pobrań aplikacji ze sklepów. Przykładowo firma może zbudować na nim płatną aplikację subskrypcyjną i nie płacić nic twórcom biblioteki. Realne koszty leżą gdzie indziej: w pracy zespołu przy konfiguracji i utrzymaniu, w aktualizacjach przy zmianie głównej wersji oraz ewentualnie w płatnych narzędziach towarzyszących, na przykład w wersji Pro konkurencyjnej biblioteki Uniwind, jeśli projekt jej potrzebuje.
  • Tak, NativeWind działa z Expo i to z nim konfiguracja jest najprostsza. Dokumentacja biblioteki podaje osobną ścieżkę instalacji dla Expo, a dokumentacja Expo sama wskazuje NativeWind jako jeden ze sposobów używania Tailwind CSS na iOS i Androidzie. W praktyce sprowadza się to do instalacji kilku paczek i dopisania ustawień w plikach konfiguracyjnych Babel i Metro, które składają kod aplikacji. NativeWind można też uruchomić w projekcie React Native bez Expo, ale wymaga to więcej ręcznej konfiguracji. To, ile czasu zajmie start, zależy głównie od wersji Expo i od tego, czy projekt jest nowy, czy już rozbudowany o inne biblioteki.
  • Tak, oba sposoby stylowania mogą działać równolegle w tym samym projekcie, a nawet w tym samym ekranie. NativeWind zamienia klasy Tailwind na zwykłe style React Native, więc dla aplikacji nie ma znaczenia, czy dany komponent opisano klasami, czy obiektem StyleSheet. Dzięki temu migrację prowadzi się stopniowo: na przykład nowe ekrany powstają już w NativeWind, a starsze są przepisywane dopiero wtedy, gdy i tak trzeba w nich coś zmienić. Przy takim podejściu warto ustalić w zespole jasną zasadę, który sposób obowiązuje w nowym kodzie, żeby po roku nie mieć w aplikacji przypadkowej mieszanki dwóch stylów.
  • Tak, NativeWind obsługuje tryb ciemny przez prefiks dark:, znany z Tailwind CSS na stronach internetowych. Programista dopisuje do elementu wariant ciemny obok jasnego, na przykład klasę bg-white dla jasnego tła i dark:bg-neutral-900 dla ciemnego, a biblioteka sama wybiera właściwy wariant według ustawień systemu w telefonie. Można też dodać w aplikacji ręczny przełącznik motywu, niezależny od systemu. Ile pracy to wymaga, zależy od przygotowania projektu graficznego: jeśli kolory w Figmie mają od początku zdefiniowane odpowiedniki dla obu trybów, wdrożenie jest szybkie, a jeśli ciemny wariant trzeba dopiero zaprojektować, większość czasu pochłonie praca projektanta, nie programisty.
  • Tak, stabilna wersja 4 (w październiku 2026 roku 4.2.7) jest używana w aplikacjach produkcyjnych, a paczka notuje ponad 2 mln pobrań tygodniowo w rejestrze npm. Zastrzeżenie dotyczy wersji 5, która ma status kandydata do wydania i według dokumentacji nie jest przeznaczona do użytku produkcyjnego. Dla aplikacji, która ma trafić do sklepów w najbliższych miesiącach, rozsądnym wyborem jest więc czwórka, z planem przejścia na piątkę po jej pełnym wydaniu. Przed decyzją warto sprawdzić, czy biblioteki komponentów planowane w projekcie, takie jak kalendarze, mapy czy wykresy, dobrze współpracują z klasami Tailwind, bo to one najczęściej wymagają dodatkowej pracy.
  • Tak, w dużej części, zwłaszcza w zakresie kolorów, typografii, odstępów i zaokrągleń. Te wartości definiuje się raz jako tokeny w konfiguracji Tailwind, a z tej samej konfiguracji korzysta zarówno strona w Next.js, jak i aplikacja w React Native. Klasa bg-primary oznacza wtedy ten sam kolor marki w przeglądarce i w telefonie, więc zmiana identyfikacji wizualnej wymaga poprawki w jednym miejscu. Nie da się natomiast przenieść jeden do jednego całych układów ekranów, bo telefon nie obsługuje CSS Grid, inaczej układa elementy domyślnie i ma inne wzorce nawigacji. Zakres współdzielenia zależy więc od tego, jak bardzo interfejsy webowy i mobilny są do siebie podobne z założenia.
  • Zwykle od kilku dni do kilku tygodni pracy jednego programisty, a w dużych aplikacjach migracja rozkłada się na kilka miesięcy normalnego rozwoju. Mała aplikacja z kilkunastoma ekranami i uporządkowanymi kolorami może zostać przepisana w tydzień lub dwa. Duży produkt z setką ekranów przepisuje się stopniowo, bo NativeWind i StyleSheet mogą działać obok siebie. Na czas najmocniej wpływają trzy rzeczy: liczba ekranów i komponentów, stopień uporządkowania obecnych stylów oraz liczba zewnętrznych bibliotek, które trzeba dostosować do klas Tailwind. Jeśli kolory i odstępy są wpisane ręcznie w wielu plikach, najwięcej czasu zajmie ich spisanie i zamiana na tokeny, a nie samo przepisywanie klas. Rzetelną wycenę daje dopiero przegląd kodu konkretnej aplikacji.
  • Tak, Uniwind jest projektowany jako zamiennik NativeWind i używa tego samego zapisu klas przez właściwość className. Rozwija go firma Codemask, autorzy biblioteki Unistyles, i od początku obsługuje Tailwind CSS 4. Wersja podstawowa jest darmowa na licencji MIT, a płatna wersja Pro przenosi część przetwarzania stylów do silnika w C++, co według producenta ogranicza liczbę ponownych renderowań. Autorzy publikują testy wydajności korzystne dla Uniwind, ale to pomiary dostawcy, więc przed zmianą warto porównać obie biblioteki na kilku najcięższych ekranach własnej aplikacji. Opłacalność zamiany zależy od tego, czy aplikacja ma realne problemy z płynnością i czy projekt potrzebuje już funkcji Tailwind 4.

Blog

Powiązane artykuły

Czytaj więcej
Front-end

Tailwind czy Bootstrap: jakiej technologii użyć w swoim projekcie?

Wybór technologii CSS do projektu webowego może być trudny. Tailwind i Bootstrap to jedne z najpopularniejszych narzędzi wykorzystywanych przez developerów. Oba mają swoje zalety, lecz również znaczne różnice, które mogą wpłynąć na efektywność prac. Które z nich wybrać do swojego projektu? O tym w naszym artykule.

Tomasz Kozon
29 sie 2023
Front-end

Zalety i wady CSS in JS

Artykuł porusza zagadnienie CSS in JS i analizuje zalety oraz wady stosowania tej technologii w projektach front-endowych.

Jan Rubel
31 maj 2023
Front-end

Panda CSS - czym jest i kiedy warto go użyć?

Panda CSS pozwala pisać style w TypeScripcie, a do przeglądarki wysyła zwykły, lekki CSS. Wyjaśniamy, jak działa, czym różni się od Tailwinda i styled-components, jakie pojęcia warto znać i w jakich projektach ma sens.

Tomasz Kozon
02 lip 2026
UX Research i badania

Ciemny tryb w projektowaniu stron i aplikacji: Kiedy go wprowadzić i podstawowe zasady jego implementacji

Ciemny tryb staje się coraz popularniejszą funkcją w projektowaniu stron i aplikacji mobilnych. Nie jest to jednak tylko efekciarska sztuczka projektantów - może poważnie wpłynąć na doświadczenia użytkowników. W tym artykule dowiemy się, kiedy warto wprowadzić ciemny tryb w naszym rozwiązaniu i jakie są podstawy jego skutecznego wdrożenia.

Tomasz Kozon
10 lis 2023