Open Graph (OG) — это набор мета-тегов, предназначенных для корректного отображения веб-страниц при их распространении в социальных сетях и мессенджерах. При использовании клиентских маршрутизаторов, таких как Navigo, возникает проблема: контент страницы изменяется динамически без полной перезагрузки, а мета-теги остаются статичными, что приводит к некорректным превью ссылок.
В классических многостраничных приложениях (MPA) каждая страница имеет собственный HTML-документ с уникальными OG-тегами. В одностраничных приложениях (SPA), построенных с Navigo, требуется дополнительная логика для управления метаданными.
Ключевые OG-теги, которые должны обновляться при смене маршрута:
<meta property="og:title" content="Заголовок страницы">
<meta property="og:description" content="Описание страницы">
<meta property="og:image" content="URL изображения">
<meta property="og:url" content="Полный URL страницы">
<meta property="og:type" content="website">
Дополнительно используются:
<meta property="og:site_name" content="Название сайта">
<meta property="og:locale" content="ru_RU">
Социальные сети (например, Facebook, VK, Twitter) не исполняют JavaScript или делают это ограниченно. Это означает:
Таким образом, простое обновление <meta> через
JavaScript не решает проблему для внешних сервисов.
Для внутренних переходов (UX и SEO на клиенте) возможно динамическое обновление мета-тегов при смене маршрута.
import Navigo from 'navigo';
const router = new Navigo('/');
router
.on({
'/': () => updatePage({
title: 'Главная',
description: 'Главная страница сайта',
image: '/images/home.jpg'
}),
'/about': () => updatePage({
title: 'О нас',
description: 'Информация о компании',
image: '/images/about.jpg'
})
})
.resolve();
function setMetaTag(property, content) {
let element = document.querySelector(`meta[property="${property}"]`);
if (!element) {
element = document.createElement('meta');
element.setAttribute('property', property);
document.head.appendChild(element);
}
element.setAttribute('content', content);
}
function updatePage({ title, description, image }) {
document.title = title;
setMetaTag('og:title', title);
setMetaTag('og:description', description);
setMetaTag('og:image', image);
setMetaTag('og:url', window.location.href);
}
Несмотря на корректную работу внутри браузера:
Это фундаментальное ограничение SPA.
Для полноценной поддержки Open Graph требуется серверная генерация HTML:
1. SSR (Server-Side Rendering) Сервер формирует HTML для каждого маршрута:
2. Пререндеринг (Prerendering) Генерация статических HTML-файлов:
<head>
<meta property="og:title" content="{{title}}">
<meta property="og:description" content="{{description}}">
<meta property="og:image" content="{{image}}">
<meta property="og:url" content="{{url}}">
</head>
Значения подставляются на сервере в зависимости от маршрута.
Комбинация:
Алгоритм работы:
/aboutСоциальные сети кэшируют OG-данные:
Для обновления используется:
Изображение должно:
Динамическая генерация:
OG-теги не влияют напрямую на ранжирование, но:
Дополнительно используются:
<meta name="description" content="...">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="...">
<meta name="twitter:description" content="...">
<meta name="twitter:image" content="...">
Twitter использует собственные мета-теги, но частично поддерживает OG.
Пример структуры:
const routes = {
'/': {
component: Home,
meta: {
title: 'Главная',
description: '...',
image: '...'
}
}
};
Object.entries(routes).forEach(([path, config]) => {
router.on(path, () => {
render(config.component);
updatePage(config.meta);
});
});
Инструменты:
Проверяется:
/image.jpg вместо
https://site.com/image.jpg)При динамической генерации: