import { watchEffect } from 'vue'; export function useUpdateHead(route, siteDataByRouteRef) { const metaTags = Array.from(document.querySelectorAll('meta')); let isFirstUpdate = true; const updateHeadTags = (newTags) => { if (process.env.NODE_ENV === 'production' && isFirstUpdate) { // in production, the initial meta tags are already pre-rendered so we // skip the first update. isFirstUpdate = false; return; } metaTags.forEach((el) => document.head.removeChild(el)); metaTags.length = 0; if (newTags && newTags.length) { newTags.forEach((headConfig) => { const el = createHeadElement(headConfig); document.head.appendChild(el); metaTags.push(el); }); } }; watchEffect(() => { const pageData = route.data; const siteData = siteDataByRouteRef.value; const pageTitle = pageData && pageData.title; document.title = (pageTitle ? pageTitle + ` | ` : ``) + siteData.title; updateHeadTags([ ['meta', { charset: 'utf-8' }], [ 'meta', { name: 'viewport', content: 'width=device-width,initial-scale=1' } ], [ 'meta', { name: 'description', content: siteData.description } ], ...siteData.head, ...((pageData && pageData.frontmatter.head) || []) ]); }); } function createHeadElement([tag, attrs, innerHTML]) { const el = document.createElement(tag); for (const key in attrs) { el.setAttribute(key, attrs[key]); } if (innerHTML) { el.innerHTML = innerHTML; } return el; }