Skip to content

chore(deps): update dependency @unhead/vue to v3 - #2602

Open
renovate[bot] wants to merge 1 commit into
v3from
renovate/major-unhead-monorepo
Open

renovate[bot] wants to merge 1 commit into
v3from
renovate/major-unhead-monorepo

Conversation

@renovate

@renovate renovate Bot commented Jul 11, 2026 •

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
@unhead/vue (source) 2.1.17 → 3.4.2 age confidence

Release Notes

unjs/unhead (@​unhead/vue)

v3.4.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.4.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.4.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.3.2

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.3.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.3.0

Compare Source

Projects using the Unhead Bundler with Vite 6 or 7, webpack, Rspack, Rollup, or another build without Rolldown no longer receive oxc-parser from @unhead/bundler. Builds that use Unhead transforms must install it directly.

📝 Migration
pnpm add -D oxc-parser

Runtime-only Unhead projects and builds with Rolldown installed need no change.

   🚨 Breaking Changes
   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.2.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.2.2

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.2.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.2.0

Compare Source

   🚀 Features
   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.1.8

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.7

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.1.6

Compare Source

   🏎 Performance
    View changes on GitHub

v3.1.5

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.1.4

Compare Source

   🐞 Bug Fixes
   🏎 Performance
    View changes on GitHub

v3.1.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.1.0

Compare Source

🛠️ Unhead CLI

To assist with migrations and overall DX a CLI has been introduced: @unhead/cli.

npx -y @unhead/cli 

It lets you do the following:

          audit    Lint your codebase for unhead misuse, type-narrowing issues, and SEO/perf foot-guns.                      
        migrate    Apply autofixes for v2-to-v3 migration: rewrite deprecated props and wrap tag literals in defineX helpers.
  validate-html    Run the runtime ValidatePlugin over prerendered HTML files (e.g. dist/, .output/, build/).                
   validate-url    Fetch a rendered URL and run unhead\'s SEO/perf validation rules over its <head>.         

For example, try running audit on your own project for hints on how to improve your SEO.

✔️ Unhead ESLint

Knowing that your useHead() and useSeoMeta() code is right while your coding is important. While type-narrowing solves many broken cases, we introduce an ESLint plugin to help catch anything that the typechecker can't catch.

These rules are shared from the runtime ValidatePlugin

# flat-config ESLint plugin with v2→v3 migration autofixes
npm i -D @unhead/eslint-plugin
```ts [eslint.config.ts]
import { configs } from '@&#8203;unhead/eslint-plugin'

export default [
  configs.recommended,
]

🌊 Streaming SSR non-Vite support

The streaming plugin lived only at unhead/stream/vite previously, leaving non-Vite users with no way to wire the bootstrap. The plugin is now a bundler-agnostic unplugin factory with first-class webpack and Vite entries, and the framework packages compose it behind Unhead({ streaming: true }).

// vite.config.ts
import { Unhead } from '@&#8203;unhead/vue/vite'
export default { plugins: [vue(), Unhead({ streaming: true })] }

// webpack.config.ts
import { Unhead } from '@&#8203;unhead/vue/bundler'
export default { plugins: [...Unhead({ streaming: true }).webpack()] }

Streaming also gains a nonce option (forwarded on every injected <script> for CSP support), a fixed async mode for production Vite builds (the IIFE is now emitted via this.emitFile() so the script src references a real hashed asset), a dev-mode warning when the client IIFE runs against an empty server queue, and a shared StreamingGlobal type so the server bootstrap, client, and injected IIFE agree on the shape of window.__unhead__. Default mode changed from async to inline for smaller TTFB.

Changelog

   🚀 Features
   🐞 Bug Fixes
    View changes on GitHub

v3.0.5

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.4

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.3

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.2

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.1

Compare Source

   🐞 Bug Fixes
    View changes on GitHub

v3.0.0

Compare Source

Unhead v3 rebuilds the rendering engine from the ground up. The motivation: streaming SSR. Frameworks like Nuxt, SolidStart, and SvelteKit stream HTML to the browser as data loads, but head tags were still stuck in a request/response model, resolved once and never updated. To fix this properly, we had to make rendering synchronous, pluggable, and side-effect free. The result is a faster, smaller, and more capable head manager.

📣 Highlights

🌊 Streaming SSR

Head tags now update dynamically as suspense boundaries resolve during streaming. As each chunk streams to the browser, new <title>, <meta>, and <link> tags are pushed to a client-side queue and applied to the DOM. No waiting for the full page to load.

// entry-server.ts
import { createStreamableHead } from '@&#8203;unhead/vue/stream/server'

const { head, wrapStream } = createStreamableHead()
app.use(head)

// wraps the Vue stream, injecting head updates as chunks resolve
return wrapStream(renderToWebStream(app), template)
// entry-client.ts
import { createStreamableHead } from '@&#8203;unhead/vue/stream/client'

const head = createStreamableHead()
app.use(head)

Under the hood: a queue stub (window.__unhead__) collects head entries as they stream in before the main JS bundle loads. Once the client head instance initializes, it processes the queue and takes over. No entries are ever lost regardless of timing.

Streaming is supported for Vue, React, Solid.js, Svelte, and vanilla TypeScript. See PR #​537.

🛠️ Unified Vite Plugin + DevTools

A single @unhead/{framework}/vite plugin replaces the old manual composition of @unhead/addons + streaming plugin + framework glue. One import, one call, and you get tree-shaking, useSeoMeta → useHead transform, inline minification, streaming SSR, dev-mode ValidatePlugin auto-injection, and Vite DevTools integration.

// vite.config.ts
import { Unhead } from '@&#8203;unhead/vue/vite'
import vue from '@&#8203;vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue(), Unhead()],
})

The DevTools panel surfaces live head state during development: every useHead() / useSeoMeta() call with its source file and line number, resolved tags, SEO overview (title, description, canonical, Open Graph), useScript() load status, active plugins, template params, and warnings from the Validate plugin. Source tracing lets you click through from any tag back to the exact line that created it.

Available for Vue, React, Svelte, Solid, and vanilla via @unhead/bundler/vite (the renamed @unhead/addons package; the old name still works with a deprecation warning).

See PRs #​726, #​733, #​731.

🎯 useHead() Type Narrowing

useHead() now narrows types based on input. Link, script, and meta tags resolve to specific subtypes instead of a generic union, so you get precise autocomplete and type errors when something is wrong.

useHead({
  link: [
    // Narrows to StylesheetLink: requires href, offers media, integrity, etc.
    { rel: 'stylesheet', href: '/styles.css' },
    // Narrows to PreloadLink: requires as attribute
    { rel: 'preload', as: 'font', href: '/font.woff2', crossorigin: 'anonymous' },
  ],
  script: [
    // Narrows to ModuleScript
    { src: '/app.mjs', type: 'module' },
    // Narrows to JsonLdScript
    { type: 'application/ld+json', innerHTML: '{}' },
  ],
})

See PRs #​627, #​665, #​729.

✅ ValidatePlugin

New optional ValidatePlugin that inspects resolved head output and warns about common mistakes: missing titles, duplicate meta tags, contradictory preload priorities, render-blocking scripts, late <meta charset>, too many fetchpriority="high" hints, preconnect without crossorigin, and more. Also includes v2 migration rules that detect deprecated property names (children, hid/vmid, body: true), missing TemplateParamsPlugin, and missing AliasSortingPlugin — all of which cause silent breakage on upgrade. Auto-injected in dev by the unified Vite plugin so warnings surface in the browser console without any manual setup. Fully tree-shakeable. Rules use ESLint-style flat config:

import { ValidatePlugin } from 'unhead/plugins'

createHead({
  plugins: [
    ValidatePlugin({
      rules: {
        'missing-description': 'off',
      }
    })
  ]
})

See PRs #​690, #​691, #​716, #​722, #​725, #​732.

🔗 Canonical Plugin

New built-in CanonicalPlugin that auto-generates <link rel="canonical"> tags and resolves relative URLs to absolute in og:image, twitter:image, and og:url. Includes query parameter filtering (strips tracking params like utm_source, fbclid, gclid by default), trailing slash normalization, and automatic hash fragment stripping. Essential for SEO and social sharing.

import { CanonicalPlugin } from 'unhead/plugins'

createHead({
  plugins: [
    CanonicalPlugin({
      canonicalHost: 'https://mysite.com',
      trailingSlash: true,
      queryWhitelist: ['page', 'sort'],
    })
  ]
})

See PRs #​492, #​713.

🗜️ MinifyPlugin

New optional MinifyPlugin that minifies inline <script> and <style> tag content during SSR. Uses lightweight pure-JS minifiers with zero native dependencies, safe for edge and serverless runtimes. A companion build-time transform (MinifyTransform in @unhead/bundler) pre-minifies static innerHTML literals at compile time. Standalone utilities (minifyJS, minifyCSS, minifyJSON) are also available via unhead/minify.

import { MinifyPlugin } from 'unhead/plugins'

createHead({
  plugins: [MinifyPlugin()]
})

See PR #​705.

📦 Performance

Build v3 size v2 size Delta gz
client 10254 11513 -534 (-11.2%)
server 9894 10361 -194 (-4.6%)
vueClient 11323 12567 -533 (-10.2%)
vueServer 10849 11312 -191 (-4.1%)
Benchmark v2 mean v3 mean Delta
@unhead/vue 0.106ms 0.072ms 32% faster
core 0.088ms 0.073ms 17% faster

Key optimizations:

  • Client-only CAPO sorting (#​626)
  • Pure, tree-shakeable core with no side effects (#​632)
  • Minified internal DOM state properties (#​635)
  • Migrated unplugins from estree-walker/acorn-loose to oxc-walker (#​663)
  • Walker-based transformHtmlTemplate (#​581)
  • TemplateParamsPlugin and AliasSortingPlugin made opt-in for smaller bundles (#​493, #​494)

📊 Schema.org

  • 12 new nodes: Dataset, MusicAlbum, MusicGroup, MusicPlaylist, MusicRecording, PodcastEpisode, PodcastSeason, PodcastSeries, Service, TVEpisode, TVSeason, TVSeries (#​612)
  • Graph resolution rewrite for correctness and performance (#​616)
  • Removed ohash and defu dependencies (#​605)

🔄 Other Changes

  • renderDOMHead() / renderSSRHead() are now fully synchronous, single-pass via a composable resolveTags() pipeline; the head instance exposes a pluggable render() function for framework integrations (#​619, #​622, #​628, #​629, #​630)
  • @unhead/react/helmet drop-in compat export for users migrating from react-helmet (#​719)
  • useHeadSafe() now whitelists CSS styles (#​491)
  • Support for blocking attribute on scripts and stylesheets (#​489)
  • useScript() consolidated back into core, legacy support dropped (#​498)
  • fediverse:creator meta tag support (#​703)
  • Switched from hookable to lighter HookableCore with sync-only hooks (#​631)
  • Deprecation warnings added to aliased packages (@unhead/schema, @unhead/shared) (#​678)
  • templateParams extensible via module augmentation (#​679)
  • Respect user-provided twitter:card in InferSeoMetaPlugin (#​681)
  • Enforce as attribute for preload links (#​683)
  • onRendered callback option on useHead() for synchronizing with DOM head updates (#​712)
  • tagWeight option on createHead() to override default CAPO tag weight function (#​716)

🐛 Bug

❗ Important

✂ PR body was truncated to here.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 2 times, most recently from 257fd60 to 1b06288 Compare July 17, 2026 10:31
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 5 times, most recently from f5069e3 to 2b48fce Compare July 24, 2026 18:58
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 3 times, most recently from 9107cc6 to 100b406 Compare August 4, 2026 11:33
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 3 times, most recently from 08f8a22 to 9e904d5 Compare August 13, 2026 11:52
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch from 9e904d5 to 5fc14c3 Compare August 21, 2026 19:37
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 7 times, most recently from 7000f8f to 9603cce Compare September 10, 2026 20:44
@coderabbitai

coderabbitai Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: ee77a33d-cd7e-4c1b-aa20-72a5e920f82f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 5 times, most recently from 9579320 to 03e51f8 Compare September 15, 2026 12:29
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch 2 times, most recently from c9c9a8e to d16ba82 Compare September 29, 2026 18:04
@renovate
renovate Bot force-pushed the renovate/major-unhead-monorepo branch from d16ba82 to 436e488 Compare October 5, 2026 16:44

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants