近些年來,愈來愈多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)變得愈來愈流行。許多公司和開發人員使用這些JavaScript框架開發應用程序。這些框架有不少的優點: javascript
可是使用JavaScript框架對前臺尤爲是須要支持搜索引擎的頁面是頗有問題的,這是由於咱們使用這些框架基本上都是基於虛擬元素或屬性和JavaScript綁定JSON對象,都是SEO不友好的。不少搜索引擎,社交媒體,爬蟲甚至不支持抓取JavaScript的網頁。 前端
很慶幸的是,咱們可使用PreRender.io預渲染頁面(PreRender.io經過執行頁面上的JavaScript,而後呈現給搜索引擎爬蟲)。 java
Prerender.io是基於Node.js的程序,它可讓你的JavaScript網站支持搜索引擎,社交媒體,而且它兼容全部的JavaScript框架和庫。它採用PhantomJS渲染JavaScript的網頁而後呈現爲HTML。此外,咱們能夠實現的prerender服務層來緩存訪問過的頁面,這將大大提升性能。node
PhantomJS是利用JavaScript API腳本化的Headless WebKit。它具備 速度快 和 支持Native 的各類Web標準:DOM處理,CSS選擇器,JSON,Canvas和SVG。jquery
現已有不少prerender許多中間件(咱們能夠用它來實現應用程序內部邏輯的prerender庫):git
你能夠找到從這個連接找到大多數的中間件: https://prerender.io/documentation/install-middleware。Apache和Nginx的是服務器容器級中間件,其餘都是應用層面的中間件。 angularjs
官方網站是: https://prerender.io/。github
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邏輯,我以爲有3個不一樣的級別的解決方案來實施prerender.io
經過中間件實現對應用程序級別prerender.io邏輯(即Express NodeJS中間件,Ruby on Rails的中間件,ASP.NET MVC中間件,...)
經過使用URL重寫中間件,實施服務器容器級別prerender.io邏輯(i.e. Apache,Nginx,IIS)。
咱們經過負載均衡的代理實現網絡級prerender.io邏輯,i.e. HAProxy:
以上3種不一樣的解決方案是在不一樣的級別解決相同的問題,可是它們有着不一樣的性能結果。
該解決方案易於實施,易於調試,但它也加劇應用程序負載,由於應用程序須要等待的prerender服務調用的應用程序和執行JavaScript,這將須要大量的時間等待,而且等待時間取決於它的JavaScript邏輯的複雜性。所以,這種解決方案的瓶頸是應用程序。
若是的prerender服務已關閉,會影響普通用戶訪問體驗(長時間的請求預呈現服務,消耗應用程序和服務器容器資源)。
推薦指數:1
這種解決方案利用URL重寫邏輯來將負載瓶頸從應用級移到IIS級,這種方案提升了應用程序的靈活性。
若是的prerender服務已關閉,會影響普通用戶訪問體驗是(長時間的請求預呈現服務,消耗服務器容器資源)。
推薦指數:2
這種解決方案將在最高水平經過使用負載平衡來實現,在網絡級,所以,存在於服務器容器和應用程序無瓶頸,由於它移動到負載平衡。
有了這個解決方案,甚至的prerender服務關閉,也不會影響到普通用戶的接入體驗。
推薦指數:3
基於上述的基本分析,一般來講,方案3比方案2更好,方案2比方案1更好。
不管咱們將要使用那種解決方案,咱們總應該思考如何提升性能,由於執行JavaScript邏輯總會比執行服務器端邏輯花費更長的時間,並且不可預見。
在另外一方面,若是咱們只重定向爬蟲的Http請求到預渲染服務,咱們不須要提供最新信息給爬蟲,咱們可使用prerender的緩存服務來提升性能,咱們能夠緩存爬蟲訪問過的頁面12小時-1天。
在接下來文章中,我將解釋如何使用開源項目來實現的prerender服務.