AngularJS – 服务器端渲染

如您所知,AirBnb开放了Rendr( http://nerds.airbnb.com/weve-open-sourced-rendr ),可以启用服务器端Backbone应用程序。 这很酷,因为可以在服务器上运行模板渲染的第一个“迭代”,客户端将获得完整的HTML文档以及整个JS应用程序。 这大大减less了显示时间,并可以摆脱其他服务器端模板系统。

那么, 有人设法用jsdom或ZombieJS呈现AngularJS ? Node.js上的这些dom / browser模拟器在理论上应该足够用于简单的服务器端Angular模板,但是我发现使用Google进行search的结果并不是很确定。

这是另一个解决scheme: https : //github.com/ithkuil/angular-on-server

wiki的细节

AngularJS没有任何技巧地使用jsdom环境。 只需将angular.js添加到js src列表和angular度应用程序的主页,以便初始化它。

所以,渲染非常简单:只要在jsdom中使用angular,它就可以工作。 把它放到浏览器上有点困难。

一种方法是批量同步DOM更改。

要获得dynamic的服务器到客户端更新,您可以使用MutationEvents(不幸的是,jsdom不支持MutationObservers,但MutationEvents工作得非常快)。 使用它们来累加累加器数组中的DOM更改,并定期将其推送到客户端浏览器(比如每25 ms)。

此外,为了启用用户事件,您应该在浏览器上以文档方式跟踪这些事件,并且类似地累积并将其推送到服务器。

这种方法的一个实现是jsdom-sync( https://www.npmjs.org/package/jsdom-sync

服务器端渲染的缺点是缺lessDOM框模型的大小,因为获取元素的宽度/高度应该实际渲染。 意味着这个解决scheme几乎不适合svg等等。

您也可以考虑观察示波器模型并将其与浏览器端示波器同步,但这完全不同。

这个新的包https://github.com/a-lucas/angular.js-server允许你预先渲染一个Angular应用程序并发送HTML到客户端,然后执行jS代码。;

它支持每个url的caching,你可以定义规则来激活URL预渲染。

PS:我是这个软件包的主要贡献者。

我正在寻找一个解决scheme。 但是,使用浏览器在服务器上呈现html并将其发送到前端是不可选的。 Airbnb首先尝试,但因为速度缓慢而且资源匮乏而被拒绝。 这不是一个生产解决scheme。

更新:Object.observe的引入很快就可以实现;)

AngularJS 2.0也可以在服务器上工作。 Vojta Jina在“JavaScript Jabber”节目#109上谈到它 – http://javascriptjabber.com/109-jsj-dependency-injection-in-javascript-with-vojta-jina-misko-hevery/(32:30在播放器)。; 有一个链接到新的AngularJS的dependency injection模块 – angular/di.html

@戴石创buildconnect-prerenderer,看到这里 。 还有一些问题,但希望有一个好的开始

一种方法是将HTML请求路由到运行phantomjs的nodejs服务器。 我使用了基于phantomjs的方法。 检查出来,如果解决

http://himangshu.io/blog/optimizing-single-page-application-using-prerender/

我知道这是一个迟到的答案,angular.js-server( https://github.com/a-lucas/angular.js-server )使用一个angular度的修改版本,触发一个空闲状态,必要时检测所有处理ajax请求和$编译事件。

我设法预渲染的mean.js堆栈几乎没有任何修改。

这不是高性能的,但我一直在为Heorku工作一个简单的PhantomJS服务器 ,它将parsing任何客户端JS。 我特别使用Angular和Rails来为机器人请求提供HTML。

我希望它仍然可以帮助somone,但这是一个npm包,我已经创build:

https://www.npmjs.com/package/ng-node-compile