prerender简介
代码仓库: github.com/prerender/p…
prerender实现预渲染,主要是为了解决动态页面不方便搜索引擎爬虫抓取的问题。
prerender通过调用chrome无头模式,在后台运行动态页面,将完成渲染之后页面内容发送给请求浏览器。
因为某个项目使用了vue单页面应用框架,又感觉vue 的提供的ssr方案限制太多,决定使用prerender来生成seo内容。 流程上由nginx识别请求来源,然后分流到目标服务器还是预渲染服务器(将搜索引擎的爬虫请求导向预渲染服务器)。
prerender.json
prerender原项目是在内部的server.js设置各种配置的,为了方便生产环境设置配置信息,允许在项目同目录下添加prerender.json文件,替代代码上修改配置的方式。
日志
原项目日志只能打印在控制台。
修改:
- 完善日志内容,包括日志类型、时间显示、区分info/error/warn
- 使用winston和winston-daily-rotate-file插件,将日志保存到在/logs目录下(隔天的日志会被压缩打包)
- 使用@fluent-org/logger插件,将日志通过Fluentd 上传到efk服务
文件缓存
默认每次请求都去浏览器重新渲染数据,为了响应性能问题,官方推荐使用in-memory-cache插件来缓存已经渲染的页面。
因为要处理一些特殊数据,需要把headers都存起来,in-memory-cache已经不适用,最终copy in-memory-cache的代码,重新写了缓存逻辑(后面会提到)。
window.prerenderResponse
seo需要项目提供robots.txt和sitemap.xml等文件, 里面涉及很多页面路由路径。
由于vue项目路由都是前端生成的,所以决定在前端生成这些文件的内容,然后由prerender服务配合响应文件请求。
大概步骤:
- rerender是使用chrome-remote-interface来操作浏览器,在页面渲染完成时候可以读取window.prerenderResponse
- 发现window.prerenderResponse有内容,根据prerenderResponse 提供的的Content-Type和content构造响应内容
- in-memory-cache只缓存网页内容,这里会重构它,将第一次请求时候的headers和content都缓存起来。
- 编写nginx脚本,将robots.txt和sitemap.xml的请求都转发到prerender服务器
window.prerenderLoading
web设置window.prerenderLoading = true之后,prerender会尝试继续轮询,直到设置为false才继续下一步 主要应对一些特殊情况,导致prerender服务判断结束是非预期的
编写jenkins脚本
将prerender、nodejs环境、chrome都打包成doker镜像文件