这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
Nuxt.js 服务器端渲染
一、服务端渲染技术
1.1 搜索引擎优化
1.1.1 什么是seo
搜索引擎优化,简称SEO,是通过某种方式利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让其在行业内占据领先地位,能够提高自己网站的排名,获取更多的流量。
1.1.2 搜索引擎工作流程
常见的SEO 方法比如:
- 对 url链接的规范化,多用restful 风格的url,多用静态资源 url
- 注意keywords、description、title的设置
- h1-h6、a标签的使用等等
- ......
【注意】:spider 对 javascript 支持不好,ajax 获取的 JSON 数据无法被 spider 爬取
采用什么技术有利于 SEO?要解答这个问题需要理解服务端渲染和客户端渲染。
1.2 服务端渲染和客户端渲染
服务端渲染又称 SSR,是在服务端完成页面的内容渲染,而不是在客户端完成页面内容的渲染。
SSR并不是前端特有的技术,我们学习过的 JSP 技术和 Thymeleaf 技术就是典型的 SSR
1.2.1 什么是服务端渲染
服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容渲染,而不是在客户端完成页面内容的渲染。
SSR并不是前端特有的技术,我们学习过的JSP技术和Thymeleaf技术就是典型的SSR
服务端渲染的特点:
- 在服务端生成html网页的dom元素
- 客户端(浏览器)只负责显示dom元素内容
1.2.2 什么是客户端渲染
客户端(浏览器) 使用AJAX向服务端发起http请 求,获取到了想要的数据,开始渲染html网页,生成dom元素,并最终将网页内容展示给用户。
客户端渲染的特点:
- 在服务端只是给客户端响应的了数据,而不是html网页
- 客户端(浏览器)负责获取服务端的数据生成dom元素
1.2.3、两种方式各有什么优缺点?
客户端渲染:
-
缺点:不利于网站进行SEO,因为网站大量使用javascript技术,不利于搜索引擎抓取网页。
-
优点:客户端负责渲染,用户体验性好,服务端只提供数据不用关心用户界面的内容,有利于提高服务端的开发效率。
3)适用场景:对SEO没有要求的系统,比如后台管理类的系统,如电商后台管理,用户管理等。
服务端渲染:
-
优点:有利于SEO,网站通过href的url将搜索引擎直接引到服务端,服务端提供优质的网页内容给搜索引擎。
-
缺点:服务端完成一部分客户端的工作,通常完成一个需求需要修改客户端和服务端的代码,开发效率低,不利于系统的稳定性。
3)适用场景:对SEO有要求的系统,比如:门户首页、商品详情页面等。
1.3 Nuxt.js
1.3.1、Nuxt.js介绍
移动互联网的兴起促进了web前后端分离开发模式的发展,服务端只专注业务,前端只专注用户体验,比如流行的vue.js实现了功能强大的前端渲染。 但是,对于有SEO需求的网页如果使用前端渲染技术去开发就不利于SEO了,有没有一种即使用vue.js 的前端技术也实现服务端渲染的技术呢?
Nuxt.js 是一个基于 Vue.js 的轻量级应用框架,可以用来创建服务端渲染 (SSR) 应用,也可充当静态站点引擎生成静态站点应用,具有优雅的代码结构分层和热加载等特性。
官网网站:zh.nuxtjs.org/
1.3.2、Nuxt.js服务器端渲染
下图展示了从客户端请求到Nuxt.js进行服务端渲染的整体的工作流程:
1)用户打开浏览器,输入网址请求到Node.js中的前端View组件
2)部署在Node.js的应用Nuxt.js接收浏览器请求,并请求服务端获取数据
3)Nuxt.js获取到数据后进行服务端渲染
4)Nuxt.js将html网页响应给浏览器
1.4 项目使用
Nuxt.js 扩展了 Vue.js,里面有个 asyncData 方法,asyncData 方法会在组件(限于页面组件)每次加载 之前被调用。它可以在服务端或路由更新之前被调用。 你可以利用 asyncData 方法来获取数据,Nuxt.js 会将 asyncData 返回的数据融合组件 data 方法 返回的数据一并返回给当前组件。
【注意】:asyncData 方法是在组件初始化前被调用的,所以方法内是没有办法通过 this 来引用组件的实例对象。
async asyncData(page) {
const vid = page.route.params.vid
const response = await courseApi.getPlayAuth(vid)
console.log(vid)
return {
vid: vid,
playAuth: response.data.playAuth
}
},
复制代码
调用数据:
created() {
// 如果未登录,则isBuy是默认值false
// 如果已登录,则isBuy通过远程接口的返回值赋值
const token = cookie.get('lei_token')
if (token) {
orderApi.isBuy(this.course.id).then(response => {
this.isBuy = response.data.isBuy
console.log(this.isBuy)
})
// 判断是否收藏
collectApi.isCollect(this.course.id).then(response => {
this.isCollect = response.data.isCollect
})
}
},
复制代码