Po stworzeniu aplikacji Next.js, kluczowym etapem jest jej wdrożenie do środowiska produkcyjnego. W tym module przyjrzymy się różnym platformom hostingowym, które oferują zoptymalizowane środowisko dla aplikacji Next.js, ze szczególnym uwzględnieniem Vercel - platformy stworzonej przez twórców Next.js.
Vercel to platforma, która oferuje najlepszą natywną obsługę dla aplikacji Next.js, ponieważ obie technologie są rozwijane przez tę samą firmę. Zapewnia to optymalne wsparcie dla wszystkich funkcji Next.js, zautomatyzowane wdrożenia i globalne CDN.
Przed wdrożeniem upewnij się, że twój projekt jest gotowy do produkcji:
next build lokalnie, aby sprawdzić ewentualne błędyUtwórz konto na Vercel
Zaimportuj projekt
Konfiguracja wdrożenia
Wdrożenie
Weryfikacja wdrożenia
Aby skonfigurować własną domenę dla projektu na Vercel:
Jednym z największych atutów Vercel jest system automatycznych wdrożeń:
Automatyczne wdrożenia produkcyjne
main) powoduje automatyczne wdrożenieWdrożenia podglądowe (Preview Deployments)
1// Przykład konfiguracji Next.js zoptymalizowanej dla Vercel
2// next.config.js
3
4module.exports = {
5 // Optymalizacja obrazów - automatycznie obsługiwana przez Vercel Image Optimization
6 images: {
7 domains: ['example.com', 'images.unsplash.com'],
8 },
9
10 // Zintegrowana analityka Vercel
11 vercelAnalytics: {
12 enabled: true,
13 },
14
15 // Ustawienia międzynarodowe
16 i18n: {
17 locales: ['pl', 'en', 'de'],
18 defaultLocale: 'pl',
19 },
20};Vercel oferuje szereg zaawansowanych funkcji, które warto wykorzystać:
Netlify to inna popularna platforma, która oferuje doskonałe wsparcie dla aplikacji Next.js, szczególnie po wprowadzeniu funkcji Netlify Next.js Runtime.
1# netlify.toml
2[build]
3 command = "npm run build"
4 publish = ".next"
5
6[[plugins]]
7 package = "@netlify/plugin-nextjs"1npm install -D @netlify/plugin-nextjs
2# lub
3yarn add -D @netlify/plugin-nextjsUtwórz konto na Netlify
Zaimportuj projekt
Konfiguracja wdrożenia
npm run build lub yarn build.nextSkonfiguruj zmienne środowiskowe
Wdrożenie
Netlify oferuje szereg unikalnych funkcji, które mogą być przydatne w projektach Next.js:
1// Przykład wykorzystania Netlify Functions z Next.js
2// /netlify/functions/hello-world.js
3
4exports.handler = async function(event, context) {
5 return {
6 statusCode: 200,
7 body: JSON.stringify({ message: "Hello World" }),
8 headers: {
9 'Content-Type': 'application/json'
10 }
11 };
12};
13
14// Dostęp z aplikacji Next.js
15// pages/api-example.js
16import { useState, useEffect } from 'react';
17
18export default function ApiExample() {
19 const [data, setData] = useState(null);
20
21 useEffect(() => {
22 fetch('/.netlify/functions/hello-world')
23 .then(res => res.json())
24 .then(data => setData(data));
25 }, []);
26
27 return (
28 <div>
29 <h1>API Example</h1>
30 <pre>{JSON.stringify(data, null, 2)}</pre>
31 </div>
32 );
33}AWS Amplify to usługa od Amazon, która również oferuje dobre wsparcie dla aplikacji Next.js, szczególnie jeśli już korzystasz z ekosystemu AWS.
1# amplify.yml
2version: 1
3frontend:
4 phases:
5 preBuild:
6 commands:
7 - npm ci
8 build:
9 commands:
10 - npm run build
11 artifacts:
12 baseDirectory: .next
13 files:
14 - '**/*'
15 cache:
16 paths:
17 - node_modules/**/*Utwórz konto AWS lub zaloguj się do istniejącego
Przejdź do konsoli AWS Amplify
Połącz repozytorium
Konfiguracja ustawień kompilacji
Skonfiguruj zmienne środowiskowe
Wdrożenie
Jednym z głównych atutów AWS Amplify jest łatwa integracja z innymi usługami AWS:
1// Przykład: Integracja z AWS Lambda i DynamoDB
2// pages/api/users.js
3
4import { DynamoDB } from 'aws-sdk';
5
6const dynamoDB = new DynamoDB.DocumentClient();
7
8export default async function handler(req, res) {
9 if (req.method === 'GET') {
10 const params = {
11 TableName: process.env.DYNAMODB_TABLE_NAME,
12 };
13
14 try {
15 const data = await dynamoDB.scan(params).promise();
16 res.status(200).json(data.Items);
17 } catch (error) {
18 res.status(500).json({ error: 'Failed to fetch users' });
19 }
20 }
21}Digital Ocean App Platform to inna opcja hostingowa, która oferuje dobre wsparcie dla aplikacji Next.js.
Utwórz konto Digital Ocean lub zaloguj się do istniejącego
Przejdź do Digital Ocean App Platform
Wybierz źródło kodu
Konfiguracja aplikacji
Dostosuj ustawienia
npm run build lub yarn buildnpm start lub yarn startFinalizacja
Dla statycznie generowanych aplikacji Next.js, możesz użyć GitHub Pages z GitHub Actions:
1# .github/workflows/deploy.yml
2name: Deploy to GitHub Pages
3
4on:
5 push:
6 branches: [ main ]
7
8jobs:
9 build:
10 runs-on: ubuntu-latest
11 steps:
12 - uses: actions/checkout@v2
13 - uses: actions/setup-node@v2
14 with:
15 node-version: '18'
16 - name: Install dependencies
17 run: npm ci
18 - name: Build and export
19 run: npm run build && npm run export
20 - name: Deploy
21 uses: peaceiris/actions-gh-pages@v3
22 with:
23 github_token: ${{ secrets.GITHUB_TOKEN }}
24 publish_dir: ./out1// next.config.js
2module.exports = {
3 output: 'export',
4 basePath: '/nazwa-repozytorium', // Jeśli strona nie jest na domenie głównej
5 images: {
6 unoptimized: true, // Dla GitHub Pages
7 },
8};1{
2 "scripts": {
3 "export": "next export"
4 }
5}Firebase Hosting to kolejna opcja, szczególnie jeśli korzystasz z innych usług Firebase:
1npm install -g firebase-tools1firebase login
2firebase init hosting1{
2 "hosting": {
3 "public": "out",
4 "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
5 "rewrites": [
6 {
7 "source": "**",
8 "destination": "/index.html"
9 }
10 ]
11 }
12}1npm run build
2npm run export
3firebase deployJeśli wolisz hostować aplikację na własnym serwerze:
1{
2 "scripts": {
3 "start": "next start -p $PORT"
4 }
5}1npm install -g pm2
2pm2 start npm --name "next-app" -- start1server {
2 listen 80;
3 server_name twojastrona.pl www.twojastrona.pl;
4
5 location / {
6 proxy_pass http://localhost:3000;
7 proxy_http_version 1.1;
8 proxy_set_header Upgrade $http_upgrade;
9 proxy_set_header Connection 'upgrade';
10 proxy_set_header Host $host;
11 proxy_cache_bypass $http_upgrade;
12 }
13}1# Dockerfile
2FROM node:18-alpine AS base
3
4# Etap instalacji zależności
5FROM base AS deps
6WORKDIR /app
7COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
8RUN
9 if [ -f yarn.lock ]; then yarn --frozen-lockfile;
10 elif [ -f package-lock.json ]; then npm ci;
11 elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i;
12 else echo "Brak pliku lockfile" && exit 1;
13 fi
14
15# Etap budowania
16FROM base AS builder
17WORKDIR /app
18COPY /app/node_modules ./node_modules
19COPY . .
20RUN npm run build
21
22# Etap produkcyjny
23FROM base AS runner
24WORKDIR /app
25ENV NODE_ENV production
26
27RUN addgroup --system --gid 1001 nodejs
28RUN adduser --system --uid 1001 nextjs
29
30COPY /app/public ./public
31COPY /app/.next/standalone ./
32COPY /app/.next/static ./.next/static
33
34USER nextjs
35EXPOSE 3000
36ENV PORT 3000
37
38CMD ["node", "server.js"]1// next.config.js
2module.exports = {
3 output: 'standalone',
4};1docker build -t next-app .
2docker run -p 3000:3000 next-appZarządzaj zmiennymi środowiskowymi zgodnie z best practices Next.js:
Rozróżniaj zmienne klienckie i serwerowe:
NEXT_PUBLIC_Pliki środowiskowe:
.env.local - zmienne dla lokalnego środowiska, nie są commitowane do repozytorium.env.development - zmienne dla środowiska deweloperskiego.env.production - zmienne dla środowiska produkcyjnego.env.test - zmienne dla środowiska testowegoCache i CDN:
Kompresja:
Core Web Vitals:
1// next.config.js - optymalizacja produkcyjna
2module.exports = {
3 // Kompresja
4 compress: true,
5
6 // Optymalizacja obrazów
7 images: {
8 domains: ['images.example.com'],
9 formats: ['image/avif', 'image/webp'],
10 },
11
12 // Generator statyczny - maksymalna wydajność dla stron ISR/SSG
13 staticPageGenerationTimeout: 120,
14
15 // Optymalizacja produkcyjna
16 productionBrowserSourceMaps: false, // Wyłącz source maps na produkcji
17
18 // Konfiguracja webpack
19 webpack: (config, { dev, isServer }) => {
20 // Optymalizacje webpack...
21 return config;
22 },
23};Rozważ implementację ciągłego wdrażania (CD), aby zautomatyzować proces wdrażania:
1# GitHub Actions - deploy.yml
2name: Deploy
3
4on:
5 push:
6 branches: [ main ]
7
8jobs:
9 deploy:
10 runs-on: ubuntu-latest
11 steps:
12 - uses: actions/checkout@v2
13
14 - name: Setup Node.js
15 uses: actions/setup-node@v2
16 with:
17 node-version: '18'
18
19 - name: Install dependencies
20 run: npm ci
21
22 - name: Run tests
23 run: npm test
24
25 - name: Build project
26 run: npm run build
27
28 - name: Deploy to production
29 uses: amondnet/vercel-action@v20
30 with:
31 vercel-token: ${{ secrets.VERCEL_TOKEN }}
32 vercel-org-id: ${{ secrets.ORG_ID }}
33 vercel-project-id: ${{ secrets.PROJECT_ID }}
34 vercel-args: '--prod'Wdrażanie aplikacji Next.js może być realizowane na wiele sposobów, w zależności od potrzeb projektu i preferencji zespołu:
Wybór platformy hostingowej powinien być dostosowany do:
Niezależnie od wybranej platformy, warto przestrzegać najlepszych praktyk w zakresie zarządzania środowiskami, zmiennymi środowiskowymi, bezpieczeństwem i automatyzacją wdrożeń.