75

您可能知道,AirBnb 开源了 Rendr ( http://nerds.airbnb.com/weve-open-sourced-rendr ),它应该能够在服务器端渲染Backbone应用程序。这很酷,因为可以在服务器上运行模板渲染的第一次“迭代”,客户端得到完全渲染的 HTML 文档和整个 JS 应用程序。它大大缩短了显示时间,并且可以让我们摆脱其他服务器端模板系统。

那么,有人设法用 jsdom 或 ZombieJS 渲染 AngularJS吗?Node.js 上的这些 dom/浏览器模拟理论上应该足以用于简单的服务器端 Angular 模板,但我发现谷歌搜索的结果并不是很确定。

4

10 回答 10

16

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

维基了解详情

该 repo 的作者更新:那是大约 6 年前(在本次编辑时)。此时,人们可能应该使用https://angular.io/guide/universal或仅使用https://prerender.io/

于 2013-05-27T21:49:33.767 回答
7

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

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

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

于 2016-07-15T14:48:16.927 回答
5

AngularJS 与 jsdom 上下文一起工作,没有任何技巧。只需在初始化时将 angular.js 添加到 js src 列表和 Angular 应用程序的主页到 jsdom。

因此,渲染非常简单:只需在 jsdom 中使用 Angular 即可。把它放到浏览器上有点困难。

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

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

此外,为了启用用户事件,您应该在浏览器上按文档方式跟踪它们,并累积并将它们推送到服务器。

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

服务器端渲染的一个缺点是没有 DOM 框模型大小,因为要获得元素的宽度/高度,它应该被实际渲染。意味着这个解决方案几乎不适合 svg 等等..

您也可以考虑观看范围模型并将其与浏览器端范围同步,但那是完全不同的故事。

于 2014-11-02T00:05:32.833 回答
4

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

更新:这很快就可以通过引入 Object.observe ;)

于 2013-05-03T16:54:45.177 回答
4

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 依赖注入模块的链接 - https://github.com/angular/di.js

于 2014-10-02T07:15:05.467 回答
2

@dai-shi 创建了连接预渲染器,请参见此处。还有一些问题,但希望是一个好的开始

于 2013-05-01T18:18:46.863 回答
2

一种方法是将 HTML 请求路由到运行 phantomjs 的 nodejs 服务器。我使用了一种基于 phantomjs 的方法。看看能不能解决

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

于 2016-03-04T17:32:52.373 回答
2

我知道这有点晚了,angular.js-server ( https://github.com/a-lucas/angular.js-server ) 使用修改后的 angular 版本触发空闲状态,以检测何时所有ajax 请求和 $compile 事件被处理。

我设法在几乎没有修改的情况下预渲染了 mean.js 堆栈。

于 2016-07-16T22:20:18.963 回答
1

这不是高性能的,但我一直在为 Heorku 开发一个简单的 PhantomJS 服务器,它将解析任何客户端 JS。我专门将它与 Angular 和 Rails 一起使用,为机器人请求提供 HTML。

于 2013-09-18T16:14:01.687 回答
-1

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

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

于 2015-06-15T20:05:05.900 回答