无论是服务端渲染还是客户端渲染,它们都使用的同一个页面模板。
页面中的 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.jsimport { 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 我们就介绍这些,大家可以根据自己的需求,多查阅文档,灵活使用即可。
