Kurs JavaScript i React · Moduł 8: Zaawansowane wzorce React

Budowanie aplikacji produkcyjnej i Deployment na Vercel

9 min czytania
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 update

Usunię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-dev

I 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-1

W 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 build

Ta 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 preview

Ta 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 main

2. Konfiguracja projektu na Vercel

  1. Utwórz konto na Vercel - przejdź na vercel.com i zarejestruj się (najlepiej używając tego samego konta, co w serwisie Git)

  2. Importuj projekt:

    • Kliknij "Add New..." > "Project"
    • Wybierz swoje repozytorium z listy
    • Vercel automatycznie wykryje, że używasz Vite
  3. 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 prefiksu VITE_)
  4. 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 main lub master) 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:

  1. Pracujesz lokalnie nad nową funkcją
  2. Wysyłasz zmiany do gałęzi feature/new-feature
  3. Tworzysz Pull Request
  4. Vercel automatycznie tworzy Preview Deployment
  5. Testujesz zmiany w środowisku podobnym do produkcyjnego
  6. Po zatwierdzeniu, łączysz PR z główną gałęzią
  7. 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:

  1. Przejdź do projektu na Vercel
  2. Kliknij zakładkę "Analytics"
  3. 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/react
1// 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-dev
1// 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:

  1. 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
  2. Przygotowanie do produkcji

    • Usunięcie konsol i debuggerów
    • Konfiguracja zmiennych środowiskowych produkcyjnych
    • Sprawdzenie i aktualizacja zależności
  3. Budowanie

    • Uruchomienie buildu produkcyjnego: npm run build
    • Testowanie zbudowanej aplikacji: npm run preview
  4. Przygotowanie repozytorium

    • Inicjalizacja repozytorium Git
    • Commit i push do zdalnego repozytorium
  5. Deployment na Vercel

    • Połączenie z repozytorium Git
    • Konfiguracja projektu
    • Deployment
  6. 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. 1. Jaka jest standardowa konwencja nazewnictwa Higher-Order Components?

  2. 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ą:

Przydatne artykuły