The JED back end we developed uses Angular 1.3. As a back end solution its pretty darn efficient. The JS uses a resource to hook up with a JSON REST Api we developed. The great thing about Angular is the ability to create nested directives. So say for the extension edit page, we created a <list view="releatedextensions"> tag, which Angular interprets and replaces with a <table> populated with that extension's related extensions (both HTML and JS to control the list). Then say that <table> contains a <pagination> tag, that in turn gets replaced with a pagination directive (html & js)
That doc Vic pointed to doesn't really address the issue with SPA and search engines as far as I can see . Up to last year it was a big issue as the client side content would be served as "<h1>My Blog</h1>{{blogentry}}" which would not be parsed by most search engines (this meant some terrible hacks such as pre-rendering your app for search engines). However since last year Google now understands JS (
http://googlewebmastercentral.blogspot.no/2014/05/understanding-web-pages-better.html) so can sucessfuly parse the page (so for my example the crawler would actually parse "<h1>My Blog</h1><p>this is my blog entry</p>")
@Nils
For a JS dependency management system in the Joomla echosphere I can see two main paths of reflection:
Using an AMD loader such as require.js.....
This is what we use with Fabrik, its a really great solution for asynchronously loading scripts as and when needed. For us its useful as we don't have to load up the 100 or so plugin js files on the off chance they are needed. So a form with only 2 field types is going to require 2 plugin js files and that's it.
However, it buts heads with various Jquery plugin scripts and is thus dependant on you loading it after any other script loaded out side of requirejs.
The r.js compiler for compressing the generated js is pretty complex if you want to try to create a concatenated and compressed Js file per page view. I get the feeling its easier to use in a single application setting where your entire site's js is the same code (not really the case for a Joomla site with multiple components/modules etc).
Also the syntax you end up using is specific to an AMD loader:
require(['jquery'], function( $ ) {
console.log( $ ) // OK
});
Finally if you are loading external libs into requirejs you need to manage a shim config for it - that gets complicated if those external libraries are defined in each plugin/module/component.
2) Using a precompiler such as browserify.
The advantage of browserify is that it gives you access to using node modules, and unlike requirejs your code doesn't need to make use of a special syntax
However, it has the (possible) disadvantage of not being asynchronous - it will create a single js file for your site/app, depending on your site that might make one very large js file loaded on every page, or require some pretty clever logic to work out what js should be compressed for any page.
Browserify also requires you to run it via the command line using npm/grunt, so its a great dev tool,but for site integrators that might be a bit much to ask?
Both solutions have the issue that you would need to get everyone on board using the same system for it to be really efficient. That I just don't see happening considering how well the bootstrap integration went. (as in ppl install bootstrap 3 templates, or different font icon sets etc).