From 49ed94e22ec742c0ed1563d97740da07460a09f4 Mon Sep 17 00:00:00 2001 From: wattanx Date: Sun, 11 Jun 2023 22:56:39 +0900 Subject: [PATCH 1/8] feat: replace with @unhead/vue --- packages/bridge/build.config.ts | 3 +- packages/bridge/package.json | 2 + packages/bridge/src/head.ts | 43 ++++++++++--- packages/bridge/src/imports/presets.ts | 1 - packages/bridge/src/runtime/app.plugin.mjs | 2 +- .../bridge/src/runtime/head/components.ts | 55 +++++++++++++++-- .../bridge/src/runtime/head/composables.ts | 16 +---- packages/bridge/src/runtime/head/plugin.ts | 39 +----------- .../bridge/src/runtime/head/plugins/unhead.ts | 43 +++++++++++++ .../src/runtime/head/vueuse-head.plugin.ts | 59 ------------------ playground/nuxt.config.ts | 10 ++++ playground/pages/head-script-setup.vue | 57 ++++++++++++++++++ playground/pages/head.vue | 37 ++++++++++++ pnpm-lock.yaml | 59 +++++++++++------- test/bridge.test.ts | 60 +++++++++++++++++++ 15 files changed, 338 insertions(+), 148 deletions(-) create mode 100644 packages/bridge/src/runtime/head/plugins/unhead.ts delete mode 100644 packages/bridge/src/runtime/head/vueuse-head.plugin.ts create mode 100644 playground/pages/head-script-setup.vue create mode 100644 playground/pages/head.vue diff --git a/packages/bridge/build.config.ts b/packages/bridge/build.config.ts index 8943b9ea2..a7ead832e 100644 --- a/packages/bridge/build.config.ts +++ b/packages/bridge/build.config.ts @@ -10,6 +10,7 @@ export default defineBuildConfig({ 'webpack', 'vite', 'vue', - 'vue-meta' + 'vue-meta', + '@unhead/vue' ] }) diff --git a/packages/bridge/package.json b/packages/bridge/package.json index 3fa410a0c..1474d946e 100644 --- a/packages/bridge/package.json +++ b/packages/bridge/package.json @@ -29,6 +29,8 @@ "@nuxt/postcss8": "^1.1.3", "@nuxt/schema": "3.5.3", "@nuxt/ui-templates": "^1.1.1", + "@unhead/ssr": "^1.1.27", + "@unhead/vue": "^1.1.27", "@vitejs/plugin-legacy": "^4.0.4", "@vitejs/plugin-vue2": "^2.2.0", "acorn": "^8.8.2", diff --git a/packages/bridge/src/head.ts b/packages/bridge/src/head.ts index 4c601342c..c7a5e4f2b 100644 --- a/packages/bridge/src/head.ts +++ b/packages/bridge/src/head.ts @@ -1,9 +1,11 @@ import { resolve } from 'pathe' -import { addPlugin, addTemplate, defineNuxtModule, tryResolveModule } from '@nuxt/kit' +import { addComponent, addImportsSources, addPlugin, addTemplate, defineNuxtModule } from '@nuxt/kit' import { defu } from 'defu' import type { MetaObject } from '@nuxt/schema' import { distDir } from './dirs' +const components = ['NoScript', 'Link', 'Base', 'Title', 'Meta', 'Style', 'Head', 'Html', 'Body'] + export default defineNuxtModule({ meta: { name: 'meta' @@ -15,13 +17,26 @@ export default defineNuxtModule({ setup (options, nuxt) { const runtimeDir = nuxt.options.alias['#head'] || resolve(distDir, 'head/runtime') - // Transpile @nuxt/meta and @vueuse/head - nuxt.options.build.transpile.push('@vueuse/head') - nuxt.options.build.transpile.push('unhead') + // Transpile @unhead/vue + nuxt.options.build.transpile.push('@unhead/vue') // Add #head alias nuxt.options.alias['#head'] = runtimeDir + // Register components + const componentsPath = resolve(runtimeDir, 'components') + for (const componentName of components) { + addComponent({ + name: componentName, + filePath: componentsPath, + export: componentName, + // built-in that we do not expect the user to override + priority: 10, + // kebab case version of these tags is not valid + kebabName: componentName + }) + } + // Global meta -for Bridge, this is necessary to repeat here // and in packages/schema/src/config/_app.ts const globalMeta: MetaObject = defu(nuxt.options.app.head, { @@ -35,14 +50,24 @@ export default defineNuxtModule({ getContents: () => 'export default ' + JSON.stringify({ globalMeta, mixinKey: 'setup' }) }) - if (!tryResolveModule('@vueuse/head')) { - console.warn('[bridge] Could not find `@vueuse/head`. You may need to install it.') - } + addImportsSources({ + from: '@unhead/vue', + // hard-coded for now we so don't support auto-imports on the deprecated composables + imports: [ + 'injectHead', + 'useHead', + 'useSeoMeta', + 'useHeadSafe', + 'useServerHead', + 'useServerSeoMeta', + 'useServerHeadSafe' + ] + }) // Add generic plugin addPlugin({ src: resolve(runtimeDir, 'plugin') }) - // Add library specific plugin - addPlugin({ src: resolve(runtimeDir, 'vueuse-head.plugin') }) + // Add library-specific plugin + addPlugin({ src: resolve(runtimeDir, 'plugins/unhead') }) } }) diff --git a/packages/bridge/src/imports/presets.ts b/packages/bridge/src/imports/presets.ts index 5bac68694..0b453136b 100644 --- a/packages/bridge/src/imports/presets.ts +++ b/packages/bridge/src/imports/presets.ts @@ -5,7 +5,6 @@ export const commonPresets: InlinePreset[] = [ defineUnimportPreset({ from: '#head', imports: [ - 'useHead', 'useMeta' ] }), diff --git a/packages/bridge/src/runtime/app.plugin.mjs b/packages/bridge/src/runtime/app.plugin.mjs index 40bc03508..43bfe915c 100644 --- a/packages/bridge/src/runtime/app.plugin.mjs +++ b/packages/bridge/src/runtime/app.plugin.mjs @@ -41,7 +41,7 @@ export default async (ctx, inject) => { provide: inject, unmount: () => { }, use (vuePlugin) { - runOnceWith(vuePlugin, () => vuePlugin.install(this)) + runOnceWith(vuePlugin, () => Vue.use(vuePlugin)) }, version }, diff --git a/packages/bridge/src/runtime/head/components.ts b/packages/bridge/src/runtime/head/components.ts index 651b77fb8..72e30096a 100644 --- a/packages/bridge/src/runtime/head/components.ts +++ b/packages/bridge/src/runtime/head/components.ts @@ -1,6 +1,6 @@ import { defineComponent } from 'vue' import type { SetupContext } from 'vue' -import { useHead } from './composables' +import { useHead } from '@unhead/vue' type Props = Readonly> @@ -58,10 +58,36 @@ const globalProps = { translate: String } +//