SEO:搜索引擎优化
seo需要的几个关键点:
- 多页面
- title、描述、关键词
- 网站的内容
vue-cli无法实现以上三点:
- vue项目是SPA:单页面应用
- vue项目只有一套title、描述、关键词
- vue项目的内容是通过引入js文件加载的,无法通过源代码的HTML文件中直接读取
预渲染
在html页面生成之前数据就已经加载完成。预渲染的流程:
读取配置,获取需要预渲染的页面
发布机模拟浏览器环境打开页面
页面脚本触发渲染时机
渲染出当前的页面内容
获取当前所有的DOM结构
生成HTML文件
prerender-spa-plugin
提供一个预渲染解决方案。
安装插件prerender-spa-plugin:
1 | npm i prerender-spa-plugin |
在vue.config.js中进行配置:
1 | const path = require('path') |
vue-meta-info
修改title、描述、关键词。
1 | npm i vue-meta-info |
在路由对应 的Vue文件中设置对应的meta-info:
1 | <template> |
存在的问题
prerender-spa-plugin无法配置动态路由,适合一个项目只需要其中几个页面需要做seo。
vue-meta-info无法给title、描述和关键字设置动态数据。
服务器渲染(SSR)
在客户端和后端之间再添加一个服务器端(比如node.js),后端将返回的数据交给服务器端,服务器端将html返回给客户端。
NUXT
一个基于 Vue.js 的服务端渲染应用框架
安装:
1 | npx create-nuxt-app <项目名> |
安装时需要进行一些选择
目录结构
pages:文件夹中放置路由组件。在该文件夹下的组件会在.nuxt文件夹下的router.js中自动配置路由。
components:文件夹中放置全局组件,使用其中的组件时无需import,可直接使用。因为配置文件nuxt.config.js配置文件中的components: true(改为false后需要手动引入组件)
store:store 目录用于组织应用的 Vuex 状态树 文件。 Nuxt.js 框架集成了 Vuex 状态树 的相关功能配置,在 store 目录下创建一个 index.js 文件可激活这些配置。
NUXT生命周期
服务端生命周期
nuxtServerInit
在store 目录下新建index.js。在vuex的actions模块中使用nuxtServerInit
1 | export const state = () => { |
middleware(中间件)
根目录下新建middleware目录,添加js文件(name.js):
1 | export default ({store,route,req,res,redirect,query,params}) => {//可接收很多参数 |
全局middleware:nuxt.config.js中添加:
1 | router:{ |
局部(组件内)middleware:
1 | <template> |
validate
用于校验路由参数
在组件中使用:
1 | <template> |
asyncData
只能在页面组件中使用,在组件每次加载之前调用,一般用来发送请求、获取数据。
fetch
可以在所有组件中使用
服务端和客户端共有的生命周期
beforeCreate/created
在NUXT服务器和客户端都执行
客户端生命周期
和vue中一致:
beforeMount/mounted
beforeUpdate/updated
beforeDestroy/destroyed
NUXT路由
nuxt-link
<nuxt-link> 的作用和<router-link>一致。为了提高 Nuxt.js 应用程序的响应能力,当链接将显示在视口中时,Nuxt.js 将自动预获取代码分割页面。
nuxt中不使用路由懒加载。
子路由
在pages目录下新一个和父路由同名的文件夹,该文件夹下的.vue文件为子路由
<nuxt-child>相当于<router-view>
动态路由
.vue文件以下划线(’_’)开头的为动态路由
手动配置router.js
使用@nuxtjs/router
1 | npm i @nuxtjs/router |
nuxt.config.js中配置:
1 | modules:[ |
在根目录下创建router.js文件,手动配置路由,与vue中不同的是向外暴露的不是router实例而是一个函数
1 | import Vue from 'vue' |
路由导航守卫
在router.js中使用和vue-cli中一样 (全局守卫,路由独享守卫)
nuxtjs自动生成路由时使用:
中间件:middleware
配置插件
根目录新建
plugins/router.js1
2
3
4
5
6export default ({app}) => {
app.router.beforeEach((to,from,next)=>{
console.log('beforeEach')
next()
})
}nuxt.config.js中设置:1
2
3plugins:[
'@/plugins/router.js'
]
注意
导航守卫在服务器端就已经执行,无法获取localStorage和cookie
解决方法:安装cookie-universal-nuxt
1 | npm i cookie-universal-nuxt |
nuxt.config.js中:
1 | modules:[ |
即可正常使用,如:
- this.$cookies.set
- this.$cookies.get
配置(nuxt.config.js)
head
head用于配置title、描述、关键字:
1 | head: { |
如果当前页面的.vue文件没有单独配置head,则使用nuxt.config.js中的head
在每个页面中单独配置:(使用函数的形式)
1 | <template> |
css
配置全局的css文件:(比如:初始化css、UI组件库的css文件)
1 | css: [ |
plugins
配置全局js文件:(比如:axios二次封装、UI组件库)
1 | plugins: [ |
modules
modules是Nuxt.js扩展
nuxt中安装axios(方式一):
1 | npm i @nuxtjs/axios |
modules中配置:
1 | modeules:[ |
方式二:
1 | npm i axios |
由于nuxt项目中没有main.js文件,使用时需要在.vue文件中单独import。
这里使用方式一:
在pages下 的页面组件中使用sayncData发送请求:
1 | <template> |
在components下的组件使用fetch发送请求获取数据:
1 | <template> |
配置代理
安装aixos和proxy:
1 | npm i @nuxtjs/axios |
配置:
1 | modules: [ |
axios二次封装
新建plugins/axios,js:
1 | export default ({$axios}) => { |
配置:
1 | plugins: [ |
loading (加载进度条)
配置关闭loading:
1 | loading:false,//默认为true |
配置样式:
1 | loading:{ |
Vuex状态树
新建store/index.js:
1 | export const state = () => {//state使用函数,避免返回引用 |
模块:
新建js文件,模块名就是文件名
nuxt项目上线
打包
1
npm run build
将
.nuxt、static、nuxt.config.js、package.json四个文件放到服务器中,服务器下载node环境。服务器安装依赖并启动(依旧是localhost:3000)
1
2npm install
npm run startnginx代理
- 本文标题:Vue解决SEO
- 本文作者:灵感胜于汗水
- 创建时间:2022-03-27 11:46:01
- 本文链接:https://cjhsyc.github.io/2022/03/27/Vue解决SEO/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!