使用node.js服务Backbone.js应用程序的内容来searchsearch引擎优化

要么我的谷歌已经失败了,或者真的没有太多的人这样做呢。 如您所知,Backbone.js有一个致命弱点 – 它不能提供给它的页面抓取工具,比如googlebot,因为它们不运行JavaScript(尽pipeGoogle的资源,V8引擎以及令人清醒的事实JavaScript应用程序正在崛起,我预计这将在某一天发生)。 我知道谷歌有一个hashbang解决方法的政策,但这是一个坏主意。 另外,我正在使用PushState。 这对我来说是一个非常重要的问题,我希望它也适用于其他人。 search引擎优化是不容忽视的,因此不能被认为是需要或依靠它的许多应用程序。

inputnode.js. 我只是刚刚开始进入这种热潮,但似乎有可能有相同的客户端上存在的Backbone.js应用程序在服务器与Node.js握手。 node.js然后将能够提供从Backbone.js应用程序呈现的页面到页面爬虫。 这似乎是可行的,但我正在寻找一个谁更有经验的node.js甚至更好的人,谁已经真正做到这一点,在这方面给我build议。

我需要采取哪些步骤来允许我使用node.js将我的Backbone.js应用程序提供给网页抓取工具? 另外,我的Backbone应用程序使用了一个用Rails编写的API,我认为这会让人头疼。

编辑:我没有提到,我已经有一个生产应用程序写在Backbone.js。 我正在寻找应用这种技术的应用程序。

首先,让我添加一个免责声明,我认为这个node.js的使用是一个坏主意。 第二免责声明:我做了类似的黑客攻击,但只是为了自动化testing的目的,而不是爬虫。

就这样,让我们​​走吧。 如果您打算在服务器上运行客户端应用程序,则需要在服务器上重新创build浏览器环境:

  1. 最明显的是,你错过了DOM(文档对象模型) – 基本上是你parsing的HTML文档之上的AST。 这个node.js解决scheme是jsdom 。

  2. 然而,这是不够的。 您的浏览器还会公开BOM(浏览器对象模型) – 访问浏览器function,例如history.pushState 。 这是棘手的地方。 有两种select:你可以尝试弯曲phantomjs或casperjs来运行你的应用程序,然后刮掉它的HTML。 这很脆弱,因为您正在运行一个巨大的完整的WebKit浏览器,并切断了UI部件。

  3. 另一个select是僵尸 – 这是JavaScript中浏览器function的轻量级重新实现。 根据它支持pushState的页面,但我的经验是,浏览器仿真远没有完成 – 但试一试,看看你得到多远。

我要留给你决定是否把你的渲染引擎推到服务器端是一个合理的决定。

因为Nodejs是基于V8(Chrome的引擎)构build的,所以它将像Backbone.js一样运行JavaScript。 创build你的模型等等将以完全相同的方式完成。

Nodejs环境当然没有DOM。 所以这是你需要重新创build的部分。 我相信最stream行的模块是:

https://github.com/tmpvar/jsdom

一旦在Nodejs中有一个可访问的DOM api,你就像build立一个典型的浏览器客户端(也许使用jQuery)一样构build它的节点,并用呈现的HTML响应服务器请求(通过$(“myDOM”).html() )。

我相信你可以采取回退策略types的方法。 考虑一下,closuresjavascript和点击一个链接与JS上会发生什么。 当您closuresJavaScript时,您在页面上执行的任何可以被抓取的内容都应该有一些合理的后备过程。 你的链接应该总是链接到服务器的href,并且应该阻止javascript的默认动作。

我不会说这是骨干的责任。 我的意思是骨干网可以帮助你的唯一的东西是修改你的URL,当页面改变时,你的模型/集合是客户端和服务器端。 我认为这些观点和路由器将严格的客户端。

你可以做的事情是使你的玉石页面,并部分可以从客户端或服务器端注入或不注入内容。 通过这种方式,可以以任何方式呈现相同的页面。 也就是说,如果您replace了大部分页面并更改了url,那么您所抓取的html可以来自同一个模板,就像有人直接转到该页面一样。

当你的服务器收到一个请求时,它应该直接带你到那个页面,而不是通过主入口点和负载骨干网,并让它操作页面并以用户打算使用url的方式进行设置。

我想你应该能够通过重新安排你的应用程序中的东西来实现这一点。 没有真正的重写,只是大量的移动东西。 你可能需要编写一个控制器来为你提供注入或未注入内容的html文件。 这将为您的骨干应用程序提供所需的html,以便与模型中的数据相结合。 就像我说的那样,当你通过express / node.js中定义的路由器直接命中这些链接时,可以使用相同的模板

这是在我的待办事项列表中的事情与我们的应用程序做:有Node.jsparsing骨干路线(在应用程序启动时存储在内存中),至less为直接的HTML服务的主要网页模板 – 更可能是当你考虑成千上万的用户点击你的网站时,BE的开销/处理过多。

我相信像AirBnB这样的Backbone应用程序也是这样做的,但只适用于像Google Crawler这样的机器人。 你也需要像Facebook这样的情况,因为Facebook发送一个爬虫来阅读你的og:标签。

工作解决scheme是使用骨干无处不在https://github.com/Morriz/backbone-everywhere但它迫使你使用节点作为你的后端。

另一种方法是在服务器和前端使用相同的模板。 前端使用require.js文本插件加载Mustache模板,服务器也使用相同的Mustache模板呈现页面。

另一个补充是在javascript标记中还将自举模块数据呈现为由Backbone立即用于填充模型和集合的JSON数据。

基本上,你需要决定你所服务的是什么:它是一个真正的应用程序(即可以替代专用桌面应用程序的东西),还是内容呈现(即经典的“网页” )? 如果你关心search引擎优化,很可能是后者(“内容网站”),在这种情况下,“单页面应用程序”模型是不合适的。 你真的想要“逐渐增强的网站”模型(查看“不显眼的JavaScript”,“渐进式增强”和“自适应网页devise”)。

放大一点,“服务器只发送序列化的数据,客户端做所有的渲染”只适用于“真正的应用程序”的情况。 对于“内容网站”的情况,适当的模式是“服务器主要渲染,客户端使它看起来更好,并进行一些小规模的渲染,以避免在可能的情况下破坏性的页面转换”。

顺便说一句,渐进式增强意味着“确保用户可以看到没有比使用文本到语音的盲目用户更好的东西”的反对意见是一种政治反感,而不是现实。 从具有高端渲染系统的用户angular度来看,逐渐增强的网站可能与您希望的那样相同。