Usamos cookies para mejorar tu experiencia en el sitio
CodeWorlds

Przygotowanie aplikacji do produkcji (build, analyze)

Przygotowanie aplikacji Next.js do wdrożenia produkcyjnego to kluczowy etap procesu rozwoju, który wymaga szczególnej uwagi do optymalizacji, analizy i konfiguracji. Odpowiednio przygotowana aplikacja zapewni lepsze wrażenia użytkownika, wyższą wydajność i łatwiejsze utrzymanie.

Proces budowania aplikacji Next.js

Proces budowania (build) w Next.js przekształca kod źródłowy w zoptymalizowaną wersję gotową do wdrożenia. Podczas tego procesu Next.js:

  1. Kompiluje kod React i TypeScript do JavaScript
  2. Minifikuje kod CSS i JavaScript
  3. Optymalizuje obrazy
  4. Generuje statyczne strony (dla getStaticProps)
  5. Przygotowuje komponenty serwerowe (dla getServerSideProps)
  6. Tworzy pliki konieczne do nawigacji po stronie klienta

Podstawowy proces budowania

Aby zbudować aplikację Next.js, wykonaj następujące kroki:

1# Najpierw upewnij się, że wszystkie zależności są zainstalowane
2npm install
3
4# Następnie zbuduj aplikację
5npm run build

Po zakończeniu procesu budowania, Next.js wyświetli zestawienie stron, ich typów (statyczne, SSR, API) oraz rozmiaru każdej strony. To podsumowanie dostarcza cennych informacji o wydajności aplikacji.

Uruchamianie zbudowanej aplikacji

Po pomyślnym zbudowaniu aplikacji możesz uruchomić wersję produkcyjną lokalnie za pomocą:

1npm run start

Ten polecenie uruchamia serwer Node.js, który obsługuje twoją aplikację Next.js w trybie produkcyjnym, bez funkcji hot-reloading i z zoptymalizowanymi aktywami.

Analiza pakietu (bundle analysis)

Analiza rozmiaru pakietu jest niezbędna do zrozumienia, co dokładnie wpływa na wielkość twojej aplikacji. Next.js oferuje wbudowane narzędzie do analizy pakietu, które można włączyć za pomocą zmiennej środowiskowej:

1ANALYZE=true npm run build

Aby skorzystać z tej funkcji, należy zainstalować i skonfigurować narzędzie

@next/bundle-analyzer
:

1npm install --save-dev @next/bundle-analyzer

Następnie zaktualizuj plik

next.config.js
:

1const withBundleAnalyzer = require('@next/bundle-analyzer')({
2  enabled: process.env.ANALYZE === 'true',
3})
4
5module.exports = withBundleAnalyzer({
6  // Tutaj umieść pozostałe opcje konfiguracyjne Next.js
7})

Po uruchomieniu budowy z włączonym analizatorem, wygenerowane zostaną wizualne raporty pokazujące szczegółowy rozkład rozmiaru pakietu klienta i serwera.

Interpretacja wyników analizy pakietu

Analiza pakietu ujawnia:

  1. Duże zależności - biblioteki, które znacząco wpływają na rozmiar pakietu
  2. Duplikaty - te same pakiety załadowane kilkakrotnie
  3. Nieużywany kod - martwy kod, który można usunąć
  4. Rozkład modułów - które części aplikacji zajmują najwięcej miejsca

Na podstawie tych informacji możesz podjąć świadome decyzje dotyczące optymalizacji:

  • Zastąpić duże biblioteki lżejszymi alternatywami
  • Zaimplementować ładowanie leniwe dla dużych komponentów
  • Usunąć nieużywane zależności
  • Podzielić kod na mniejsze kawałki

Optymalizacja wydajności

Code splitting

Next.js automatycznie implementuje podział kodu, ale możesz dodatkowo zoptymalizować ten proces, używając dynamicznego importu:

1import dynamic from 'next/dynamic';
2
3// Zamiast importować bezpośrednio
4// import HeavyComponent from '../components/HeavyComponent';
5
6// Użyj dynamicznego importu
7const HeavyComponent = dynamic(() => import('../components/HeavyComponent'), {
8  loading: () => <p>Ładowanie...</p>,
9  // SSR można wyłączyć dla komponentów, które nie są potrzebne na serwerze
10  ssr: false,
11});
12
13export default function HomePage() {
14  return (
15    <div>
16      <h1>Strona główna</h1>
17      <HeavyComponent />
18    </div>
19  );
20}

Optymalizacja obrazów

Next.js oferuje komponent

Image
, który automatycznie optymalizuje obrazy, ale warto dodatkowo skonfigurować opcje:

1import Image from 'next/image';
2
3export default function ProductCard({ product }) {
4  return (
5    <div>
6      <Image
7        src={product.imageUrl}
8        alt={product.name}
9        width={300}
10        height={200}
11        blurDataURL={product.thumbnailUrl}
12        priority={product.featured} // Ładuje obraz z wysokim priorytetem, jeśli jest wyróżniony
13      />
14      <h2>{product.name}</h2>
15    </div>
16  );
17}

Tree shaking

Tree shaking to technika eliminacji martwego kodu podczas budowania. Next.js korzysta z Webpack, który wykonuje tree shaking automatycznie. Aby maksymalizować korzyści z tree shaking:

  1. Używaj importów ES Modules zamiast require
  2. Unikaj importów typu side-effect (np.
    import 'library'
    )
  3. Preferuj importy nazwane zamiast domyślnych, gdy potrzebujesz tylko części biblioteki:
1// Źle: importuje całą bibliotekę
2import _ from 'lodash';
3const sortedItems = _.sortBy(items, 'name');
4
5// Dobrze: importuje tylko potrzebną funkcję
6import { sortBy } from 'lodash-es';
7const sortedItems = sortBy(items, 'name');

Zmienne środowiskowe

Next.js obsługuje zmienne środowiskowe poprzez pliki

.env
,
.env.local
,
.env.development
i
.env.production
. Są one kluczowe do konfiguracji aplikacji w różnych środowiskach.

1# .env.production
2NEXT_PUBLIC_API_URL=https://api.twojadomena.com
3DATABASE_URL=postgresql://user:password@production-db:5432/mydb
4FEATURE_FLAGS_ENABLED=true

Zmienne prefixowane

NEXT_PUBLIC_
są dostępne w przeglądarce, podczas gdy pozostałe są widoczne tylko na serwerze.

Bezpieczne zarządzanie sekretami

Dla sekretów produkcyjnych:

  1. Nigdy nie umieszczaj sekretów w repozytorium
  2. Używaj zarządzania sekretami platformy hostingowej (Vercel, Netlify)
  3. Dla wrażliwych operacji, preferuj kod po stronie serwera (API Routes)
1// pages/api/secure-operation.ts
2export default async function handler(req, res) {
3  // API_SECRET jest niedostępny w kodzie klienta
4  const apiSecret = process.env.API_SECRET;
5  
6  // Bezpieczne wykonanie operacji z sekretem
7  const result = await performSecureOperation(apiSecret);
8  
9  // Zwróć tylko bezpieczne dane
10  res.status(200).json({ success: true, data: result.safeData });
11}

Testowanie produkcyjne

Przed wdrożeniem, przeprowadź testy wersji produkcyjnej:

  1. Testy wydajnościowe - użyj Lighthouse lub WebPageTest
  2. Testy funkcjonalne - sprawdź, czy wszystkie funkcje działają zgodnie z oczekiwaniami
  3. Testy responsywności - sprawdź różne rozmiary ekranu
  4. Testy przeglądarek - sprawdź kompatybilność z różnymi przeglądarkami

Automatyzacja testów przedprodukcyjnych

Skonfiguruj skrypt, który przeprowadzi wszystkie niezbędne testy:

1// scripts/pre-deploy-checks.js
2const { execSync } = require('child_process');
3
4// Uruchom testy jednostkowe
5console.log('Uruchamianie testów jednostkowych...');
6execSync('npm run test', { stdio: 'inherit' });
7
8// Uruchom testy end-to-end
9console.log('Uruchamianie testów E2E...');
10execSync('npm run test:e2e', { stdio: 'inherit' });
11
12// Sprawdź typy
13console.log('Sprawdzanie typów...');
14execSync('npm run typecheck', { stdio: 'inherit' });
15
16// Sprawdź lintowanie
17console.log('Sprawdzanie lintingu...');
18execSync('npm run lint', { stdio: 'inherit' });
19
20// Zbuduj aplikację
21console.log('Budowanie aplikacji...');
22execSync('npm run build', { stdio: 'inherit' });
23
24console.log('✅ Wszystkie sprawdzenia przedwdrożeniowe przeszły pomyślnie!');

Podsumowanie

Przygotowanie aplikacji Next.js do produkcji to wieloetapowy proces, który obejmuje:

  1. Budowanie zoptymalizowanej wersji aplikacji
  2. Analizę pakietu w celu identyfikacji możliwości optymalizacji
  3. Implementację technik poprawiających wydajność
  4. Konfigurację zmiennych środowiskowych
  5. Bezpieczne zarządzanie sekretami
  6. Testowanie produkcyjne

Starannie przeprowadzony proces przygotowania aplikacji do produkcji zapewnia lepszą wydajność, bezpieczeństwo i doświadczenie użytkownika, co przekłada się na sukces biznesowy projektu.

Pamiętaj, że optymalizacja jest procesem ciągłym - regularne monitorowanie wydajności i aktualizowanie aplikacji zgodnie z nowymi najlepszymi praktykami to klucz do utrzymania wydajnej aplikacji.

Ir a CodeWorlds