关于 unhead-vue-skilld
用于在客户端渲染和服务端渲染应用中管理文档 head 标签与元数据的 Vue 3 库。它提供响应式组合式函数、脚本处理和构建集成。
主要功能
- 01响应式 head 与 SEO 元数据
- 02安全的元数据处理
- 03第三方脚本加载
- 04客户端与服务端渲染支持
- 05Vite 和打包器构建插件
适用场景
- 01根据 Vue 响应式状态更新页面元数据
- 02在 SSR 期间渲染 head 标签
- 03加载并调用第三方脚本
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill unhead-vue-skilld安装后在 Claude Code 中输入/unhead-vue-skilld确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/api-surface.mdbuild-plugins.mdcomposables.mdmigration.mdsetup.md详细介绍
@unhead/vue 3.4.1
适用于 Vue 3 的全栈 <head> 管理。仅支持 ESM("type": "module"),不支持 CJS。
Peer 依赖:vue >= 3.5.18;可选依赖:vite >= 6.4.2、webpack >= 5.0.0(来源:package.json:138-150)。
Vue 2:不支持;请使用 @unhead/vue@^1。
Nuxt:已集成 Unhead;请勿手动安装或配置。
设置(必需)
安装 @unhead/vue,创建 head 实例,并将其注册为 Vue 插件。createHead 来自子路径导出,而非包根目录。
// entry-client.ts (SPA or hydration)
import { createHead } from '@unhead/vue/client'
import { createApp } from './main'
const { app } = createApp()
const head = createHead()
app.use(head)
app.mount('#app')
// entry-server.ts (SSR)
import { createHead } from '@unhead/vue/server'
import { renderToString } from 'vue/server-renderer'
import { createApp } from './main'
export async function render(url: string) {
const { app } = createApp()
const head = createHead()
app.use(head)
const html = await renderToString(app)
return { html, head } // render tags later with transformHtmlTemplate(head, template)
}
完整的 SSR 模板接线、流式 SSR、Options API 和自动导入:references/setup.md。
组合式函数
全部从 @unhead/vue 根目录导入,并在 setup() 中使用:
<script setup lang="ts">
import { useHead, useSeoMeta } from '@unhead/vue'
useHead({
title: () => `${user.value.name} - Profile`, // getters, refs, computed all reactive
titleTemplate: '%s | My Site',
meta: [{ name: 'description', content: () => description.value }],
})
useSeoMeta({ // flat, type-safe keys; og/twitter handled automatically
ogTitle: 'My Page',
ogImage: 'https://example.com/image.jpg',
})
</script>
// Third-party scripts
import { useScript } from '@unhead/vue'
const { proxy, onLoaded, status } = useScript(
{ src: 'https://example.com/analytics.js' },
{ use: () => window.analytics, trigger: 'client' },
)
proxy.track('pageview') // queued until the script loads
详情、选项表和用法示例:references/composables.md。
重要规则
- 异步上下文:在
onMounted()/侦听器中await之后调用useHead()会抛出useHead() was called without provide context。按以下优先顺序修复:在<script setup>中使用顶层await;使用 refs/computed 声明一次useHead(),之后更新 ref;在 setup 时捕获const head = injectHead(),并传入useHead(input, { head })。来源:https://unhead.unjs.io/docs/vue/head/guides/core-concepts/reactivity-and-context - 切勿在侦听器回调中调用
useHead():每次调用都会新增一个条目并造成标签重复。请将响应式值传入一次useHead()调用。 - 去重键是
key,而不是hid/vmid:meta: [{ key: 'description', name: 'description', content: '...' }]。 - 内联内容:使用
innerHTML(v1 中为children);body 脚本使用tagPosition: 'bodyClose'(以前是body: true)。 - 不可信输入:使用
useHeadSafe();它会将属性限制在白名单内,并移除脚本/事件处理程序。 - 在 Vue 中访问 head 实例:使用
@unhead/vue中的injectHead(),而不是unhead中的getActiveHead();只有前者会绑定到组件上下文(例如onServerPrefetch)。
3.4.1 中已弃用(仍存在,但计划移除)
| 导出项 | 状态 | 替代项 |
|---|---|---|
useServerHead、useServerHeadSafe、useServerSeoMeta | 已弃用(dist/index.d.ts:26-30) | useHead / useHeadSafe / useSeoMeta |
@unhead/vue/legacy(createHead、createServerHead、legacyPlugins) | 已弃用,将在 v4 中移除(dist/legacy.d.ts:14-30) | @unhead/vue/client / @unhead/vue/server |
resolveUnrefHeadInput | 已弃用(dist/utils.d.ts:9) | unhead/utils 中的 resolveTags(head) |
@unhead/vue/stream/vite 中的 unheadVuePlugin | 已弃用(dist/stream/vite.d.ts:8) | @unhead/vue/bundler 中的 Unhead({ streaming: true }).vite() |
MergeHead 类型 | 已弃用(dist/types.d.ts:66) | VueHeadClient 上的泛型 |
v3 中已移除(无法编译):DeprecationsPlugin、setHeadInjectionHandler、createHeadCore、{ mode: 'server' | 'client' } 条目选项、init/dom:renderTag/dom:rendered 钩子、headEntries()(请使用 [...head.entries.values()])。
迁移详情:references/migration.md。
导出映射
| 子路径 | 用途 |
|---|---|
@unhead/vue | 组合式函数:useHead、useSeoMeta、useHeadSafe、useScript、injectHead、VueHeadMixin、unheadVueComposablesImports、createUnhead、defineLink、defineScript |
@unhead/vue/client | createHead()(SPA/水合)、renderDOMHead、VueHeadMixin |
@unhead/vue/server | createHead()(SSR)、renderSSRHead、transformHtmlTemplate、propsToString |
@unhead/vue/components | <Head> 组件 |
@unhead/vue/plugins | 重新导出 unhead/plugins(TemplateParamsPlugin、AliasSortingPlugin、PromisePlugin、InferSeoMetaPlugin、ValidatePlugin 等) |
@unhead/vue/bundler | 适用于 vite/webpack/rspack/rollup 的统一构建插件 Unhead() |
@unhead/vue/vite | 仅适用于 Vite 的 Unhead();建议使用 /bundler |
@unhead/vue/stream/server、/stream/client | 用于流式 SSR 的 createStreamableHead() |
@unhead/vue/types、/utils、/scripts、/legacy | 类型、工具、脚本类型、旧版兼容层 |
签名和完整类型接口:references/api-surface.md。
创建时使用可选插件
模板参数(%s、%separator)、别名排序(before:/after:)和 Promise 输入自 v2 起均为可选项:
import { createHead } from '@unhead/vue/client'
import { AliasSortingPlugin, TemplateParamsPlugin } from '@unhead/vue/plugins'
const head = createHead({ plugins: [TemplateParamsPlugin, AliasSortingPlugin] })
如果没有 TemplateParamsPlugin,%siteName 占位符会按原样显示。
构建插件(推荐用于独立 Vue 应用)
// vite.config.ts
import { Unhead } from '@unhead/vue/bundler'
export default defineConfig({
plugins: [vue(), Unhead()], // add { streaming: true } for streaming SSR
})
从客户端构建包中移除仅供服务端使用的组合式函数,将 useSeoMeta() 转换为 useHead()(约 3kb),并在开发环境中注入 ValidatePlugin。选项表和 webpack 说明:references/build-plugins.md。
常见错误
- 从
@unhead/vue根路径导入createHead(v2 中已移除):请使用/client或/server。 - 对
renderSSRHead/renderDOMHead使用await:两者在 v3 中均为同步函数。 useScript()的返回值不是 Promise:请使用onLoaded(() => ...);通过.proxy调用 API。- Meta 标签需要
content:{ name: 'description', content: null }会移除该标签。 - 字体预加载需要
crossorigin:{ rel: 'preload', as: 'font', href: '/f.woff2', crossorigin: 'anonymous' }。
参考资料
- references/setup.md — SPA、SSR、流式 SSR、Options API、
<Head>组件、自动导入、默认值 - references/composables.md —
useHead、useSeoMeta、useHeadSafe、useScript的用法和选项 - references/api-surface.md — 导出映射、类型、实例 API
- references/build-plugins.md —
Unhead()打包工具插件和流式处理 - references/migration.md — v2 和 v3 的重大变更