StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • Audyt SEO i Performance
  • Testy automatyczne i QA
  • Konsultacje Produktowe
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
ReactWydajność

React Compiler w 2026 — czy useMemo i useCallback są już martwe?

React Compiler jest stabilny — ale czy naprawdę możesz teraz usunąć wszystkie useMemo i useCallback? Kiedy Compiler wyręcza Cię, a kiedy nie.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
24 kwietnia 2026 00:00
Czytanie
8 min czytania
Aktualizacja
31 maja 2026 08:00

React Compiler odsyła do lamusa jedną z najczęstszych irytacji codziennej pracy z Reactem — ręczne owijanie funkcji i wartości w useMemo oraz useCallback. W dużych aplikacjach dbanie o memoizację pochłaniało godziny, a w małych projektach często dokładano ją na siłę, w złudnej pogoni za „wydajnością". Od kiedy Compiler jest stabilny, ten rytuał w większości przypadków przestał być potrzebny — ale nie zniknął całkowicie i warto wiedzieć, kiedy nadal ma znaczenie.

Artykuł w skrócie

  • Koniec ery ręcznej memoizacji — useMemo, useCallback i React.memo w większości przypadków zastępuje React Compiler, stabilny (v1.0) od października 2025.
  • Compiler działa tylko na poprawnym kodzie — jeśli komponent łamie Rules of React, narzędzie go pomija i zostawia ostrzeżenie, zamiast optymalizować błędnie.
  • Ręczną memoizację zostaw dla przypadków brzegowych — integracje z zewnętrznymi API, stabilne referencje dla SDK i naprawdę kosztowne obliczenia.
  • Compiler to nie panaceum — nie naprawi złych algorytmów, braku wirtualizacji długich list ani wodospadów zapytań; optymalizuje render, nie architekturę.
  • Wdrażaj stopniowo — najpierw linter, potem tryb annotation na wybranych komponentach, na końcu globalny infer; nie usuwaj starego useMemo masowo bez testów.
  • W Next.js 16 to już nie eksperyment — reactCompiler: true w konfiguracji, ale świadomie, bo wydłuża build.

React Compiler analizuje komponenty podczas buildu i dodaje optymalizacje memoizacji bez ręcznego useMemo lub useCallback w większości przypadków. osiągnął stabilną wersję 1.0 w październiku 2025 roku, po okresie testów na produkcyjnych aplikacjach Meta. To moment, w którym dyskusja „czy warto" zamieniła się w „jak wdrożyć". W tym artykule wyjaśniam, na czym polega ta zmiana, dlaczego część dawnych chwytów memoizacyjnych wciąż warto trzymać pod ręką i jak bezpiecznie włączyć Compiler w działającym projekcie.

Krótki skrót praktyczny: w zdecydowanej większości codziennych przypadków useMemo jest dziś zbędne. W nowym projekcie na Next.js po prostu włączasz reactCompiler: true i piszesz czysty kod. W starszym, działającym serwisie idziesz ostrożniej — najpierw linter wyłapuje złe nawyki, potem tryb annotation pozwala na próby na wybranych komponentach, a na końcu globalny infer z codemodem sprzątającym po drodze.

Uwaga

Compiler nie jest magiczną różdżką. Nie uratuje aplikacji, która wolno działa z powodu źle zaprojektowanych algorytmów, braku streamingu, nieobsłużonej wirtualizacji długich list albo nieefektywnego pobierania danych. Optymalizuje wyłącznie warstwę renderowania — dopasowanie tego, co React przelicza i przerysowuje. Reszta zależy od architektury, której żaden kompilator nie naprawi.

Na czym polega ta zmiana

Compiler działa na etapie buildu. Analizuje Twoje komponenty i automatycznie wstawia memoizację wszędzie tam, gdzie skróci to czas renderowania. Ty piszesz zwykły, czysty kod — bez żadnej dyrektywy w stylu 'use compiled', bez ręcznego oznaczania. Standardowa architektura React zostaje, a narzędzie podczas kompilacji robi resztę.

Najlepiej widać to na przykładzie. Tak wygląda Twój kod:

Code
// Piszesz zwykły, czysty komponent
function Component({ items, onClick }) {
  const sorted = [...items].sort((a, b) => a.price - b.price)
  const handler = () => onClick(sorted[0])
 
  return (
    <Button onClick={handler}>
      Najtańsza opcja: {sorted[0].name}
    </Button>
  )
}

A tak — w uproszczeniu — Compiler przekształca go podczas buildu:

Code
// Compiler generuje z tego (poglądowy zarys mechanizmu):
function Component({ items, onClick }) {
  const cache = useMemoCache()
 
  let sorted
  // Compiler sam sprawdza, co się zmieniło, i przelicza tylko wtedy, gdy trzeba
  if (items !== cache[0]) {
    sorted = [...items].sort((a, b) => a.price - b.price)
    cache[0] = items
    cache[1] = sorted
  } else {
    sorted = cache[1]
  }
 
  let handler
  if (sorted !== cache[2] || onClick !== cache[3]) {
    handler = () => onClick(sorted[0])
    cache[2] = sorted
    cache[3] = onClick
    cache[4] = handler
  } else {
    handler = cache[4]
  }
 
  // ...render
}

Cała praca, którą wcześniej wykonywałeś ręcznie przez useMemo i useCallback, dzieje się teraz automatycznie — przy każdej zależnej wartości, bez dopisywania ani jednej dyrektywy.

Czy useMemo odeszło na emeryturę?

W praktyce: w zdecydowanej większości przypadków już go nie dodajesz. Compiler przejmuje memoizację, którą wcześniej trzeba było pisać z palca:

  • Nie owijasz już przeliczeń w renderze (const total = useMemo(() => items.reduce(...), [items])).
  • Nie stabilizujesz ręcznie funkcji przekazywanych w głąb drzewa (const onClick = useCallback(() => {...}, [])).
  • Nie blokujesz zbędnych renderów komponentów przez React.memo().
  • Nie martwisz się, że przekazanie nowej referencji do komponentu z zewnętrznej biblioteki wymusi jego ponowny render.

W projektach, które przepisywałem na Compiler, usunięcie tej warstwy ręcznej memoizacji nie pogorszyło niczego od strony użytkownika — kod stał się czytelniejszy, a zachowanie pozostało identyczne.

Są jednak sytuacje, w których Compiler potrzebuje pomocy, bo nie ma pełnego wglądu w to, co robisz:

  1. Integracje z systemami spoza Reacta. Gdy podłączasz addEventListener, IntersectionObserver albo zewnętrzne SDK, te API wymagają stabilnej referencji funkcji, której Compiler nie zawsze zagwarantuje. Tutaj świadomie sięgasz po useCallback, żeby cleanup działał poprawnie.

  2. Zależności useEffect oparte na zewnętrznych danych. Jeśli efekt zależy od wartości pochodzącej spoza Reacta, sam zadbaj o stabilność referencji w tablicy zależności, żeby nie odpalał się częściej, niż powinien.

  3. Własne hooki ze złożoną logiką. Compiler radzi sobie z większością przypadków, ale przy nietypowych własnych hookach warto zweryfikować zachowanie testami, zanim mu w pełni zaufasz.

  4. Celowe ponowne renderowanie. Jeśli komponent ma się odświeżać świadomie (np. zegar tykający co sekundę), oznacz go dyrektywą 'use no memo' na początku funkcji — Compiler go wtedy pominie.

Gdzie Compiler realnie daje zysk

Postawmy sprawę uczciwie: Compiler nie wskrzesi zapuszczonej aplikacji. Przy małym, lekkim projekcie różnica w wydajności jest kosmetyczna i niewidoczna w pomiarach. Realny zysk pojawia się tam, gdzie jest dużo komponentów, częste aktualizacje stanu i złożone drzewa renderowania.

Z moich wdrożeń, m.in. dla StriveLab oraz aplikacji Army Builder (rozbudowany konfigurator operujący na setkach modeli i tysiącach rekordów):

  • Proste wizytówki na kilkanaście komponentów — różnica praktycznie niemierzalna. Strona działała dobrze i bez Compilera; zysk to przede wszystkim wygoda pisania, nie wydajność.
  • Dashboardy z wyszukiwarką i listami na setki pozycji — tutaj widać już realne odciążenie renderowania, na poziomie porównywalnym z ręczną, staranną memoizacją.
  • Ciężkie konfiguratory z głęboko zagnieżdżonymi strukturami (jak edycja modeli w Army Builderze) — zauważalny spadek czasu blokowania głównego wątku przy interakcjach, przy zerowym nakładzie pracy nad ręczną memoizacją.

Wniosek jest prosty: dla projektów marketingowych Compiler to przede wszystkim komfort i mniej kodu do utrzymania. Dla aplikacji z dużym ruchem i intensywnymi interakcjami — realna oszczędność milisekund, które przekładają się na płynność i konwersję.

Jak wdrożyć Compiler

Compiler instaluje się jako plugin Babela, niezależnie od bundlera (Vite, Next.js):

Code
npm install --save-dev --save-exact babel-plugin-react-compiler@latest

Vite + React

Code
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
 
const ReactCompilerConfig = {
  target: '19', // dostosuj do wersji React w projekcie
}
 
export default defineConfig({
  plugins: [
    react({
      babel: {
        plugins: [['babel-plugin-react-compiler', ReactCompilerConfig]],
      },
    }),
  ],
})

Next.js

W Next.js 15 funkcja jest jeszcze za flagą eksperymentalną:

Code
// next.config.js (Next.js 15)
module.exports = {
  experimental: {
    reactCompiler: true,
  },
}

W Next.js 16 straciła status eksperymentalny i przeniosła się na główny poziom konfiguracji:

Code
// next.config.js (Next.js 16)
module.exports = {
  reactCompiler: true,
}

W żadnej wersji nie jest włączona domyślnie — musisz to zrobić świadomie, bo Compiler wydłuża czas builda (korzysta z Babela). Zanim ją włączysz, przepuść kod przez linter, żeby wyłapać naruszenia Zasad Reacta.

Bezpieczna migracja starszego projektu

W istniejącej aplikacji nie włączaj Compilera globalnie jednym przełącznikiem. Potraktuj to jak wdrożenie nowej funkcji — etapami.

Krok 1: Zabezpiecz się linterem

Code
npm install --save-dev eslint-plugin-react-hooks@latest
Code
// eslint.config.js
import reactHooks from 'eslint-plugin-react-hooks'
 
export default [reactHooks.configs.flat.recommended]

Linter wskaże naruszenia Zasad Reacta — mutacje propsów, warunkowe hooki, efekty uboczne w renderze — zanim w ogóle dotkniesz Compilera. To miejsca, które i tak musisz naprawić, bo Compiler je pominie.

Krok 2: Tryb opt-in (annotation)

Na początek włącz Compiler tylko tam, gdzie świadomie go oznaczysz dyrektywą 'use memo':

Code
const ReactCompilerConfig = {
  compilationMode: 'annotation',
}
Code
function Dashboard() {
  'use memo'
 
  // Tylko ten komponent zostanie zoptymalizowany przez Compiler
}

Dzięki temu testujesz nową optymalizację na pojedynczych, dobrze przetestowanych komponentach, zamiast od razu na całym repozytorium.

Krok 3: Tryb globalny (infer)

Gdy najważniejsze komponenty (koszyk, panele użytkownika, checkout) przeszły testy, włącz Compiler globalnie:

Code
const ReactCompilerConfig = {
  compilationMode: 'infer', // tryb domyślny
}

Od tej chwili każdy poprawny komponent jest optymalizowany automatycznie. Komponent, który łamie Zasady Reacta, zostanie pominięty, a w konsoli pojawi się stosowne ostrzeżenie.

Zasady bezpiecznego wdrożenia

  • Przypinaj wersję pluginu Babela na sztywno (--save-exact), nie polegaj na „latest" na produkcji.
  • Najpierw posprzątaj kod linterem, dopiero potem włączaj Compiler.
  • Migruj starsze projekty przez annotation, a globalny infer zostaw na koniec.
  • Przetestuj krytyczne ścieżki E2E — logowanie, płatności, koszyk, formularze — przed wypuszczeniem na produkcję.
  • Nie usuwaj starego useMemo masowo z automatu. Usuwaj stopniowo, sprawdzając pomiary, i uważaj na stabilne referencje potrzebne dla zewnętrznych SDK.

Krok 4: Sprzątanie ręcznej memoizacji

Na końcu, gdy Compiler działa stabilnie, możesz usunąć zbędną ręczną memoizację codemodem:

Code
npx codemod react/19/remove-memoization
Uwaga

Codemod nie jest narzędziem 1:1. Usuwa useMemo i useCallback, ale potrafi też wyrzucić stabilne referencje, które były potrzebne dla zewnętrznych narzędzi — addEventListener, IntersectionObserver, integracji z bibliotekami spoza Reacta. Po jego użyciu zweryfikuj te miejsca ręcznie i przejdź testy E2E, zanim wdrożysz zmiany na produkcję.

W moim wdrożeniu dla Army Buildera codemod usunął bezpiecznie około 350 z 400 ręcznych wywołań useMemo/useCallback, które istniały wyłącznie po to, by ratować render. Pozostałe ~20 — związane z IntersectionObserver i requestIdleCallback — zostawiłem ręcznie, bo to właśnie te przypadki brzegowe, gdzie stabilna referencja jest niezbędna.

Zasady Reacta, na których stoi Compiler

Compiler robi swoje, dopóki Twój kod trzyma się Zasad Reacta (Rules of React). To nie kaprys — to warunek, bez którego automatyczna memoizacja byłaby niebezpieczna. Trzy najczęstsze naruszenia:

1. Nie mutuj stanu ani propsów.

Code
// Źle — mutacja tablicy przekazanej w propsach
function List({ items }) {
  items.sort((a, b) => a.price - b.price); // mutuje oryginał!
  return <ul>{items.map(...)}</ul>;
}
 
// Dobrze — pracuj na kopii
function List({ items }) {
  const sorted = [...items].sort((a, b) => a.price - b.price);
  return <ul>{sorted.map(...)}</ul>;
}

2. Nie wykonuj efektów ubocznych w renderze.

Code
// Źle — efekt uboczny w funkcji renderującej
function Component() {
  document.title = 'Nowy tytuł' // mutacja poza renderem
  return <div />
}
 
// Dobrze — efekt w useEffect
function Component() {
  useEffect(() => {
    document.title = 'Nowy tytuł'
  }, [])
  return <div />
}

3. Nie wywołuj hooków warunkowo.

Code
// Źle — hook pod warunkiem
function Component({ shouldFetch }) {
  if (shouldFetch) {
    const data = useFetch('...')
  }
}
 
// Dobrze — warunek wewnątrz hooka
function Component({ shouldFetch }) {
  const data = useFetch(shouldFetch ? '...' : null)
}

eslint-plugin-react-hooks wykrywa praktycznie wszystkie te naruszenia automatycznie — dlatego linter to pierwszy krok każdej migracji.

Czego Compiler nie naprawi

Łatwo wpaść w pułapkę myślenia, że Compiler to lekarstwo na każdy problem z wydajnością. Nie jest. Optymalizuje render, a nie architekturę — i są klasy problemów, których nie tknie:

  • Złe algorytmy (np. O(n²)). Jeśli komponent wykonuje kosztowną pętlę w pętli, Compiler zapamięta wynik, ale nie poprawi samej złożoności obliczeniowej.
  • Długie listy bez wirtualizacji. Renderowanie 10 tysięcy elementów DOM naraz pozostanie wolne — to zadanie dla wirtualizacji list z TanStack Virtual, nie dla Compilera.
  • Zbyt duży bundle. Compiler nie zmniejszy wagi paczki — od tego jest Tree shaking to usuwanie nieużywanego kodu podczas budowania — bundler zostawia tylko te funkcje, które faktycznie importujesz. Działa najlepiej z importami nazwanymi z modułów ESM; zawodzi przy imporcie całego pakietu albo przy bibliotekach w formacie CommonJS. i analiza bundla.
  • Wodospady zapytań i problem N+1. Kaskadowe, nieefektywne pobieranie danych naprawia się warstwą cache i odpowiednim fetchingiem — np. TanStack Query, nie kompilatorem.

Compiler przyspiesza Reconciliation to proces Reacta porównujący poprzednie i nowe drzewo komponentów, aby wyznaczyć minimalne zmiany w UI. — proces dopasowania renderu — a nie leczy źle zaprojektowanej logiki aplikacji. To ważne narzędzie w skrzynce inżyniera, ale nie srebrna kula na złą architekturę.

Gdzie Compiler bywa kłopotliwy

Choć w większości projektów działa bezproblemowo, są sytuacje, w których trzeba uważać:

1. Zapuszczony, stary kod łamiący Zasady Reacta. Tam, gdzie kod opiera się na mutacjach propsów i niestabilnych referencjach, Compiler wycofuje się dla bezpieczeństwa i nie przyspiesza nic. Najpierw posprzątaj kod (linter pokaże gdzie), potem myśl o optymalizacji.

2. Założenia o leniwej ewaluacji. Compiler zmienia moment przeliczania wartości. Jeśli Twój kod opierał się na tym, że ciężkie obliczenie wykona się leniwie dopiero pod warunkiem if, zweryfikuj to zachowanie po włączeniu memoizacji.

3. Starsze wersje TypeScriptu. Typowanie generowane przez Compiler może sprawiać problemy na TS sprzed 5.4. Zaktualizuj TypeScript do 5.4 lub nowszego, a problemy z typami znikają.

4. Integracje przez HOC ze starszymi bibliotekami. Wzorce oparte na HOC (np. starszy Redux czy MobX) bywają trudniejsze dla Compilera. Tam, gdzie to możliwe, przejdź na nowocześniejsze, oparte na hookach API tych bibliotek.

Werdykt Labu

React Compiler w 2026 roku jest stabilny, sprawdzony w produkcji i realnie odsyła ręczną memoizację do lamusa — w większości przypadków useMemo, useCallback i React.memo przestają być potrzebne. Ale to nie znaczy, że znikają całkowicie: zostają jako escape hatch dla integracji z zewnętrznymi narzędziami i naprawdę kosztownych obliczeń. Najważniejszy warunek działania to trzymanie się Zasad Reacta — Compiler pominie kod, który je łamie, więc linter jest pierwszym, nie ostatnim krokiem.

Druga kluczowa rzecz: Compiler optymalizuje render, nie architekturę. Nie naprawi złych algorytmów, braku wirtualizacji ani wodospadów zapytań — to wciąż Twoja robota. W nowym projekcie włączasz go od razu i piszesz czysty kod; w istniejącym migrujesz etapami — linter, tryb annotation, globalny infer, na końcu ostrożny codemod z testami E2E.

Audyt techniczny i optymalizacja pod kątem SEO i GEO.
SEO & Performance
  • Na czym polega ta zmiana1 min
  • Czy useMemo odeszło na emeryturę?1 min
  • Gdzie Compiler realnie daje zysk1 min
  • Jak wdrożyć Compiler1 min
  • Bezpieczna migracja starszego projektu2 min
  • Zasady Reacta, na których stoi Compiler1 min
  • Czego Compiler nie naprawi1 min
  • Gdzie Compiler bywa kłopotliwy1 min
  • Werdykt Labu1 min

Często zadawane pytania

ŹródłaZweryfikowano: 31 maja 2026

Oficjalna dokumentacja React i materiały o React Compiler zweryfikowane podczas redakcji artykułu.

  • React — React Compiler v1.0 (07.10.2025)
  • React — React Compiler (dokumentacja)
  • React — Rules of React
  • Next.js — React Compiler

Seria

React w praktyce 2026
Część 2 / 4
  1. 1React 19 Actions — formularz bez onSubmit, useOptimistic i useActionState w praktyce
  2. React Compiler w 2026 — czy useMemo i useCallback są już martwe?
  3. 3React Query (TanStack) vs SWR vs useEffect — kompletny przewodnik po fetchingu w 2026
  4. 4TypeScript w React bez bólu — 7 wzorców, które realnie robią różnicę
Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Next.js 15 — co nowego i czy warto migrować z 14?
Next.js 15 — co nowego i czy warto migrować z 14?

Next.js 15 zmienia model cache i dodaje async params — migracja z 14 nie jest tylko aktualizacją. Co naprawdę się zmienia i czy warto?

Maciej Sala

Maciej Sala

Founder Strivelab

10 kwietnia 2026
React Query (TanStack) vs SWR vs useEffect — kompletny przewodnik po fetchingu w 2026
React Query (TanStack) vs SWR vs useEffect — kompletny przewodnik po fetchingu w 2026

TanStack Query, SWR czy useEffect — które wybrać w 2026? I kiedy Server Components sprawiają, że to pytanie w ogóle nie ma sensu?

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Dlaczego doświadczeni programiści porzucają React na rzecz czystego JS i HTMX
Dlaczego doświadczeni programiści porzucają React na rzecz czystego JS i HTMX

Doświadczeni programiści rezygnują z React — nie z frustracji, ale z powodów technicznych. Kiedy vanilla JS i HTMX to odpowiedź, a kiedy nie?

Maciej Sala

Maciej Sala

Founder Strivelab

4 sierpnia 2025
Poprzedni wpisReact Query (TanStack) vs SWR vs useEffect — kompletny przewodnik po fetchingu w 2026TanStack Query, SWR czy useEffect — które wybrać w 2026? I kiedy Server Components sprawiają, że to pytanie w ogóle nie ma sensu?
Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Następny wpisReact 19 Actions — formularz bez onSubmit, useOptimistic i useActionState w praktyceKoniec z onSubmit i ręcznym stanem ładowania — React 19 Actions przepisują formularze od fundamentów. Migracja bez bólu głowy.
Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026