ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ Ρ Pages Router Π½Π° App Router Π² Next.js ΠΎΡΠΊΡΡΠ» Π½ΠΎΠ²ΡΠ΅ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΡ Π΄Π»Ρ Π²Π΅Π±-ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ΅ΠΌ ΠΏΡΠΈΠ½Π΅Ρ ΠΈ Π½ΠΎΠ²ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ Π΄Π»Ρ SEO-ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΎΠ². ΠΠΎΠ²ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Server Components, ΡΡΡΡΠΊΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ ΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌΠΈ ΡΡΠ΅Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΌΠΎΡΡΠ° ΠΏΡΠΈΠ²ΡΡΠ½ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ² ΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
Π Π°Π·Π±Π΅ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ SEO Π΄Π»Ρ ΠΊΡΡΠΏΠ½ΠΎΠ³ΠΎ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΡΠ° ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π½Π° Π±Π°Π·Π΅ Next.js App Router.
1. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ Metadata API
Π App Router Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ext/head`. Next.js ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΎΡΠ½ΡΠΉ ΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Metadata API, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ.
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅
ΠΠ»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΡΡΠ°Π½ΠΈΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ metadata ΠΈΠ· ΡΠ°ΠΉΠ»Π° page.tsx ΠΈΠ»ΠΈ layout.tsx:
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°ΠΉΡΠΎΠ² Π½Π° Next.js ΠΏΠΎΠ΄ ΠΊΠ»ΡΡ | EvaLab',
description: 'ΠΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»ΡΠ½Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π±ΡΡΡΡΡΡ
Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ SEO.',
alternates: {
canonical: 'https://evalab.site/services/web-systems',
},
};
ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅
ΠΠ»Ρ ΡΡΡΠ°Π½ΠΈΡ ΡΠΎΠ²Π°ΡΠΎΠ², ΡΡΠ»ΡΠ³ ΠΈΠ»ΠΈ ΡΡΠ°ΡΠ΅ΠΉ Π² Π±Π»ΠΎΠ³Π΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ generateMetadata:
export async function generateMetadata({ params }): Promise<Metadata> {
const product = await getProduct(params.id);
return {
title: `${product.name} - ΠΡΠΏΠΈΡΡ ΠΏΠΎ Π²ΡΠ³ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅Π½Π΅ | EvaLab`,
description: product.description,
openGraph: {
images: [{ url: product.imageUrl }],
},
};
}
2. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Canonical ΠΈ Hreflang ΡΠ΅Π³ΠΎΠ²
ΠΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° β ΡΠ°ΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΊΡΡΠΏΠ½ΡΡ ΡΠ°ΠΉΡΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠ΅ ΡΠΎΠ±ΠΎΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΡΠ°Π½ΠΈΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ.
Π layout.tsx Π½Π° ΡΠ°ΠΌΠΎΠΌ Π²Π΅ΡΡ
Π½Π΅ΠΌ ΡΡΠΎΠ²Π½Π΅ Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ metadataBase, ΡΡΠΎΠ±Ρ Next.js Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°Π» ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π² Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠ΅:
export const metadata: Metadata = {
metadataBase: new URL('https://evalab.site'),
alternates: {
canonical: './',
languages: {
'ru-RU': './',
},
},
};
3. ΠΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Sitemap ΠΈ Robots
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΏΠΊΠ΅ public Π² App Router ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΌΠ°ΡΡΡΡΡΠΎΠ² sitemap.ts ΠΈ robots.ts ΠΏΡΡΠΌΠΎ Π²Π½ΡΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ app.
ΠΡΠΈΠΌΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ app/sitemap.ts:
import { MetadataRoute } from 'next';
import { getProducts } from '@/lib/products';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const products = await getProducts();
const productUrls = products.map((p) => ({
url: `https://example.com/products/${p.slug}`,
lastModified: new Date(p.updatedAt),
}));
return [
{
url: 'https://example.com',
lastModified: new Date(),
changeFrequency: 'yearly',
priority: 1,
},
...productUrls,
];
}
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π±Π»ΠΎΠΊ EvaLab: SEO-ΡΠ΅ΠΊΠ»ΠΈΡΡ Π΄Π»Ρ Next.js App Router
Π Next.js App Router SEO Π»ΠΎΠΌΠ°Π΅ΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·-Π·Π° ΠΌΠ΅ΡΠ°-ΡΠ΅Π³ΠΎΠ². Π§Π°ΡΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π±Π΅Π· Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ HTML, Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ canonical, ΠΌΡΠ³ΠΊΠΈΠ΅ 404, Π΄ΡΠ±Π»ΠΈ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΈ sitemap, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ.
| ΠΠΎΠ½Π° | Π§ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ | ΠΠΎΡΠ΅ΠΌΡ Π²Π°ΠΆΠ½ΠΎ |
|---|---|---|
| Metadata API | title, description, canonical, OG, Twitter | Π£ΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ½ΠΈΠΏΠΏΠ΅ΡΠΎΠΌ ΠΈ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ |
| Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ HTML | ΠΠΈΠ΄ΠΈΠΌΡΠΉ H1, ΠΏΠ΅ΡΠ²ΡΠΉ Π°Π±Π·Π°Ρ, FAQ | Π ΠΎΠ±ΠΎΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΈΠ΄Π΅ΡΡ Π²Π°ΠΆΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ |
| 404 | ΠΠ΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ URL Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ HTTP 404 | ΠΠ½Π°ΡΠ΅ Π―Π½Π΄Π΅ΠΊΡ Π²ΠΈΠ΄ΠΈΡ ΠΌΡΠ³ΠΊΠΈΠ΅ Π΄ΡΠ±Π»ΠΈ |
| Sitemap | ΠΡΠ΅ Π²Π°ΠΆΠ½ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Π² XML | Π£ΡΠΊΠΎΡΡΠ΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ |
| Robots | ΠΠ°ΠΊΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΡ | ΠΠ΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ |
ΠΠΈΠ½ΠΈ-Π°ΡΠ΄ΠΈΡ
ΠΡΠΎΠ²Π΅ΡΡΡΠ΅ ΡΠ°ΠΉΡ ΡΠ΅ΡΠ΅Π· Π°ΡΠ΄ΠΈΡ ΡΠ°ΠΉΡΠ° ΠΈ Π²ΡΡΡΠ½ΡΡ ΠΎΡΠΊΡΠΎΠΉΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ URL ΠΈΠ· sitemap. ΠΠ»Ρ ΠΊΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ°Π½ΠΈΡ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡΠ»ΠΈ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΠΎΡΠ²Π΅Ρ, FAQ, structured data ΠΈ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΡΠ»ΡΠ³Ρ.
Π Π΅Π·ΡΠΌΠ΅
Next.js App Router ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π»ΡΠ±ΡΡ SEO-Π·Π°Π΄Π°Ρ. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Metadata API, ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° (SSR/ISR) ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠ°Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π΄ΠΎΡΡΠΈΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π―Π½Π΄Π΅ΠΊΡ ΠΈ Google.
ΠΡΡΠΎΡΠ½ΠΈΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ:
- Π Π°Π·Π΄Π΅Π» Metadata Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Next.js β Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ Metadata API.
- Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Google Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΠΎ JavaScript SEO β ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΠΈ SPA ΠΈ SSR ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΌΠΈ ΡΠΎΠ±ΠΎΡΠ°ΠΌΠΈ Google.
- Next.js: metadata and OG images β Π°ΠΊΡΡΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
ΠΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠΎΠ±ΡΠ°Π½Π½ΠΎΠΌ ΡΠ°ΠΉΡΠ΅: ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ API-ΠΊΠΎΠ΄ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ robots, canonical ΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠΏΠ°Π»ΠΈ Π² ΡΠΊΡΠΏΠΎΡΡ. ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈΠΉ SEO-Π°ΡΠ΄ΠΈΡ.
ΠΠ΅Π΄ΡΡΠΈΠΉ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π²Π΅Π±-ΡΠΈΡΡΠ΅ΠΌ. Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½Π° Next.js, ΡΠΈΡΡΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅, Core Web Vitals ΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΠ°Π½ΠΆΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ.


