开发笔记-prerender-单页面网站SEO解决方案

162 阅读2分钟

prerender简介

代码仓库: github.com/prerender/p…

prerender实现预渲染,主要是为了解决动态页面不方便搜索引擎爬虫抓取的问题。

prerender通过调用chrome无头模式,在后台运行动态页面,将完成渲染之后页面内容发送给请求浏览器。

因为某个项目使用了vue单页面应用框架,又感觉vue 的提供的ssr方案限制太多,决定使用prerender来生成seo内容。 流程上由nginx识别请求来源,然后分流到目标服务器还是预渲染服务器(将搜索引擎的爬虫请求导向预渲染服务器)。

prerender.json

prerender原项目是在内部的server.js设置各种配置的,为了方便生产环境设置配置信息,允许在项目同目录下添加prerender.json文件,替代代码上修改配置的方式。

日志

原项目日志只能打印在控制台。

修改:

  1. 完善日志内容,包括日志类型、时间显示、区分info/error/warn
  1. 使用winston和winston-daily-rotate-file插件,将日志保存到在/logs目录下(隔天的日志会被压缩打包)
  2. 使用@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服务配合响应文件请求。

大概步骤:

  1. rerender是使用chrome-remote-interface来操作浏览器,在页面渲染完成时候可以读取window.prerenderResponse
  1. 发现window.prerenderResponse有内容,根据prerenderResponse 提供的的Content-Type和content构造响应内容
  2. in-memory-cache只缓存网页内容,这里会重构它,将第一次请求时候的headers和content都缓存起来。
  1. 编写nginx脚本,将robots.txt和sitemap.xml的请求都转发到prerender服务器

window.prerenderLoading

web设置window.prerenderLoading = true之后,prerender会尝试继续轮询,直到设置为false才继续下一步 主要应对一些特殊情况,导致prerender服务判断结束是非预期的

编写jenkins脚本

将prerender、nodejs环境、chrome都打包成doker镜像文件