By tillda


2013-04-26 09:07:26 8 Comments

As you may know, AirBnb opensourced Rendr (http://nerds.airbnb.com/weve-open-sourced-rendr) which should enable server-side rendering of Backbone apps. This is cool, because one can run the first "iteration" of template rendering on the server and the client gets fully rendered HTML document plus the whole JS app. It greatly reduces time-to-display and can get us rid of other server-side templating systems.

So, have someone managed to render AngularJS with jsdom or ZombieJS? These dom/browser emulations on Node.js should in theory be enough for simple server-side Angular templating, but results I found googling it were not very conclusive.

10 comments

@outluch 2013-05-27 21:49:33

Here is another solution: https://github.com/ithkuil/angular-on-server

wiki for details

Update from author of that repo: that was about 6 years ago (at the time of this edit). At this point, people should probably be using https://angular.io/guide/universal or just https://prerender.io/

@bokkie 2019-07-10 12:30:38

the angular.io thing is for Angular, not AngularJs. They are two completely different languages...

@Razvan Zamfir 2019-11-26 11:03:27

Can I use Prerender in an application that uses PHP on the server-side, instead of Express? How?

@Ant 2016-07-16 22:20:18

I know this is a bit a late answer, angular.js-server (https://github.com/a-lucas/angular.js-server) uses a modified version of angular that triggers an idle state necessary to detect when all ajax request and $compile events are processed.

I managed to pre-render the mean.js stack with almost no modification.

@Antoine Lucas 2016-07-15 14:48:16

This new package https://github.com/a-lucas/angular.js-server allows you to pre-render an Angular application and send HTML to the client, that will then execute the jS code.

It supports caching per url and you can define rules to activate URL pre-rendering.

PS: I am the main contributor for this package.

@himangshuj 2016-03-04 17:32:52

One approach is to route the HTML requests to nodejs server running phantomjs. I used an approach based on phantomjs. Check it out if it solves

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

@MoLow 2015-06-15 20:05:05

i Hope it could still help somone, but here is an npm package I have created:

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

@IamStalker 2015-12-18 20:33:06

Can you give more explains how does it know when the pipeline of angularjs stopped working?

@setec 2014-11-02 00:05:32

AngularJS works withing jsdom context without any tricks. Just add angular.js to js src list and main page of angular app to jsdom on its initializion.

So, rendering is very simple: just use angular in jsdom and it works. Putting it to browser is somewhat harder.

One way is batch syncing DOM changes.

To get dynamical server-to-client updates you may use MutationEvents (unfortunatly, jsdom does't support MutationObservers, but MutationEvents work pretty fast). Use them to stack up DOM changes in accumulator array and push it periodically to client browser (say, per 25 ms).

Also to enable user events, you should track them document-wise on browser and similarry accumulate and push them to server.

One implementation of such approach is jsdom-sync (https://www.npmjs.org/package/jsdom-sync)

A downside of server side rendering is absence of DOM box model size, because to get element width/height it should be actually rendered. Means this solution barely fits for svg and so on..

Also you may consider watching scope model and syncing it with browser-side scopes, but thats totally different story.

@bullgare 2014-10-02 07:15:05

AngularJS 2.0 can work on a server, too. Vojta Jina talks about it on "JavaScript Jabber" show #109 - http://javascriptjabber.com/109-jsj-dependency-injection-in-javascript-with-vojta-jina-misko-hevery/ (32:30 in player). There is a link to new AngularJS' dependency injection module - https://github.com/angular/di.js.

@Aleksandrenko 2013-05-03 16:54:45

I'm searching for a solution too. But it's not an option to use browser to render the html on the server and send it to the frontend. Airbnb try it first but rejected because is slow and resource hungry. It's not a production solution.

Update: This soon can be possible with the introduction of Object.observe ;)

@setec 2014-11-02 08:45:16

In most cases server-side rendering will used for robots and some special cases, so server performance impact is neglible. Also 'rendering' on server side is just template to html processing, without actual rendering (which is most CPU hungry), which anyway occurs at client side.

@jemiloii 2016-03-02 23:06:14

usually you want to do the server side rendering on an initial load. so user x is going to a list page for the first time visiting the app. maybe they closed the browser and reopened it later. instead of loading the app, then making another http request for the data, the server can just do all of that for us in the initial launch. the other very useful reason to do this is for search engine bots. not all of them are as smart as the google bots and don't have their own javascript compilers.

@Edward Newell 2016-09-13 17:17:07

Render time does matter for google Adwords bots which use load time as a factor in landing page quality. I've found even headless browsers like PhantomJS generate significant CPU load.

@smothers 2013-09-18 16:14:01

This is not performant, but I've been working on a simple PhantomJS server for Heorku that will parse any client JS. I use it specifically with Angular and Rails to serve HTML to bot requests.

@Lior 2013-05-01 18:18:46

@dai-shi created connect-prerenderer, see here. Still a few issues but hopefully a good start

@Razvan Zamfir 2019-11-26 11:02:04

What If I have an application that uses PHP on the server-side, instead of Express? What option do I have?

Related Questions

Sponsored Content

31 Answered Questions

[SOLVED] Using node.js as a simple web server

5 Answered Questions

6 Answered Questions

[SOLVED] How do I use $scope.$watch and $scope.$apply in AngularJS?

19 Answered Questions

[SOLVED] How do I access the $scope variable in browser's console using AngularJS?

18 Answered Questions

14 Answered Questions

[SOLVED] How does data binding work in AngularJS?

30 Answered Questions

7 Answered Questions

[SOLVED] 'this' vs $scope in AngularJS controllers

Sponsored Content