介绍
vue-meta
库提供了Vue插件,允许您从组件级别控制应用程序的元数据。
用于搜索引擎优化(SEO)的Web应用程序的元数据是很重要的,但在使用单页Web应用程序(SPA)时,这往往是一个繁琐的任务。
在本文中,您将探索vue-meta
插件如何以简洁、逻辑的方式为您处理此问题,同时为您提供更大的应用程序元数据控制权。
前提条件
如果您想跟随这篇文章,您将需要:
- Some familiarity with
<head>
,<title>
,<meta>
. - Some familiarity with setting up a Vue.js project.
本教程已通过 Node v15.8.0, npm
v7.5.4, Vue v12.6.11 和 vue-meta
v2.4.0 进行验证。
使用Vue-Meta
首先,要使用vue-meta
,打开终端并导航到现有的Vue项目目录,然后运行以下命令:
1npm install [email protected]
接下来,用您的代码编辑器打开main.js
文件并启动插件:
1[label src/main.js]
2import Vue from 'vue'
3import VueMeta from 'vue-meta'
4import App from 'App.vue'
5
6Vue.use(VueMeta)
7
8new Vue({
9 render: h => h(App),
10}).$mount('#app')
保存您的更改,然后vue-meta
将可用于您的应用程序。
与Vue Router的集成
如果您正在使用一个路由解决方案,如 vue-router
,那么您可以在您的 router/index.js
文件中启动 vue-meta
:
1[label src/router/index.js]
2import Vue from 'vue'
3import Router from 'vue-router'
4import VueMeta from 'vue-meta'
5
6Vue.use(Router)
7Vue.use(VueMeta)
8
9export default new Router({})
保存您的更改,然后vue-meta
和vue-router
将可用于您的应用程序。
与服务器侧渲染的集成
如果您使用的是 Server Side Rendering (SSR),则在安装 root 实例Vue
之前,您需要在运行在服务器和客户端的文件中启动vue-meta
。
与Vue Frameworks的集成
如果您正在使用一个已经使用vue-meta
的框架,例如 NuxtJS,则不需要启动。
其他已经使用vue-meta
的框架包括 Gridsome, Ream, Vue-Storefront和 Factor JS。
定制 Plugin 选项
「vue-meta」提供了自定义插件行为的选项。「NuxtJS」通过将「metaInfo」属性的名称更改为「head」来利用此功能。
您可以通过使用keyName
启动vue-meta
来复制:
1[label src/main.js]
2import Vue from 'vue'
3import VueMeta from 'vue-meta'
4import App from 'App.vue'
5
6Vue.use(VueMeta, {
7 keyName: 'head'
8})
9
10new Vue({
11 el: '#app',
12 render: h => h(App)
13})
请检查 官方文件中可用的完整选项清单。
人口代码
「vue-meta」允许您在父母和子女组件上更新「
1[label src/App.vue]
2export default {
3 name: 'App',
4 metaInfo: {
5 title: 'Default App Title',
6 titleTemplate: '%s | vue-meta Example App'
7 },
8 // ...
9}
此titleTemplate
将产生以下<title>
:
1[secondary_label Output]
2<title>
3 Default App Title | vue-meta Example App
4</title>
通常你想包含其他信息传递给浏览器或网页扫描仪,如页面的charset
,description
或viewport
。
1[label src/App.vue]
2export default {
3 name: 'App',
4 metaInfo: {
5 title: 'Default App Title',
6 titleTemplate: '%s | vue-meta Example App',
7 htmlAttrs: {
8 lang: 'en-US'
9 },
10 meta: [
11 { charset: 'utf-8' },
12 { name: 'description', content: 'An example Vue application with vue-meta.' },
13 { name: 'viewport', content: 'width=device-width, initial-scale=1' }
14 ]
15 },
16 // ...
17}
此代码将生成以下输出:
1[secondary_label Output]
2<html lang="en-US">
3 <head>
4 <title>Default App Title | vue-meta Example App</title>
5 <meta charset="utf-8">
6 <meta name="description" content="'An example Vue application with vue-meta.">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 </head>
9</html>
请确保查看vue-meta
API 文档中的 `metaInfo 属性 spec 以查看所有可用的选项。
理解父母和儿童组件的metaInfo
行为
儿童组件将与父母重复合并元数据,这使我们能够根据当前安装的组件来更新页面的元数据。
应用程序
组件是一个主组件,其中标题
和标题模板
定义为:
1[label src/App.vue]
2<template>
3 <div>
4 <HelloWorld />
5 </div>
6</template>
7
8<script>
9import HelloWorld from './components/HelloWorld.vue'
10
11export default {
12 name: 'App',
13 metaInfo: {
14 title: 'Default App Title',
15 titleTemplate: '%s | vue-meta Example App'
16 },
17 components: {
18 HelloWorld
19 }
20}
21</script>
HelloWorld
组件是应用
组件的子组件,其中定义为标题
:
1[label src/components/HelloWorld.vue]
2<template>
3 <div>Hello World!</div>
4</template>
5
6<script>
7export default {
8 name: 'HelloWorld',
9 metaInfo: {
10 title: 'Hello World!'
11 }
12}
13</script>
此代码将生成以下输出:
1[secondary_label Output]
2<title>
3 Hello World! | vue-meta Example App
4</title>
儿童组件的标题
取代了父母的标题
。
您还可以从儿童组件中禁用标题模板
,如下:
1[label src/components/HelloWorld.vue]
2export default {
3 name: 'HelloWorld',
4 metaInfo: {
5 title: 'Hello World!',
6 titleTemplate: null
7 }
8}
此代码将生成以下输出:
1[secondary_label Output]
2<title>
3 Hello World!
4</title>
如果两个子组件合并,并且两者都包含metaInfo
,最后一个子组件将用于填充页面的元数据。
假设您创建了一个名为HelloWorld2
的第二个儿童组件。
1[label src/App.vue]
2<template>
3 <div>
4 <HelloWorld />
5 <HelloWorld2 />
6 </div>
7</template>
8
9<script>
10import HelloWorld from './components/HelloWorld.vue'
11import HelloWorld2 from './components/HelloWorld2.vue'
12
13export default {
14 name: 'App',
15 metaInfo: {
16 title: 'Default App Title',
17 titleTemplate: '%s | vue-meta Example App'
18 },
19 components: {
20 HelloWorld,
21 HelloWorld2
22 }
23}
24</script>
HelloWorld2
组件是应用
组件的子组件,其定义为标题
- 与HelloWorld
组件定义的标题
不同:
1[label src/components/HelloWorld2.vue]
2<template>
3 <div>Hello World 2!</div>
4</template>
5
6<script>
7export default {
8 name: 'HelloWorld2',
9 metaInfo: {
10 title: 'Hello World 2!'
11 }
12}
13</script>
此代码将生成以下输出:
1[secondary_label Output]
2<title>
3 Hello World 2! | vue-meta Example App
4</title>
使用vue-meta
的多个Vue实例,只会更新最后一个应用程序的元数据!
只有重复的元数据将被子组件重写,其他元数据将被连接。
通过vmid
执行独特的metaInfo
行为
vue-meta
允许您将一个名为vmid
的特殊属性分配给您的metaInfo
,以便您可以控制它如何解决您的组件树。
如果两个元数据集具有相同的vmid
,例如父母和孩子,它们不会合并,而是孩子会超过父母。
以下是具有描述
的vmid
和父母描述
的内容
的父母组件的示例:
1[secondary_label Parent Component]
2{
3 metaInfo: {
4 meta: [
5 { charset: 'utf-8' },
6 {
7 vmid: 'description',
8 name: 'description',
9 content: 'Parent description.'
10 }
11 ]
12 }
13}
以下是一个具有描述
和儿童描述
不同的内容
相同vmid
的儿童组件的示例:
1[secondary_label Child Component]
2{
3 metaInfo: {
4 meta: [
5 {
6 vmid: 'description',
7 name: 'description',
8 content: 'Child description.'
9 }
10 ]
11 }
12}
此代码将生成以下输出:
1[secondary_label Output]
2<meta charset="utf-8">
3<meta data-vmid="description" name="description" content="Child description.">
如果一个儿童组件与父母共享vmid
,并且一个metaInfo
属性设置为null
,则该属性将从父母中删除。
如果一个孩子的组件返回一个metaInfo
属性的未定义
,则vue-meta
将返回父母的属性。
结论
vue-meta
是一个很好的解决方案,如果你想控制和动态地更新你的应用程序的元数据。
请确保查看官方文档(https://vue-meta.nuxtjs.org/),如果你想了解更多关于图书馆所提供的一切。
如果您想了解有关 Vue.js 的更多信息,请参阅 我们的 Vue.js 主题页面以获取练习和编程项目。