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 (build) w Next.js przekształca kod źródłowy w zoptymalizowaną wersję gotową do wdrożenia. Podczas tego procesu Next.js:
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 buildPo 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.
Po pomyślnym zbudowaniu aplikacji możesz uruchomić wersję produkcyjną lokalnie za pomocą:
1npm run startTen 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 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 buildAby skorzystać z tej funkcji, należy zainstalować i skonfigurować narzędzie
@next/bundle-analyzer:1npm install --save-dev @next/bundle-analyzerNastę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.
Analiza pakietu ujawnia:
Na podstawie tych informacji możesz podjąć świadome decyzje dotyczące optymalizacji:
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}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 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:
import 'library')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');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=trueZmienne prefixowane
NEXT_PUBLIC_ są dostępne w przeglądarce, podczas gdy pozostałe są widoczne tylko na serwerze.Dla sekretów produkcyjnych:
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}Przed wdrożeniem, przeprowadź testy wersji produkcyjnej:
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!');Przygotowanie aplikacji Next.js do produkcji to wieloetapowy proces, który obejmuje:
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.