无论是服务端渲染还是客户端渲染,它们都使用的同一个页面模板。
页面中的 body 是动态渲染出来的,但是页面的 head 是写死的,也就说我们希望不同的页面可以拥有自己的 head 内容,例如页面的 title、meta 等内容,所以下面我们来了解一下如何让不同的页面来定制自己的 head 头部内容。
官方文档这里专门描述了关于页面 Head 的处理,相对于来讲更原生一些,使用比较麻烦,有兴趣的同学可以了解一下。
我这里主要给大家介绍一个第三方解决方案:vue-meta。
Vue Meta 是一个支持 SSR 的第三方 Vue.js 插件,可让你轻松的实现不同页面的 head 内容管理。
使用它的方式非常简单,而只需在页面组件中使用 metaInfo
属性配置页面的 head 内容即可。
<template>
...
</template>
<script>
export default {
metaInfo: {
title: 'My Example App',
titleTemplate: '%s - Yay!',
htmlAttrs: {
lang: 'en',
amp: true
}
}
}
</script>
页面渲染出来的结果:
<html lang="en" amp>
<head>
<title>My Example App - Yay!</title>
...
</head>
安装:
npm i vue-meta
在通用入口中通过插件的方式将 vue-meta 注册到 Vue 中。
import Vue from 'vue'
import VueMeta from 'vue-meta'
Vue.use(VueMeta)
Vue.mixin({
metaInfo: {
titleTemplate: '%s - 拉勾教育'
}
})
然后在服务端渲染入口模块中适配 vue-meta:
// entry-server.js
import { createApp } from './app'
export default async context => {
// 因为有可能会是异步路由钩子函数或组件,所以我们将返回一个 Promise,
// 以便服务器能够等待所有的内容在渲染前,
// 就已经准备就绪。
const { app, router } = createApp()
const meta = app.$meta()
// 设置服务器端 router 的位置
router.push(context.url)
context.meta = meta
// 等到 router 将可能的异步组件和钩子函数解析完
await new Promise(router.onReady.bind(router))
return app
}
最后在模板页面中注入 meta 信息:
<head>
{{{ meta.inject().title.text() }}}
{{{ meta.inject().meta.text() }}}
</head>
下面就是直接在组件中使用即可:
Home.vue
{
metaInfo: {
title: '首页' // 首页 - 拉勾教育
}
}
About.vue
{
metaInfo: {
title: 'About' // About - 拉勾教育
}
}
关于使用 vue-meta 管理页面 Head 我们就介绍这些,大家可以根据自己的需求,多查阅文档,灵活使用即可。