Kurs JavaScript i React · Moduł 8: Zaawansowane wzorce React
Budowanie aplikacji produkcyjnej i Deployment na Vercel
W tej lekcji8
Nasza kosmiczna podróż przez React dobiega końca. Zbudowaliśmy nasz statek kosmiczny, testowaliśmy go, optymalizowaliśmy - teraz nadszedł czas, aby wypuścić go w przestrzeń międzygwiezdną. W tym module nauczysz się, jak przygotować swoją aplikację React do produkcji i wdrożyć ją na platformie Vercel, aby była dostępna dla użytkowników z całego świata.
Od kodu do produkcji - przygotowanie aplikacji
Proces przeniesienia aplikacji React ze środowiska deweloperskiego do produkcyjnego wymaga kilku ważnych kroków. Zanim wyślemy naszą aplikację w kosmos (internet), musimy ją odpowiednio przygotować.
Znaczenie budowania produkcyjnego
Kod, który piszemy podczas developmentu, nie jest optymalny do uruchomienia w przeglądarce użytkownika. Aplikacja produkcyjna powinna być:
- Zminimalizowana - usunięte białe znaki, komentarze i skrócone nazwy zmiennych
- Zoptymalizowana - łączenie wielu plików, usuwanie nieużywanego kodu (tree shaking)
- Skompresowana - mniejszy rozmiar do przesłania przez sieć
- Stabilna - pozbawiona komunikatów debugowania i narzędzi deweloperskich
Vite jako nowoczesne narzędzie do budowania aplikacji
Vite (francuski: "szybki") to nowoczesne narzędzie do budowania aplikacji frontendowych, które znacząco przyspiesza proces developmentu i produkcji. W przeciwieństwie do starszych narzędzi (jak Create React App), Vite wykorzystuje natywne moduły ES w przeglądarce podczas developmentu oraz Rollup do budowania produkcyjnego.
Główne zalety Vite:
- Błyskawiczny start serwera deweloperskiego
- Szybkie odświeżanie (Hot Module Replacement)
- Wydajne budowanie produkcyjne
- Wsparcie dla TypeScript, JSX, CSS, SCSS, Less i innych
- Minimalna konfiguracja przy jednoczesnej elastyczności
Proces budowania aplikacji produkcyjnej z Vite
1. Przygotowanie aplikacji do budowania
Przed budowaniem aplikacji produkcyjnej warto wykonać kilka kroków:
Sprawdzenie zależności
Upewnij się, że wszystkie zależności są aktualne i bezpieczne:
1# Sprawdzenie przestarzałych pakietów
2npm outdated
3
4# Sprawdzenie pod kątem podatności bezpieczeństwa
5npm audit
6
7# Aktualizacja pakietów (jeśli to bezpieczne)
8npm updateUsunięcie konsol i debuggerów
W kodzie produkcyjnym nie powinny znajdować się instrukcje console.log czy debugger. Możesz użyć pluginu do Babel lub ESLint, aby je automatycznie usunąć.
Dla Vite, możesz dodać plugin vite-plugin-remove-console:
1npm install vite-plugin-remove-console --save-devI skonfigurować go w vite.config.js:
1import { defineConfig } from 'vite';
2import react from '@vitejs/plugin-react';
3import removeConsole from 'vite-plugin-remove-console';
4
5export default defineConfig({
6 plugins: [
7 react(),
8 removeConsole()
9 ],
10});Ustawienie zmiennych środowiskowych
Vite obsługuje zmienne środowiskowe poprzez pliki .env. Możesz tworzyć różne pliki dla różnych środowisk:
.env- zmienne dla wszystkich środowisk.env.development- tylko dla developmentu.env.production- tylko dla produkcji
Zmienne muszą zaczynać się od prefiksu VITE_, aby były dostępne w kodzie:
1# .env.production
2VITE_API_URL=https://api.yourdomain.com/v1
3VITE_ANALYTICS_ID=UA-123456789-1W kodzie używasz ich tak:
1const apiUrl = import.meta.env.VITE_API_URL;2. Budowanie aplikacji produkcyjnej
Budowanie produkcyjne w Vite jest proste - wystarczy uruchomić komendę:
1npm run buildTa komenda wykonuje kilka operacji:
- Transpiluje kod ES6+/TypeScript/JSX do formatu obsługiwanego przez przeglądarki
- Minimalizuje kod JavaScript i CSS
- Optymalizuje zasoby (obrazy, fonty)
- Generuje haszowane nazwy plików dla cache busting
- Tworzy bundle zoptymalizowany pod kątem produkcji
Wynikiem jest katalog dist (domyślnie) zawierający zbudowaną aplikację.
3. Testowanie buildu produkcyjnego lokalnie
Przed deploymentem warto sprawdzić, czy zbudowana aplikacja działa poprawnie. Vite dostarcza proste narzędzie do lokalnego serwowania buildu produkcyjnego:
1npm run previewTa komenda uruchomi lokalny serwer serwujący zbudowaną aplikację z katalogu dist, pozwalając na sprawdzenie jej działania przed faktycznym wdrożeniem.
Deployment na Vercel
Vercel to platforma do deploymentu aplikacji frontendowych, która doskonale współpracuje z React, Next.js i innymi frameworkami. Oferuje globalną CDN, automatyczne deployments z repozytorium Git, HTTPS, oraz wiele innych funkcji.
Dlaczego Vercel?
- Zero-config - automatyczne wykrywanie frameworka i konfiguracja
- Globalna CDN - szybkie dostarczanie treści użytkownikom na całym świecie
- Darmowy tier - dla projektów osobistych i open-source
- Preview deployments - każdy pull request generuje osobny deployment
- Integracja z Git - automatyczny deployment przy każdym push
- Serverless functions - możliwość dodania backendu bez osobnego serwera
Krok po kroku: Deployment aplikacji Vite+React na Vercel
1. Przygotowanie repozytorium Git
Vercel integruje się z GitHubem, GitLabem i Bitbucket. Upewnij się, że Twój projekt jest przechowywany w jednym z tych serwisów:
1# Jeśli jeszcze nie zainicjowałeś repozytorium
2git init
3
4# Dodaj pliki do repozytorium
5git add .
6
7# Utwórz commit
8git commit -m "Przygotowanie do deploymentu"
9
10# Dodaj zdalne repozytorium (zastąp URL swoim)
11git remote add origin https://github.com/twój-username/twój-projekt.git
12
13# Wypchnij zmiany
14git push -u origin main2. Konfiguracja projektu na Vercel
Utwórz konto na Vercel - przejdź na vercel.com i zarejestruj się (najlepiej używając tego samego konta, co w serwisie Git)
Importuj projekt:
- Kliknij "Add New..." > "Project"
- Wybierz swoje repozytorium z listy
- Vercel automatycznie wykryje, że używasz Vite
Skonfiguruj projekt:
- Framework Preset: Vercel powinien automatycznie wykryć Vite
- Build Command: Domyślnie
npm run build(zostaw bez zmian) - Output Directory: Domyślnie
dist(zostaw bez zmian) - Environment Variables: Dodaj te same zmienne, co w
.env.production(bez prefiksuVITE_)
Kliknij "Deploy" i poczekaj na zakończenie procesu
3. Weryfikacja deploymentu
Po zakończeniu deploymentu Vercel pokaże stronę z podsumowaniem. Możesz:
- Odwiedzić swoją stronę pod automatycznie przydzielonym adresem (np.
twój-projekt.vercel.app) - Sprawdzić logi buildowania i deploymentu
- Skonfigurować własną domenę
Konfiguracja ciągłego deploymentu (CI/CD)
Vercel automatycznie skonfiguruje Continuous Deployment dla Twojego projektu:
- Każdy push do głównej gałęzi (zwykle
mainlubmaster) spowoduje deployment na środowisko produkcyjne - Każdy pull request wygeneruje unikalny "Preview Deployment", pozwalając na testowanie zmian przed włączeniem ich do głównej gałęzi
Ta integracja tworzy prosty i wydajny workflow:
- Pracujesz lokalnie nad nową funkcją
- Wysyłasz zmiany do gałęzi
feature/new-feature - Tworzysz Pull Request
- Vercel automatycznie tworzy Preview Deployment
- Testujesz zmiany w środowisku podobnym do produkcyjnego
- Po zatwierdzeniu, łączysz PR z główną gałęzią
- Vercel automatycznie aktualizuje środowisko produkcyjne
Optymalizacja deploymentu
1. Analiza wydajności
Vercel oferuje Analytics, które pomagają monitorować wydajność aplikacji w realnym świecie:
- Real Experience Score - ocena doświadczenia użytkowników
- Core Web Vitals - metryki takie jak LCP, FID i CLS
- Metryki po stronach - które części aplikacji są najwolniejsze
Aby włączyć Analytics:
- Przejdź do projektu na Vercel
- Kliknij zakładkę "Analytics"
- Kliknij "Enable Analytics"
2. Optymalizacja zasobów statycznych
Vite automatycznie optymalizuje zasoby podczas buildowania, ale warto pamiętać o kilku dodatkowych praktykach:
- Używaj nowoczesnych formatów obrazów - WebP zamiast JPEG/PNG
- Lazy loading - ładuj obrazy/komponenty tylko gdy są potrzebne
- Preload kluczowych zasobów - dodaj tagi
<link rel="preload">dla krytycznych zasobów
3. Edge Functions i Edge Middleware na Vercel
Dla bardziej zaawansowanych aplikacji, Vercel oferuje:
- Edge Functions - lekkie funkcje działające na globalnej sieci brzegowej
- Edge Middleware - kod uruchamiany przed każdym żądaniem
Przykład Edge Middleware do przekierowania użytkowników na podstawie ich lokalizacji:
1// middleware.js
2export default function middleware(request) {
3 const country = request.geo.country || 'US';
4
5 // Przekierowanie użytkowników z Polski na polską wersję strony
6 if (country === 'PL' && !request.nextUrl.pathname.startsWith('/pl')) {
7 return Response.redirect(new URL('/pl' + request.nextUrl.pathname, request.url));
8 }
9}
10
11export const config = {
12 matcher: ['/((?!api|_next/static|favicon.ico).*)'],
13};Najlepsze praktyki produkcyjne
1. Monitorowanie błędów
Zintegruj narzędzie do monitorowania błędów jak Sentry lub LogRocket:
1npm install @sentry/react1// src/main.jsx
2import React from 'react';
3import ReactDOM from 'react-dom/client';
4import * as Sentry from '@sentry/react';
5import App from './App';
6import './index.css';
7
8if (import.meta.env.PROD) {
9 Sentry.init({
10 dsn: import.meta.env.VITE_SENTRY_DSN,
11 integrations: [new Sentry.BrowserTracing()],
12 tracesSampleRate: 0.5,
13 });
14}
15
16ReactDOM.createRoot(document.getElementById('root')).render(
17 <React.StrictMode>
18 <App />
19 </React.StrictMode>
20);2. Kod dzielony (Code Splitting)
Podziel aplikację na mniejsze kawałki, ładowane na żądanie:
1import { lazy, Suspense } from 'react';
2
3// Zamiast: import Dashboard from './Dashboard';
4const Dashboard = lazy(() => import('./Dashboard'));
5
6function App() {
7 return (
8 <div>
9 <Suspense fallback={<div>Ładowanie...</div>}>
10 <Dashboard />
11 </Suspense>
12 </div>
13 );
14}3. Progresywne aplikacje webowe (PWA)
Przekształć swoją aplikację React w PWA, dodając Service Worker i manifest:
1npm install vite-plugin-pwa --save-dev1// vite.config.js
2import { defineConfig } from 'vite';
3import react from '@vitejs/plugin-react';
4import { VitePWA } from 'vite-plugin-pwa';
5
6export default defineConfig({
7 plugins: [
8 react(),
9 VitePWA({
10 registerType: 'autoUpdate',
11 includeAssets: ['favicon.ico', 'robots.txt', 'apple-touch-icon.png'],
12 manifest: {
13 name: 'Space Mission Control',
14 short_name: 'SpaceMission',
15 description: 'Aplikacja do zarządzania misjami kosmicznymi',
16 theme_color: '#ffffff',
17 icons: [
18 {
19 src: 'pwa-192x192.png',
20 sizes: '192x192',
21 type: 'image/png'
22 },
23 {
24 src: 'pwa-512x512.png',
25 sizes: '512x512',
26 type: 'image/png'
27 }
28 ]
29 }
30 })
31 ]
32});Podsumowanie procesu od developmentu do wdrożenia
Cały proces tworzenia i wdrażania aplikacji React z Vite wygląda następująco:
Development
- Inicjalizacja projektu z Vite:
npm create vite@latest my-app --template react - Rozwój funkcjonalności w lokalnym środowisku:
npm run dev - Testowanie komponentów i funkcjonalności
- Inicjalizacja projektu z Vite:
Przygotowanie do produkcji
- Usunięcie konsol i debuggerów
- Konfiguracja zmiennych środowiskowych produkcyjnych
- Sprawdzenie i aktualizacja zależności
Budowanie
- Uruchomienie buildu produkcyjnego:
npm run build - Testowanie zbudowanej aplikacji:
npm run preview
- Uruchomienie buildu produkcyjnego:
Przygotowanie repozytorium
- Inicjalizacja repozytorium Git
- Commit i push do zdalnego repozytorium
Deployment na Vercel
- Połączenie z repozytorium Git
- Konfiguracja projektu
- Deployment
Post-deployment
- Konfiguracja domeny
- Włączenie Analytics
- Monitorowanie błędów
- Optymalizacja wydajności
Zarządzanie aplikacją w produkcji
Po wdrożeniu aplikacji, Twoje obowiązki jako dewelopera nie kończą się. Ważne jest dalsze:
- Monitorowanie wydajności i błędów - regularne sprawdzanie Vercel Analytics i narzędzi do śledzenia błędów
- Aktualizacje zależności - regularne aktualizowanie pakietów, szczególnie przy poprawkach bezpieczeństwa
- Wprowadzanie nowych funkcji - wykorzystanie workflow CI/CD do bezpiecznego wprowadzania zmian
- A/B testy - testowanie nowych funkcji na podzbiorze użytkowników przed pełnym wdrożeniem
Zakończenie kosmicznej podróży
Ukończyliśmy naszą kosmiczną podróż po React! Zaczynając od podstaw, stopniowo budowaliśmy coraz bardziej zaawansowane komponenty, aż do pełnej aplikacji gotowej do wdrożenia na platformie Vercel.
Pamiętaj, że podobnie jak eksploracja kosmosu, nauka React to niekończąca się podróż. Ecosystem React stale się rozwija, pojawiają się nowe biblioteki, narzędzia i wzorce. Bądź na bieżąco z dokumentacją, blogami i społecznością, aby Twoje umiejętności pozostawały aktualne.
Teraz, gdy Twój statek kosmiczny jest zbudowany, przetestowany i gotowy do lotu - to czas, aby podbić kosmos frontendowych aplikacji!
Kod do tej lekcji: App.jsx
1import React from 'react';
2
3// Deployment i budowanie aplikacji produkcyjnej
4export default function App() {
5 return (
6 <div style={{
7 background: '#0d1b2a', minHeight: '100vh',
8 padding: '20px', fontFamily: 'Arial', color: '#e0e1dd'
9 }}>
10 <h1 style={{ color: '#ffd700', textAlign: 'center' }}>
11 Deployment na Vercel
12 </h1>
13 <div style={{
14 background: '#1b2838', borderRadius: '12px',
15 padding: '20px', maxWidth: '600px', margin: '20px auto',
16 border: '1px solid #2a3f5f'
17 }}>
18 <h2 style={{ color: '#00d4ff' }}>Kroki wdrozenia:</h2>
19 <ol style={{ color: '#e0e1dd', lineHeight: 1.8 }}>
20 <li>npm run build - budowanie produkcyjne</li>
21 <li>Weryfikacja katalogu build/</li>
22 <li>Deploy na Vercel/Netlify</li>
23 <li>Konfiguracja zmiennych srodowiskowych</li>
24 </ol>
25 </div>
26 </div>
27 );
28}Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Jaka jest standardowa konwencja nazewnictwa Higher-Order Components?
2. Co robi React.lazy() i kiedy go stosujemy?
To 2 z 9 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Układanie w poziomie
Ułóż składnię hooka useCallback z zależnością:
- Edytor kodu
useReducer dla systemu alarmowego
- Układanie w pionie
Uporządkuj kroki implementacji code splitting w aplikacji React:
- Edytor kodu
Kompozycja providerów z hookami
- Klikanie w kolejności
Uporządkuj wzorzec Render Props:
- Układanie w poziomie
Ułóż składnię hooka useMemo z tablicą zależności:
- Układanie w pionie
Uporządkuj wzorce zarządzania stanem React od najprostszego do najbardziej złożonego:
- Układanie w pionie
Uporządkuj ewolucję zarządzania stanem w React:
- Klikanie w kolejności
Ułóż wzorzec Render Props z children jako funkcją: