При создании одностраничных приложений (SPA) на Vue.js важной задачей
становится корректная работа с мета-тегами для SEO и социальных сетей. В
стандартной HTML-странице эти теги прописываются в
<head>, но в SPA их необходимо динамически изменять
при переходе между маршрутами. Vue Router предоставляет механизмы,
которые позволяют интегрировать управление мета-тегами на уровне
маршрутов.
Каждый маршрут в Vue Router может содержать объект meta,
который предназначен для хранения произвольных данных. Он часто
используется для хранения информации о заголовках страницы, описаниях,
ключевых словах и других SEO-атрибутах.
Пример маршрута с мета-данными:
const routes = [
{
path: '/about',
name: 'About',
component: About,
meta: {
title: 'О нас — Компания Example',
description: 'Подробная информация о компании Example и её деятельности.',
keywords: 'Example, компания, информация'
}
},
{
path: '/contact',
name: 'Contact',
component: Contact,
meta: {
title: 'Контакты — Example',
description: 'Связаться с компанией Example можно через форму или по телефону.',
keywords: 'контакты, Example, связь'
}
}
];
Здесь объект meta хранит информацию, которая будет
использоваться для генерации мета-тегов при переходе на соответствующий
маршрут.
Для обновления мета-тегов при изменении маршрута используют
глобальные навигационные хуки Vue Router, например,
router.afterEach. В этом хуке можно считывать значения из
meta и применять их к документу.
router.afterEach((to) => {
const defaultTitle = 'Example — Главная';
const defaultDescription = 'Приложение Example';
document.title = to.meta.title || defaultTitle;
const descriptionMeta = document.querySelector('meta[name="description"]');
if (descriptionMeta) {
descriptionMeta.setAttribute('content', to.meta.description || defaultDescription);
} else {
const meta = document.createElement('meta');
meta.name = 'description';
meta.content = to.meta.description || defaultDescription;
document.head.appendChild(meta);
}
const keywordsMeta = document.querySelector('meta[name="keywords"]');
if (keywordsMeta) {
keywordsMeta.setAttribute('content', to.meta.keywords || '');
} else if (to.meta.keywords) {
const meta = document.createElement('meta');
meta.name = 'keywords';
meta.content = to.meta.keywords;
document.head.appendChild(meta);
}
});
Ключевые моменты:
Для корректного отображения ссылок в социальных сетях важно задавать
Open Graph и Twitter Card мета-теги. Эти теги также можно хранить в
meta объектах маршрутов:
meta: {
title: 'Продукт Example',
description: 'Описание продукта Example для пользователей.',
ogTitle: 'Продукт Example',
ogDescription: 'Описание продукта Example',
ogImage: 'https://example.com/images/product.png',
twitterCard: 'summary_large_image'
}
И затем обновлять их динамически в router.afterEach:
function updateMetaTag(name, content) {
let tag = document.querySelector(`meta[name="${name}"]`) || document.querySelector(`meta[property="${name}"]`);
if (tag) {
tag.setAttribute('content', content);
} else {
tag = document.createElement('meta');
if (name.startsWith('og:') || name.startsWith('twitter:')) {
tag.setAttribute('property', name);
} else {
tag.setAttribute('name', name);
}
tag.setAttribute('content', content);
document.head.appendChild(tag);
}
}
router.afterEach((to) => {
const meta = to.meta || {};
document.title = meta.title || 'Example';
updateMetaTag('description', meta.description || '');
updateMetaTag('og:title', meta.ogTitle || meta.title || '');
updateMetaTag('og:description', meta.ogDescription || meta.description || '');
updateMetaTag('og:image', meta.ogImage || '');
updateMetaTag('twitter:card', meta.twitterCard || '');
});
Для крупных проектов удобно использовать готовые решения, такие как
vue-meta или @vueuse/head, которые
интегрируются с Vue Router и позволяют декларативно управлять
мета-тегами в компонентах. Пример с vue-meta:
import { createApp } from 'vue';
import { createRouter, createWebHistory } from 'vue-router';
import { createMetaManager } from 'vue-meta';
import App from './App.vue';
import routes from './routes';
const router = createRouter({
history: createWebHistory(),
routes
});
const app = createApp(App);
const metaManager = createMetaManager();
app.use(router);
app.use(metaManager);
app.mount('#app');
В компонентах можно задавать мета-теги декларативно:
export default {
metaInfo() {
return {
title: 'О нас — Example',
meta: [
{ name: 'description', content: 'Информация о компании Example' },
{ property: 'og:title', content: 'О нас — Example' }
]
};
}
}
Это упрощает управление SEO и делает код компонентов более читаемым.
Одностраничные приложения требуют дополнительной обработки для SEO:
meta маршрутов для удобства
поддержки.Эти подходы обеспечивают корректное отображение информации для пользователей и поисковых систем, повышают качество SEO и удобство управления мета-тегами в Vue SPA.