如何在 Vue.js 3 中使用 Vue 3 Meta?

vol*_*one 7 javascript vue.js vue-meta vuejs3

似乎Vue Meta已升级为使用名为的新 npm 包处理 Vue.js 3vue-3-meta

在 Vue.js 3 之前,vue-meta通过将其添加到 Vue 实例中很容易使用:

import Vue from 'vue'
import VueMeta from 'vue-meta'
 
Vue.use(VueMeta, {
  // optional pluginOptions
  refreshOnceOnNavigation: true
})
Run Code Online (Sandbox Code Playgroud)

但是在 Vue.js 3 中,没有 Vue 实例;而是通过运行createApp这样的方式来创建应用程序:

const app = createApp(App);
const router = createVueRouter();

app.use(router);
// need to make app use Vue-Meta here
Run Code Online (Sandbox Code Playgroud)

我找不到任何文档vue-3-metaimport VueMeta from 'vue-meta'不再有效。

如何vue-3-meta正确导入插件并将其与app之前版本中的一样使用?

Aja*_*les 12

免责声明:vue-meta v3仍处于 alpha 阶段!

这是我开始所需的最小实现:

  1. 更新vue-meta到 v3(在 package.json 中)

    - "vue-meta": "^2.4.0",
    + "vue-meta": "^3.0.0-alpha.7",
    
    Run Code Online (Sandbox Code Playgroud)

    ...或用纱线:

    - "vue-meta": "^2.4.0",
    + "vue-meta": "^3.0.0-alpha.7",
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加metaManager到 Vue 应用程序

    import { createMetaManager } from 'vue-meta'
    
    const app = createApp(App)
      .use(router)
      .use(store)
      .use(createMetaManager()) // add this line
    
    await router.isReady()
    app.mount('#app')
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加<metainfo>到App.vue <template>(这也是我设置“标题模板”的地方)

    <template>
      <metainfo>
        <template v-slot:title="{ content }">{{ content ? `${content} | SITE_NAME` : `SITE_NAME` }}</template>
      </metainfo>
      <header />
      <router-view />
      <footer />
    </template>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在 App.vue Vue 3 vanilla 中设置默认元<script>

    import { useMeta } from 'vue-meta'
    
    export default {
      setup () {
        useMeta({
          title: '',
          htmlAttrs: { lang: 'en', amp: true }
        })
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    或与vue-class-component

    import { setup, Vue } from 'vue-class-component'
    import { useMeta } from 'vue-meta'
    
    export default class App extends Vue {
      meta = setup(() => useMeta({
        title: '',
        htmlAttrs: { lang: 'en', amp: true }
      })
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 覆盖每个组件Vue 3 vanilla 中的meta

    import { useMeta } from 'vue-meta'
    
    export default {
      setup () {
        useMeta({ title: 'Some Page' })
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    或与vue-class-component

    import { computed } from '@vue/runtime-core'
    import { setup, Vue } from 'vue-class-component'
    import { useMeta } from 'vue-meta'
    
    export default class SomePage extends Vue {
      meta = setup(() => useMeta(
        computed(() => ({ title: this.something?.field ?? 'Default' })))
      )
    }
    
    Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 在没有任何适当的文档的情况下,您是如何设法解决所有这些问题的?我在任何地方都找不到这些东西的记录! (3认同)
  • @volumeone - 主要来自 GitHub 存储库中的 vue-router 示例(确保您正在查看“下一个”分支中的代码。一些来自自述文件(再次“下一个”分支)以及阅读任何看起来的问题对于 Vue 3。我仍然在计算元 + vue-class-component 上挣扎。 (2认同)

Ele*_*nic 6

除了前面的答案之外,我还需要transpileDependency在我的中添加一个vue.config.js,因为我正在使用vue-cli

module.exports = {
  transpileDependencies: ['vue-meta']
}
Run Code Online (Sandbox Code Playgroud)

否则,我会收到错误:

error  in ./node_modules/vue-meta/dist/vue-meta.esm-browser.min.js

Module parse failed: Unexpected token (8:7170)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
Run Code Online (Sandbox Code Playgroud)

感谢该线程向我指出这一点: https: //stackoverflow.com/a/65844988/3433137

  • 我找到了一个更好的解决方案,即删除 vue-meta 并使用 @vueuse/head https://github.com/vueuse/head (7认同)