一键导入
seo
Reference and checklist for SEO metadata on any page. Use when writing, reviewing, or debugging useHead() and useSeoMeta() on any page.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Reference and checklist for SEO metadata on any page. Use when writing, reviewing, or debugging useHead() and useSeoMeta() on any page.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | seo |
| description | Reference and checklist for SEO metadata on any page. Use when writing, reviewing, or debugging useHead() and useSeoMeta() on any page. |
| disable-model-invocation | true |
| argument-hint | <page path or page name> |
You are writing or reviewing SEO metadata for: $ARGUMENTS
The project uses @nuxtjs/seo v5. Every page needs both useHead() and useSeoMeta().
const runtimeConfig = useRuntimeConfig()
const route = useRoute()
const baseUrl = ref(runtimeConfig.public.i18n.baseUrl)
// URL path segment without locale prefix and without leading slash
const urlEndPath = '{page-path}' // e.g. 'plushies' or 'about'
// Path to OG image inside public/ (no leading slash)
const ogImageEndPath = 'og-image.webp' // or a page-specific image
const canonicalUrl = computed(() => `${baseUrl.value}${route.path}`)
route.path includes the locale prefix (/fr/... or /en/...) so canonicalUrl is always locale-correct.
useHead({
title: computed(() => t('pages.{page}.tab_name')),
meta: [
{
name: 'description',
content: computed(() => t('pages.{page}.meta.content')),
},
{
name: 'keywords',
content: `${computed(() => t('miscellaneous.vtuber')).value},
${computed(() => t('miscellaneous.creator')).value},
${computed(() => t('miscellaneous.handmade')).value},
${computed(() => t('app.name')).value},
`,
},
],
link: [
{ rel: 'canonical', href: canonicalUrl.value },
{
rel: 'alternate',
href: computed(() => `${baseUrl.value}/en/${urlEndPath}`),
hreflang: 'en-US',
},
{
rel: 'alternate',
href: computed(() => `${baseUrl.value}/fr/${urlEndPath}`),
hreflang: 'fr-FR',
},
{
rel: 'alternate',
href: computed(() => `${baseUrl.value}/fr/${urlEndPath}`),
hreflang: 'x-default',
},
],
})
en-US, fr-FR, x-defaultx-default always points to /fr/ — French is the default localeurlEndPath (no locale prefix) and prepend /en/ or /fr/ manuallyhref: computed(() => baseUrl.value) for x-default (no path suffix)route.path for hreflang alternates — it carries the current localeuseSeoMeta({
ogTitle: '%s %separator %siteName',
twitterTitle: '%s %separator %siteName',
appleMobileWebAppTitle: '%s %separator %siteName',
description: computed(() => t('pages.{page}.meta.content')),
ogDescription: computed(() => t('pages.{page}.meta.content')),
twitterDescription: computed(() => t('pages.{page}.meta.content')),
ogImage: `${baseUrl.value}/${ogImageEndPath}`,
ogImageSecureUrl: `${baseUrl.value}/${ogImageEndPath}`,
ogImageAlt: computed(() => t('pages.{page}.meta.content')),
ogImageType: 'image/webp',
ogImageWidth: '1200',
ogImageHeight: '630',
twitterImage: `${baseUrl.value}/${ogImageEndPath}`,
twitterImageAlt: computed(() => t('pages.{page}.meta.content')),
twitterImageType: 'image/webp',
ogUrl: canonicalUrl.value,
ogType: 'article',
articleTag: [
computed(() => t('miscellaneous.vtuber')).value,
computed(() => t('miscellaneous.creator')).value,
computed(() => t('app.name')).value,
// ... add page-specific keywords
],
msapplicationTileImage: `${baseUrl.value}/${ogImageEndPath}`,
})
articleTag values use .value directly (resolved strings, not reactive refs).
All other i18n values must be computed(() => t(...)).
Inside useHead() and useSeoMeta(), all t() calls must be wrapped in computed():
// ✅ Reactive — updates when locale changes
content: computed(() => t('pages.plushies.meta.content'))
// ❌ Wrong — stale on locale switch
content: t('pages.plushies.meta.content')
Exception: articleTag resolves with .value:
articleTag: [
computed(() => t('miscellaneous.plushies')).value, // ✅ resolved string
]
Always include these on every page:
miscellaneous.vtubermiscellaneous.creatorapp.nameAdd page-specific keywords:
| Page | Additional keywords |
|---|---|
| Home | streaming, polar_fox, stars, mascot, handmade, plushies |
| About | polar_fox, mascot, stars, streaming, handmade, plushies |
| Plushies | plushies, handmade, stars |
| Contact | streaming, stars |
Example (FR, 104 chars):
"Découvrez la collection de peluches faites main par Mellumine, chacune cousue avec amour, étoile par étoile."
Default: og-image.webp (in public/) — the site-wide OG image.
For future page-specific images: use a representative WebP image from public/images/.
ogImageType must always be 'image/webp' (not 'image/jpeg').
i18n management for Mellumine: key structure, naming conventions, both-locale rule, and translation quality guidelines. Use when adding or modifying translation entries.
Vue 3 + Nuxt 4 best practices for Mellumine: Composition API, auto-imports, TypeScript, SCSS, CSS custom properties, and component conventions.
Add a new plushie to the Mellumine collection: update data.ts and both locale files. Use when adding any new plushie to the site.
Manage translation entries in fr-FR.json and en-US.json. Use when adding, modifying, or reviewing i18n keys for pages, components, or images.
Vue 3 + Nuxt 4 conventions for this project: SFC structure, auto-imports, TypeScript, SCSS, CSS custom properties, components, and composables. Use when writing or reviewing any .vue file.
Add a new plushie entry to data.ts and both locale files. Use when the user provides a new plushie to add to the collection.