Kurs JavaScript i React · Moduł 1: Podstawy React

Historia i filozofia React

3 min czytania
W tej lekcji2

Nasza podróż z React zaczęła się w biurach Facebooka (obecnie Meta) w 2011 roku. Jordan Walke, inżynier pracujący dla firmy, stworzył wczesną wersję React, inspirując się funkcjonalnymi aspektami programowania i problemami, z jakimi borykali się deweloperzy przy tworzeniu złożonych interfejsów użytkownika.

Facebook początkowo używał React wewnętrznie do swojego News Feeda, ale prawdziwy przełom nastąpił w 2013 roku, gdy zdecydowali się udostępnić bibliotekę jako projekt open source. To był moment, gdy React rozpoczął swoją podróż do gwiazd, stając się jedną z najpopularniejszych bibliotek do tworzenia interfejsów użytkownika na świecie.

Filozofia React

Filozofia React opiera się na kilku rewolucyjnych koncepcjach:

  1. Deklaratywność - React pozwala opisać, jak interfejs powinien wyglądać w danym stanie, zamiast imperatywnie określać, jak go zmieniać. To jak różnica między mówieniem "narysuj mi gwiazdę z pięcioma ramionami" (deklaratywnie) a "narysuj linię pod kątem 72°, potem pod kątem 144°..." (imperatywnie).

  2. Komponentowość - Aplikacja jest zbudowana z niezależnych, wielokrotnego użytku komponentów, podobnie jak statek kosmiczny składa się z modułów, które można produkować, testować i ulepszać niezależnie. Każdy przycisk, panel, formularz może być osobnym komponentem, który łączy się z innymi, tworząc spójną całość.

  3. Jednokierunkowy przepływ danych - Dane płyną z góry na dół (od rodzica do dziecka), co ułatwia zrozumienie, jak dane przemieszczają się w aplikacji. Wyobraź sobie kaskadę - woda zawsze płynie z góry na dół, nigdy odwrotnie. Ta przewidywalność sprawia, że aplikacje są bardziej stabilne i łatwiejsze w debugowaniu.

  4. "Pomyśl o użytkowniku" - React zachęca do tworzenia interfejsów, które są intuicyjne i przyjazne dla użytkownika. To fundamentalna zmiana w porównaniu do wcześniejszych podejść, gdzie technologia często dyktowała doświadczenie użytkownika.

Historia rozwoju React

React przeszedł fascynującą ewolucję od czasu swojego pierwszego publicznego wydania:

2013: Pierwsze wydanie

  • Wprowadzenie koncepcji komponentowej architektury
  • Implementacja Virtual DOM
  • Początkowe wsparcie dla JSX

2015: React Native

  • Rozszerzenie filozofii React na aplikacje mobilne
  • Ta sama składnia i podobne koncepcje do tworzenia natywnych aplikacji mobilnych

2016: React 15

  • Znaczące usprawnienia w wydajności
  • Lepsze komunikaty błędów i ostrzeżeń

2017: React 16 (Fiber)

  • Całkowita przebudowa algorytmu reconciliation (uzgadniania)
  • Wprowadzenie fragmentów, portali i obsługi błędów
  • Lepsze wsparcie dla renderowania asynchronicznego

2019: React 16.8 (Hooks)

  • Rewolucyjna zmiana w zarządzaniu stanem i efektami ubocznymi
  • Umożliwienie używania stanu i innych funkcji React bez pisania klas
  • Znaczące uproszczenie kodu i logiki

2020-2022: React 17 i 18

  • Nowe przekształcenie JSX (React 17) - import React w plikach z JSX przestaje być potrzebny
  • Renderowanie współbieżne i createRoot (React 18)
  • Automatyczne grupowanie aktualizacji (batching)
  • Suspense także przy renderowaniu po stronie serwera

2024: React 19

  • Stabilne Server Components i Actions
  • Usunięcie przestarzałych API, m.in. ReactDOM.render

Ta ewolucja pokazuje, jak React konsekwentnie rozwijał się, aby sprostać wyzwaniom nowoczesnego tworzenia aplikacji internetowych, zawsze skupiając się na poprawie doświadczenia zarówno deweloperów, jak i użytkowników końcowych.

Kod do tej lekcji: App.jsx
1import React from 'react';
2
3// Timeline component do prezentacji historii React
4function TimelineEvent({ year, title, description, isImportant }) {
5  return (
6    <div style={{
7      display: 'flex',
8      marginBottom: '20px',
9      alignItems: 'flex-start'
10    }}>
11      <div style={{
12        minWidth: '80px',
13        textAlign: 'right',
14        marginRight: '20px'
15      }}>
16        <div style={{
17          backgroundColor: isImportant ? '#ff5722' : '#2196f3',
18          color: 'white',
19          padding: '5px 10px',
20          borderRadius: '15px',
21          fontSize: '14px',
22          fontWeight: 'bold'
23        }}>
24          {year}
25        </div>
26      </div>
27      <div style={{
28        flex: 1,
29        padding: '15px',
30        backgroundColor: isImportant ? '#fff3e0' : '#e3f2fd',
31        borderRadius: '8px',
32        borderLeft: `4px solid ${isImportant ? '#ff5722' : '#2196f3'}`
33      }}>
34        <h3 style={{
35          margin: '0 0 10px 0',
36          color: isImportant ? '#e65100' : '#1565c0'
37        }}>
38          {title}
39        </h3>
40        <p style={{ margin: 0, lineHeight: '1.5' }}>
41          {description}
42        </p>
43      </div>
44    </div>
45  );
46}
47
48// Komponent do prezentacji filozofii React
49function PhilosophyCard({ icon, title, description }) {
50  return (
51    <div style={{
52      backgroundColor: '#f8f9fa',
53      border: '1px solid #dee2e6',
54      borderRadius: '8px',
55      padding: '20px',
56      textAlign: 'center',
57      transition: 'transform 0.2s',
58      cursor: 'pointer'
59    }}
60    onMouseEnter={(e) => e.target.style.transform = 'translateY(-5px)'}
61    onMouseLeave={(e) => e.target.style.transform = 'translateY(0)'}
62    >
63      <div style={{ fontSize: '48px', marginBottom: '15px' }}>{icon}</div>
64      <h3 style={{ color: '#343a40', marginBottom: '10px' }}>{title}</h3>
65      <p style={{ color: '#6c757d', lineHeight: '1.5' }}>{description}</p>
66    </div>
67  );
68}
69
70// Interaktywny komponent demonstrujący deklaratywność
71function DeclarativeExample() {
72  const [isVisible, setIsVisible] = React.useState(true);
73  const [items, setItems] = React.useState(['Element 1', 'Element 2', 'Element 3']);
74
75  const addItem = () => {
76    const newItem = `Element ${items.length + 1}`;
77    setItems([...items, newItem]);
78  };
79
80  const removeItem = () => {
81    setItems(items.slice(0, -1));
82  };
83
84  return (
85    <div style={{
86      backgroundColor: '#e8f5e8',
87      padding: '20px',
88      borderRadius: '8px',
89      margin: '20px 0'
90    }}>
91      <h3 style={{ color: '#2e7d32' }}>Deklaratywny React w Akcji</h3>
92
93      <div style={{ marginBottom: '20px' }}>
94        <button
95          onClick={() => setIsVisible(!isVisible)}
96          style={{
97            padding: '10px 15px',
98            margin: '5px',
99            backgroundColor: '#4caf50',
100            color: 'white',
101            border: 'none',
102            borderRadius: '4px',
103            cursor: 'pointer'
104          }}
105        >
106          {isVisible ? 'Ukryj' : 'Pokaż'} Listę
107        </button>
108
109        <button
110          onClick={addItem}
111          style={{
112            padding: '10px 15px',
113            margin: '5px',
114            backgroundColor: '#2196f3',
115            color: 'white',
116            border: 'none',
117            borderRadius: '4px',
118            cursor: 'pointer'
119          }}
120        >
121          Dodaj Element
122        </button>
123
124        <button
125          onClick={removeItem}
126          disabled={items.length === 0}
127          style={{
128            padding: '10px 15px',
129            margin: '5px',
130            backgroundColor: items.length === 0 ? '#ccc' : '#f44336',
131            color: 'white',
132            border: 'none',
133            borderRadius: '4px',
134            cursor: items.length === 0 ? 'not-allowed' : 'pointer'
135          }}
136        >
137          Usuń Element
138        </button>
139      </div>
140
141      {isVisible && (
142        <ul style={{
143          backgroundColor: 'white',
144          padding: '15px',
145          borderRadius: '4px',
146          listStyle: 'none'
147        }}>
148          {items.map((item, index) => (
149            <li key={index} style={{
150              padding: '8px',
151              margin: '5px 0',
152              backgroundColor: '#f0f0f0',
153              borderRadius: '4px'
154            }}>
155              {item}
156            </li>
157          ))}
158          {items.length === 0 && (
159            <li style={{
160              padding: '20px',
161              textAlign: 'center',
162              color: '#666',
163              fontStyle: 'italic'
164            }}>
165              Lista jest pusta
166            </li>
167          )}
168        </ul>
169      )}
170
171      <p style={{
172        marginTop: '15px',
173        fontSize: '14px',
174        color: '#666',
175        fontStyle: 'italic'
176      }}>
177        Zauważ jak deklaratywnie opisujemy UI: "jeśli isVisible jest true, pokaż listę"
178      </p>
179    </div>
180  );
181}
182
183export default function App() {
184  return (
185    <div style={{
186      fontFamily: 'Arial, sans-serif',
187      maxWidth: '900px',
188      margin: '0 auto',
189      padding: '20px'
190    }}>
191      <header style={{
192        textAlign: 'center',
193        marginBottom: '40px',
194        padding: '30px',
195        background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
196        color: 'white',
197        borderRadius: '12px'
198      }}>
199        <h1 style={{ margin: '0 0 10px 0', fontSize: '2.5rem' }}>Historia React</h1>
200        <p style={{ margin: 0, fontSize: '1.1rem', opacity: 0.9 }}>
201          Podróż przez ewolucję najpopularniejszej biblioteki JavaScript
202        </p>
203      </header>
204
205      <section style={{ marginBottom: '40px' }}>
206        <h2 style={{ color: '#333', borderBottom: '2px solid #667eea', paddingBottom: '10px' }}>
207          Kluczowe Momenty w Historii React
208        </h2>
209
210        <TimelineEvent
211          year="2011"
212          title="Narodziny FaxJS"
213          description="Jordan Walke w Facebook tworzy wczesną wersję React (wtedy nazywaną FaxJS) inspirowaną XHP - systemem komponentów PHP."
214        />
215
216        <TimelineEvent
217          year="2013"
218          title="React staje się open source!"
219          description="Facebook udostępnia React jako projekt open source. Tom Occhino i Jordan Walke prezentują go na JSConf US."
220          isImportant={true}
221        />
222
223        <TimelineEvent
224          year="2015"
225          title="React Native"
226          description="Facebook przedstawia React Native, pozwalając deweloperom używać React do tworzenia natywnych aplikacji mobilnych."
227          isImportant={true}
228        />
229
230        <TimelineEvent
231          year="2017"
232          title="React Fiber"
233          description="Całkowite przepisanie jądra Reacta (React 16) wprowadzające nową architekturę reconciliation o nazwie Fiber."
234          isImportant={true}
235        />
236
237        <TimelineEvent
238          year="2019"
239          title="React Hooks"
240          description="React 16.8 wprowadza Hooks, rewolucjonizując sposób pisania komponentów React i zarządzania stanem."
241          isImportant={true}
242        />
243
244        <TimelineEvent
245          year="2022"
246          title="React 18"
247          description="Renderowanie współbieżne, automatyczne grupowanie aktualizacji, ulepszenia Suspense i nowe hooki."
248        />
249
250        <TimelineEvent
251          year="2024"
252          title="React 19"
253          description="Stabilne Server Components i Actions; usunięcie przestarzałych API, m.in. ReactDOM.render."
254          isImportant={true}
255        />
256      </section>
257
258      <section style={{ marginBottom: '40px' }}>
259        <h2 style={{ color: '#333', borderBottom: '2px solid #667eea', paddingBottom: '10px' }}>
260          Filozofia React
261        </h2>
262
263        <div style={{
264          display: 'grid',
265          gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))',
266          gap: '20px',
267          margin: '20px 0'
268        }}>
269          <PhilosophyCard
270            icon=""
271            title="Deklaratywność"
272            description="Opisujesz JAK ma wyglądać UI w danym stanie, a nie JAKIE kroki podjąć, aby go osiągnąć."
273          />
274
275          <PhilosophyCard
276            icon=""
277            title="Komponentowość"
278            description="Aplikacja składa się z niezależnych, wielokrotnego użytku komponentów, które można komponować."
279          />
280
281          <PhilosophyCard
282            icon=""
283            title="Jednokierunkowy Przepływ"
284            description="Dane płyną z góry na dół, co czyni aplikację przewidywalną i łatwą do debugowania."
285          />
286
287          <PhilosophyCard
288            icon=""
289            title="Learn Once, Write Anywhere"
290            description="Te same koncepcje działają na web, mobile (React Native) i desktop."
291          />
292        </div>
293      </section>
294
295      <DeclarativeExample />
296
297      <footer style={{
298        backgroundColor: '#f8f9fa',
299        padding: '20px',
300        borderRadius: '8px',
301        textAlign: 'center',
302        marginTop: '40px'
303      }}>
304        <h3 style={{ color: '#495057' }}>React Dzisiaj</h3>
305        <p style={{ color: '#6c757d', lineHeight: '1.6' }}>
306          React jest używany przez miliony deweloperów na całym świecie w firmach takich jak
307          Facebook, Netflix, Airbnb, Uber, WhatsApp, Instagram i tysiącach innych.
308          Jego ekosystem obejmuje tysiące bibliotek i narzędzi, czyniąc go jedną z
309          najpotężniejszych platform do tworzenia nowoczesnych aplikacji internetowych.
310        </p>
311      </footer>
312    </div>
313  );
314}

Przydatne artykuły