介绍
SSR与CSR的相爱相杀
首先看一下传统的web开发,传统的web开发是,客户端向服务端发送请求,服务端查询数据库,拼接HTML字符串(模板),通过一系列的数据处理之后,把整理好的HTML返回给客户端,浏览器相当于打开了一个页面。这种比如我们经常听说过的jsp,PHP,aspx也就是传统的MVC的开发。
SPA应用,到了Vue、React,单页面应用优秀的用户体验,逐渐成为了主流,页面整体式javaScript渲染出来的,称之为客户端渲染CSR。SPA渲染过程。由客户端访问URL发送请求到服务端,返回HTML结构(但是SPA的返回的HTML结构是非常的小的,只有一个基本的结构)。客户端接收到返回结果之后,在客户端开始渲染HTML,渲染时执行对应javaScript,最后渲染template,渲染完成之后,再次向服务端发送数据请求,注意这里时数据请求,服务端返回json格式数据。客户端接收数据,然后完成最终渲染。
SPA虽然给服务器减轻了压力,但是也是有缺点的:
- 首屏渲染时间比较长:必须等待JavaScript加载完毕,并且执行完毕,才能渲染出首屏。
- SEO不友好:爬虫只能拿到一个div元素,认为页面是空的,不利于SEO。
为了解决如上两个问题,出现了SSR解决方案,后端渲染出首屏的DOM结构返回,前端拿到内容带上首屏,后续的页面操作,再用单页面路由和渲染,称之为服务端渲染(SSR)。
SSR渲染流程是这样的,客户端发送URL请求到服务端,服务端读取对应的url的模板信息,在服务端做出html和数据的渲染,渲染完成之后返回html结构,客户端这时拿到的之后首屏页面的html结构。所以用户在浏览首屏的时候速度会很快,因为客户端不需要再次发送ajax请求。并不是做了SSR我们的页面就不属于SPA应用了,它仍然是一个独立的spa应用。
SSR是处于CSR与SPA应用之间的一个折中的方案,在渲染首屏的时候在服务端做出了渲染,注意仅仅是首屏,其他页面还是需要在客户端渲染的,在服务端接收到请求之后并且渲染出首屏页面,会携带着剩余的路由信息预留给客户端去渲染其他路由的页面。
渲染流程
从服务端到客户端的一个过程,主要查看官网。
注意:vue的生命周期created和beforeCreated在客户端和服务端同时执行。
布局思想
- layouts
- pages
- components
配置文件
1 |
|
部署
Nginx
假设域名为a.com,该域名映射到pc端网站(vue的spa)。a.com/m映射到服务端(nuxt启动的服务,移动端网站)
- nginx配置如下
1 | upstream gateway_svr { |
- 同时nuxt配置router的base为
/m
守护进程
pm2可使进程常驻
1 | module.exports = { |
最好配置脚本在package.json里
- “pm2-start”: “yarn build && pm2 start pm2.config.js”
- “pm2-delete”: “pm2 delete h5-nuxt-ssr”,
- “pm2-monit”: “pm2 monit h5-nuxt-ssr”
开机自动启动
我们希望直接通过服务器重启之后能自动启动
- 通过pm2 save保存当前进程状态。
- pm2 startup