近些年来,越来越多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)变得越来越流行。许多公司和开发人员使用这些JavaScript框架开发应用程序。这些框架有很多的优势:

  • 前端和后端独立开发
  • JavaScript框架+RESTFUL的API(或微服务架构)
  • SPA(Single Page Application)
  • 某种程度上有利于提高开发效率

但是使用JavaScript框架对前台尤其是需要支持搜索引擎的页面是很有问题的,这是因为我们使用这些框架基本上都是基于虚拟元素或属性和JavaScript绑定JSON对象,都是SEO不友好的。很多搜索引擎,社交媒体,爬虫甚至不支持抓取JavaScript的网页。

很庆幸的是,我们可以使用PreRender.io预渲染页面(PreRender.io通过执行页面上的JavaScript,然后呈现给搜索引擎爬虫)。

什么是PreRender.io预渲染

Prerender.io是基于Node.js的程序,它可以让你的JavaScript网站支持搜索引擎,社交媒体,并且它兼容所有的JavaScript框架和库。它采用PhantomJS渲染JavaScript的网页然后呈现为HTML。此外,我们可以实现的prerender服务层来缓存访问过的页面,这将大大提高性能。

PhantomJS是利用JavaScript API脚本化的Headless WebKit。它具有  速度快  和  支持Native 的各种Web标准:DOM处理,CSS选择器,JSON,Canvas和SVG。

现已有很多prerender许多中间件(我们可以用它来实现应用程序内部逻辑的prerender库):

你可以找到从这个链接找到大多数的中间件:  https://prerender.io/documentation/install-middleware。Apache和Nginx的是服务器容器级中间件,其他都是应用层面的中间件。

官方网站是:  https://prerender.io/

GitHub的网址:  https://github.com/prerender

你可以到我的github地址下载我写的ASP.NET MVC 和ASP.NET Core的中间件: https://github.com/dingyuliang/prerender-dotnet

或者用Nuget下载我写的ASP.NET MVC 和ASP.NET Core中间件: 搜索Prerender, https://www.nuget.org/packages?q=prerender

1. ASP.NET MVC:

Install-Package DotNetOpen.PrerenderModule

2. ASP.NET Core:

Install-Package DotNetCoreOpen.PrerenderMiddleware

3. PrerenderReady jQuery:

Install-Package DotNetOpen.PrerenderReady.jQuery

4. PrerenderReady AngularJS:

Install-Package DotNetOpen.PrerenderReady.AngularJS1

PreRender.io 预渲染解决方案

根据PreRender逻辑,我觉得有3个不同的级别的解决方案来实施prerender.io

  • 方案1:应用层

通过中间件实现对应用程序级别prerender.io逻辑(即Express NodeJS中间件,Ruby on Rails的中间件,ASP.NET MVC中间件,...)

  • Http请求到达
  • 应用程序将检查Http请求是否来自爬虫(User Agent)。
  • 如果请求来自爬虫,那么appliaction将调用prerender服务,把原来的URL作为查询字符串。 
    • 预渲染服务将调用应用程序
    • 应用程序返回原始的HTML用JavaScript逻辑的prerender服务
    • 预渲染服务将执行内部HTML的JavaScript(与浏览器类似)
    • 预渲染服务将最终的HTML返回到应用程序。
    • Appliaction将最终的HTML返回到浏览器。
  • 如果Http请求来自普通用户,应用程序将执行输出,并发送回浏览器。

  • 方案2:服务器容器级别

通过使用URL重写中间件,实施服务器容器级别prerender.io逻辑(i.e. Apache,Nginx,IIS)。

  • Http请求到达
  • 服务器容器(如Apache,Nginx,IIS)将检查Http请求是否来自爬虫(User Agent)。
  • 如果Http请求来自爬虫,然后重写URL(将原始URL作为查询字符串)预呈现服务。 
    • 预渲染服务将调用应用程序
    • 应用程序返回JavaScript逻辑原始的HTML
    • 预渲染服务将执行内部HTML的JavaScript,与浏览器类似
    • 预渲染服务将返回最终的HTML服务器容器(Apache,Nginx,IIS)。
  • 如果Http请求来自普通用户,然后将流量重定向到应用程序。应用程序将执行并返回输出到服务器容器。

  • 方案3:网络级别

我们通过负载均衡的代理实现网络级prerender.io逻辑,i.e. HAProxy:

  • Http请求到达
  • 负载均衡代理会检查Http请求是否来自爬虫(User Agent)。
  • 如果Http来自爬虫,然后将流量重定向(将原始URL作为查询字符串)预呈现服务。 
    • 预渲染服务将调用应用程序
    • 应用程序返回包含JavaScript原始的HTML
    • 预渲染服务将执行内部HTML的JavaScript,与浏览器类似
    • 预渲染服务将最终的HTML返回给负载平衡的代理。
  • 如果Http请求来自普通用户,将流量重定向到应用程序。应用程序将执行并返回输出到负载平衡的代理。

解决方案比较

以上3种不同的解决方案是在不同的级别解决相同的问题,但是它们有着不同的性能结果。

  • 方案1:应用层

该解决方案易于实施,易于调试,但它也加重应用程序负载,因为应用程序需要等待的prerender服务调用的应用程序和执行JavaScript,这将需要大量的时间等待,并且等待时间取决于它的JavaScript逻辑的复杂性。因此,这种解决方案的瓶颈是应用程序。

如果的prerender服务已关闭,会影响普通用户访问体验(长时间的请求预呈现服务,消耗应用程序和服务器容器资源)。

推荐指数:1

  • 方案2:服务器容器级别

这种解决方案利用URL重写逻辑来将负载瓶颈从应用级移到IIS级,这种方案提高了应用程序的灵活性。

如果的prerender服务已关闭,会影响普通用户访问体验是(长时间的请求预呈现服务,消耗服务器容器资源)。

    推荐指数:2

  • 方案3:网络级别

这种解决方案将在最高水平通过使用负载平衡来实现,在网络级,因此,存在于服务器容器和应用程序无瓶颈,因为它移动到负载平衡。

有了这个解决方案,甚至的prerender服务关闭,也不会影响到普通用户的接入体验。

推荐指数:3

基于上述的基本分析,通常来说,方案3比方案2更好,方案2比方案1更好。

性能问题

无论我们将要使用那种解决方案,我们总应该思考如何提高性能,因为执行JavaScript逻辑总会比执行服务器端逻辑花费更长的时间,而且不可预见。

在另一方面,如果我们只重定向爬虫的Http请求到预渲染服务,我们不需要提供最新信息给爬虫,我们可以使用prerender的缓存服务来提高性能,我们可以缓存爬虫访问过的页面12小时-1天。

在接下来文章中,我将解释如何使用开源项目来实现的prerender服务.

Prerender.io相关

  1. Prerender.io - 预渲染架构,提高AngularJS SEO
  2. Prerender.io - 设置预渲染服务,为搜索引擎优化JavaScript
  3. Prerender.io - 实施最佳实践
  4. Prerender.io - 应用层中间件 - ASP.NET HttpModule
  5. Prerender.io - 应用层中间件 - ASP.NET Core中间件
  6. Prerender.io - jQuery和angularJS插件prerenderReady

Prerender.io - 预渲染架构,提高AngularJS SEO的更多相关文章

  1. prerender-spa-plugin Vue预渲染配合meta-info优化seo

    记录一下解决方案的过程 先安装prerender和puppeteer插件  这个国外大神写的  github地址就不附上了(百度有) cnpm install prerender-spa-plugin ...

  2. prerender-spa-plugin预渲染踩坑

    为什么要使用预渲染? 为了应付SEO(国内特别是百度)考虑在网站(vue技术栈系列)做一些优化.大概有几种方案可以考虑: 服务端做优化: 第一,ssr,vue官方文档给出的服务器渲染方案,这是一套完整 ...

  3. vue 预渲染遇到的坑

    前言: 最近公司项目需要增加seo搜索引擎优化,到网上找了下资料,有预渲染和服务端渲染两种方式,考虑到只需要渲染首页所以我选择了先启用比较简单的预渲染方式来做seo! 步骤: 1.安装 prerend ...

  4. 使用Prerender.io为angular项目做SEO

    现在的项目的为了更好的分工明确,降低耦合都开始采用前后端分离的形式进式开发,我们也采用这种开发形式,前端用angular开发.虽说刚开始也遇各种坑,但是后期熟悉了之后简直爽呆.一个比较大的坑就是SEO ...

  5. 使用Prerender.io进行网站预加载

    我在自己的项目中是采用的前后端分离的技术,前端用的VUE开发,后端是JAVA开发,tomcat部署,nginx转发,但是VUE开发的项目缺点就是不利于SEO,所以针对SEO做了预加载的操作. 决定采用 ...

  6. Use Prerender to improve AngularJS SEO

    Use Prerender to improve AngularJS SEO Nuget Package of ASP.NET MVC HttpModule for prerender.io: Ins ...

  7. HTML5 VUE单页应用 SEO 优化之 预渲染(prerender-spa-plugin)

    前言:当前 SPA 架构流行的趋势如日中天,前后端分离的业务模式已经成为互联网开发的主流方式,但是 单页面 应用始终存在一个痛点,那就是 SEO, 对于那些需要推广,希望能在百度搜索时排名靠前的网站而 ...

  8. angularjs应用prerender.io 搜索引擎优化实践

    上一篇博文(http://www.cnblogs.com/ideal-lx/p/5625428.html)介绍了单页面搜索引擎优化的原理,以及介绍了两个开源框架的优劣.prerender框架的工作原理 ...

  9. vuejs 预渲染插件 prerender-spa-plugin 生成多页面 -- SEO

    前端vue等框架打包的项目一般为SPA应用,而单页面是不利于SEO的,现在的解决方案有两种: 1.SSR服务器渲染   了解服务器渲染请进,这里不做记录. 2.预渲染模式   这比服务端渲染要简单很多 ...

随机推荐

  1. iOS 准备

    iOS 编程知识点 iOS 基础知识点 iOS 之 系统机制 Xcode 使用技巧 Mac 使用技巧 iOS 之 英语 iOS 之 编外知识点 iOS 知识库链接

  2. 2.13.3:获取请求模板(Core Data 应用程序实践指南)

    可以不用手动写谓词,用Xcode的Data Model Designer.只是要用到AND .OR等逻辑组合时,还得用代码写谓词. 程序示例操作如下: 选中Model.xcdatamodeld 点击E ...

  3. PHP实现验证码图片

    <?php header("Content-type: image/png"); session_start(); $authnum = ''; $str = 'abcdef ...

  4. react中常用的一些方法

    React.createClass:创建一个ReactClass(组件类),参数是一个对象且必须带有 render 属性方法,该方法必须返回一个封闭的容器(容器内可以有其它不限结构的容器)或 null ...

  5. JavaScript成员属性读取

    var obj = {}; 检索一个不存在的成员属性的值,将返回undefined; 可以使用||运算符来填充默认值: var status = obj.status||'inistatus' 从un ...

  6. MySQL锁详解

    一.概述 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.My ...

  7. 转载:MyEclipse安装插件的几种方法

    地址:http://www.cnblogs.com/pharen/archive/2012/02/08/2343342.html 本文讲解MyEclipse(MyEclipse10)的三种方法,以SV ...

  8. 《微信小程序七日谈》- 第七天:不要捡了芝麻丢了西瓜

    <微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩: 第五 ...

  9. CSS3知识点整理(一)----基本样式

    (一) 在编写CSS3样式时,不同的浏览器可能需要不同的前缀.它表示该CSS属性或规则尚未成为W3C标准的一部分,是浏览器的私有属性,虽然目前较新版本的浏览器都是不需要前缀的,但为了更好的向前兼容前缀 ...

  10. Jenkins学习——Jenkins是什么

    Jenkins是什么 对于Jenkins是什么,百度百科给的答案是这样的:Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 通过这句话,我们可以得到这样的一 ...