Angular 2 Core
docs.google.com
docs.google.com
I know Angular has a lot of community support and I have built some side projects in Angular but I feel now too bloated with having their own standards instead of following normal HTML standards. That's just my 2 cents on it and i'm sure there are a ton of reason to use Angular but I just don't know if I can continue supporting a project that makes so many drastic changes to a standard. I don't want to make it sound like I have Angular hate here but i'm a big vanilla fan and it seems in order to build anything useful in Angular you have to throw out vanilla and use Angular's way even if vanilla is better. On most projects handlebars and correct proper design patterns in code is enough to keep HTML out of javascript and keep basic organization.
On the other hand, I lived through Pax Microsoft and it was often not pretty.
It's interesting living through times of viciously fast change in one's field of endeavor.
This is a pretty interesting statement and I want to give it more thought. I've used Angular on plenty of projects and admittedly, It's felt a bit dirty to go back to spaghetti DOM that we worked for years to get rid of. All the books were saying to separate logic from our views. Now we're calling it declarative and it's acceptable again. I've been yelled at by other developers as if I should just forget the past few years and just get in line with what's currently the new hotness. Fine, I'm totally okay with embracing whatever is new and hot. But not just because it came from the same people that gave us Wave, Gears, GWT, etc. Let's not get involved in hero worship. All of those technologies had great ideas, yet were (overall) marked as failures. I'd love to have seen this same proposal come from some random Susan/Joe on their GitHub and see if it had been laughed off the stage for the same reasons I mentioned earlier.
It doesn't matter what the books say. Or rather - you've got to understand the reason for the advice - not just learn to follow the advice.
Programming abounds with maxims. However you can't capture a complex truth with a glib catchphrase. Everyone is trying to achieve the same ends - ease of development without sacrificing maintainability (to give a very simple example).
Catch-phrases such as "separate your logic from your views" was meant in a specific context. If you etch it in granite and pass it on to future generations it won't always embody the practical truth it was meant to convey.
So - we should remember the catch phrases but understand their context - and therefore we might hope to understand the more subtle and less easily stated truth behind the one-liners.
Or, as the tao of programming says:
There once was a Master Programmer who wrote unstructured programs. A novice programmer, seeking to imitate him, also began to write unstructured programs. When the novice asked the Master to evaluate his progress, the Master criticized him for writing unstructured programs, saying, "What is appropriate for the Master is not appropriate for the novice. You must understand Tao before transcending structure."
Edit: Other framework name ideas ~ Modil.js, Controllr.js, Framework.js, Class.js, js.js
That Angular wants to manage the whole app is exactly why I probably won't use it for my own projects. I don't want to build "Angular apps" I want to build web apps. Angular seems unstable too, with regards to backward compatibility - barely supporting IE8 in 1.2, dropping it in 1.3 and then introducing all sorts of major breaking changes in 2.0 - no, this kit is not for people like me who want stability. Meanwhile, even Knockout's newest features work all the way back to IE6.
Unfortunately, the developer has joined the Angular team and has basically said the next version of durandal is angular.
I like that they've modernized their API, because of how it is designed currently it would be hard to take it to the next level using ES6, Angular 2 is a good call.
For example, say you want to create an online assessment player for taking exams. You need a service that can maintain state for the whole application (example: time elapsed, which questions the person got right/wrong, etc.), and then you need highly modular question components that can plug into a common question model to generate common answer objects for answer submission, display of common question elements such as the question #, etc.
Say you were then handed requirements that you needed to support taking some assessments while offline and submit the answers as soon as the user goes back online (say for a self-study assessment and not a high stakes exam). All of this then has to be completed in two months, and from scratch since it would be impossible with the previous code.
From my experience, Angular has facilitated meeting these deadlines with each team I have been on (my example is a real world experience of mine) & allowed companies I have worked at to maintain a high level of quality - the clients have raved about the quality of the applications. Part of this is because Angular has allowed the companies I have been at to think about high level architecture, but the other half has been with the ease of unit testing with Angular. I have no doubt that other companies can tout similar experiences with [insert framework here], which only serves to emphasize that team work is more important than developer opinions - if most of your team prefers doing something [insert different way] & it doesn't have huge technical ramifications, then it's worth deviating from your opinions to the different way in order to keep things moving.
Yes, but as a team you have to come up with a correct proper design pattern like that, and get everyone to follow that. I've done that in a Backbone project (which we're moving to Angular atm), and it's a lot of work - not to mention you feel like you're re-inventing the wheel there. AngularJS is a lot more opinionated about how your application should be built, which for new team members is very useful - they don't have to learn Backbone + your own application design, but just AngularJS.
And in large projects / large teams, this is important.
Yes, the Google Cargo cult is frightening. Things that previously where scorned at is now raised to the skies.
But we have to remember that is also a completely new generation of developers out there who have not lived thru the entire painful history of web development, so therefore the same mistakes will repeat it selves.
It should be obvious now by most rational people that Angular 1.x is a dead end and if you build your own architecture around it you will continue to dig yourselves a deeper and deeper hole that will become harder and harder to get up from.
Angular 2 looks more promising with it's modularity and that should be the lessoned learned.
The web is just a way too fast moving target that any framework can keep up with, because the idea of a framework is the opposite for fast moving progress, i.e. stabilization of risks. And thats why so many javascript frameworks have already died even thou the web is really young.
The road ahead must be modularity and not the the way of the monolithic frameworks. Interoperability and interchangeability. Things we ought to have learned after the Prototype.js years. Or after the Dojo years. Or after the ExtJS years. Or ...
ES6 is also new, of course; when I first saw Angular 2.0 code, I didn't like it - mostly due to DI, which instead of a single argument in a simple function, now consisted of three different statements to have one service injected, which just feels non-DRY.
class Foo {
constructor(bar: Bar, baz: Baz) {
...
}
}
There's also syntax for using @Inject annotations inline in the constructor to provide more flexibility. The architecture may be coming together, but it sounds like there's still a long way to go before it's a fully-realized framework with more friendly conventions.If anything, I think the upshot is that DOM handling has been pushed further to the edges, and the emphasis is on pure composition of classes and data structures, with less boilerplate, hand-waving, and framework-centricity.
It's a bit sad to think that all this knowledge I have of Angular 1 is now obsolete but I'm excited to dive into this new framework. If it's half revolutionary as Angular 1 was, it's going to be a pretty interesting time.
[0] http://eisenbergeffect.bluespire.com/angular-and-durandal-co...
So where does angular lie on that continuum?
So I can understand if Angular 1.0 stopped working on Angular 4.0 or 5.0. Breaking apps just on one major revision number is really a bad way to manage frameworks.
There is not even any mention to the Object.observe integration which would be the most exiting feature to improve Angular apps.
Angular looks and feels now like a Java framework, with ugly decorators and bloated APIs, that's really sad...
DI is the solution to that. It has every place in a language like JS, and I am excited with having it available.
Can't agree with that. Not sure what you mean by 'programmatic wiring' as it sounds vague, but certainly modules do not solve the same problem that DI solves.
Modules, (assuming you mean stuff you require() or equivalent), provide module-level dependencies but do not provide object instances. For example, if an instance of House requires a Door it is not enough to just require('Door'). You still have to do the equivalent of `new Door()` in your House module to get an instance. By doing so within the House module you just tightly coupled House to Door (your House now knows how to create Doors).
DI allows you to provide an object with object instances it depends on without tightly coupling said object to those dependencies (pass a Door instance into a House instance, advantage being you can pass in any type of Door and House doesn't need to care - thanks polymorphism)!
I'm not sure that's a great explanation, but it's worth trying every now and then right?
You seem to be making the argument that the language provides alternatives, and it's true that in dynamic languages you can eschew some of the benefits of DI by doing monkey patching instead (e.g. to mock out an object's 'tightly coupled' dependencies during testing), but to myself and many OOP proponents DI leads to cleaner design and simpler tests.
So what? What is so bad about House and Door being "tightly coupled"? Here's a House constructor that can take any kind of Door instance:
function House(door){
this.door = door;
}
This is JavaScript, let's stop trying to make it into Java.I am very much in favour of the approach you posted. That's exactly how I write my code (I don't currently use Angular), but yep ... that's DI. As James Shore said 'Dependency Injection is a 25-dollar term for a 5-cent concept'. [1].
What you show in that code example is what in my head I call "poor man's DI" or ... "passing stuff in" but it's actually my favourite kind as it demonstrates the fundamental idea and is easy to explain to people - as soon as you start talking about IOC and service providers things start to get murkier. I think that's definitely where Angular is losing some people. You can get a long way with the basic "poor man's" approach.
[1] http://www.jamesshore.com/Blog/Dependency-Injection-Demystif...
When I realized it was "passing stuff in" I wanted to shout, I have done that for years!
Well, it's the "automatic" part that is important, not just the DI.
var prod_dependencies = {
obj0: require('obj0'),
obj1: require('obj1')
};
var test_dependencies = {
obj0: require('mockobj0'),
obj1: require('mockobj1')
};
var dependencies = test_dependencies;
some_func(dependencies.obj0,dependencies.obj1);
Javascript does not need Java-style dependency injection.
Javascript's configuration language JSON is valid Javascript.You are injecting dependencies into `some_func` by passing them in. See my response to kyllo below.
I think what you are arguing against is using further patterns to facilitate dependency injection, e.g. IOC containers, or what Angular uses (service locators).
I've seen a similar debate play out in the Python world and the debate seems to polarize into two camps:
"You have never built anything complex enough and therefore you don't understand the benefits of DI/IOC"
vs.
"You've come to a dynamic language from some verbose public static void main hell-hole and are suffering from some form of Stockholm Syndrome"
Most of my team eventually settled on the conclusion that "the cognitive load of working through the implications of how these nested directives play out in an application is simply not worth it". Or something to that effect.
We all studied angular studiously, we all did our best to implement it in an effective and sound manner, and when things went wrong, and they always go wrong, the shear complexity of the framework tied our hands and forced us to do some very ugly hacks.
I look at our application as it stands, and I regret using angular.
If angular 2 is simplifying it's framework, the only thing I have to say to that is "Thank god, maybe I'll try it again"
I'm sure they're using Object.observe it just wasn't mentioned in the presentation.
We definitely wont be switching to Angular 2.0. Hello React.
That is comparing apples to oranges. I agree that React is a view layer, but jQuery is most definitely not. The only thing they have in common is that they (usually) act on the DOM in some way.
Agreed on your point about needing other components/architecture to use React.
React can be much more than just a view. Even before integrating Flux or a lightweight library, React can be powerful.
The router I will probably miss, but there are decent router components for react.
Services, factories and providers? Rather big words for some insignificant differences.
The only thing I'll really miss is simple data-binding - but it has too high of a performance cost anyway. Simpler server-side rendering and testing will more than make up for that.
Looking at directives vs react components, it seems like many Angular features are just workarounds for some of its design choices.
What bugs me the most is the cognitive dissonance caused by what I'm reading about the new Angular. Its supposed to be more modular. Yet the thinking shown on these slides is quite the opposite:
* it introduces attribute changes in the markup that seem disharmonious with CSS selector syntax.
* it now also coupled with a new language in order to be used sensibly, which reintroduces annotations - another language-in-language that may lack the proper design care to make it composable and usable (e.g. how do you combine 5 annotations into one? I have no idea, guess you'll have to copy-paste them)
In short, to me it seems like Angular 2.0 is intent on going forward with adding even more complexity while breaking backward compatibility. "More modular" is not what I'm seeing here at all.
This makes me think that Angular didn't think through their API for the 1.0 release. I would have thought Angular could have been written to improve the performance where needed without such drastic changes to the framework.
There's a lot to by critical about Angular... least of which is that it's own dependency system doesn't play well with others. The reliance of jquery is pretty heavy (since most wind up including the full version, and the light version is loaded). There's a lot of extra boilerplate that the new design will tear down.
With node's tooling in current JS development, package management and modularization have become really easy to do. Testing has also gotten easier with this. Yes, browserify and traceur add some overhead to the mix, but it's still lighter than using the mega tooling stuff like jQuery. And don't get me wrong, I like jQuery a lot, and it's a really nice toolkit... but sometimes you only need a screwdriver, and an adjustable wrench for a job, not the whole huge craftsman toolbox.
Another issue is simply that the current angular would be unlikely to have a story around server-side rendering, and I think that's especially important for any next generation tools.
quoted just to remind people that Angular as we know it is older than most other single-page app frameworks - even if it only became popular a year or two ago.
I think it really comes down to more developers actually embracing JavaScript and the tools that the system offers. I think the JS renaissance is upon us, and that's what has people looking to Angular, Flux/React, Meteor and other new frameworks and tooling.
So this is the first massive API change in probable well over five years, with lots of technology changes happening around (most importantly ES6).
The good news is that if your code is clean, a migration shouldn't be too painful. The danger comes when you have unmodular code that sticks everything on $rootScope (for example).
We've been looking at React at work over the last week, and were considering moving some of our angular directives to react. Now there is a larger case for building a complete app in Flux.
It's so incredibly designed, even without the ES6 optimizations of 0.12.0 (coming soon) you can code today in ES6 (I use 6to5 with JSX transformer harmony just in case).
With React somehow the whole data flow and how components work and even JSX make a lot more sense.
Facebook also has members on TC39 and is quite involved with evolving the language.
The problem is of course that this will lead to a big divide between 1.x and 2.x that eventually will undermine the entire project like what happened in python and Volapück.
Angular 2 looks really cool... they seem to be embracing the shadow-dom concepts (like polymer) as well as es6-style import directives and expansion. I still think I made the right decision, but this is really cool and looks to be something that can work really well on current/next-gen browsers, but maybe not so well on currently supported browsers such as limited support for IE8 in my case :-(
I've been saying for a while that React/Flux is probably the best solution today for web applications, and that something similar to Polymer would be the best option in 3-5 years. I'll be watching this with great anticipation as Angular 2 actually changes most of my complaints about the framework today, and is really something that will come to work well.
Though, I'm not sure if they have or plan on a server-side component to handling server rendering, which is a huge part of why I went with React+Flux.
-- adding to my post --
More Info: http://ng-learn.org/2014/03/AngularJS-2-Status-Preview/
Looks like they are indeed using Traceur as a migration path, and embracing many ES6 features. Not sure how they will go with Promises, or if they'll wind up going down the generator path. There's definately some interesting reading and watching for the next year or two on this. Also, really curious where Polymer is heading in the light of this as well.
React is by far and away the best the market has to offer right now. From my perspective client-side applications are a solved problem thanks to React.
React completely changed the way I thought about rich clients. It took me a little longer than 2 days, I went into React with an absolute hatred of anything Javascript and came out 2 weeks later loving it. There is something to be said for a library that can wash away over 10 years of built up anger for a particular technology. It's not just another revamped library thrown into the frying pan, it's a complete rethink of how rich clients can be developed almost effortlessly with code that anyone can read. When I got into react, all I could think was "yes, this makes sense, this is how it should have been all along." Moving into the future I expect most libraries will unify under the concepts introduced by React in the same way that most web applications frameworks are different flavors of MVC.
Angular has a void with the lack of a useful enough eventing solution - $scope eventing has specific use cases, but you don't want to use it as a general event bus, mainly due to performance. This is important for Angular since you don't want to couple modules together with hardcoded state keys that you may want to alter in different applications.
Flux does offer a way around the eventing problem at a lower level within React components, but on a higher level, there is no application level of control - you have to construct exactly the control you want, which while liberating, also is an easy way to create a hole in architecture when designing an application if you're not careful. Angular exposes that problem directly in many ways (for example handling transitions between two urls in the application), as well as forces thinking about module dependencies with dependency injection.
HTML mixed in with JS via JSX is also an abomination, that originally made me want to run far away from React when I first looked at it. I'm not a huge fan of it still, but it's not an extremely terrible thing as long as you keep higher level templates slim, which React forces you to do in order not to have huge chunks of HTML mixed in with complex JS...although I'm sure there are developers out there who do it anyway (just like there are plenty of Angular developers who will toss plenty of jQuery in an Angular controller).
I've found that using a publish/subscribe system for communicating between components makes them more loosely coupled and modular. In most cases, the components I've written are naturally somewhat slightly coupled so I just pass around functions as props from parent to child components.
> HTML mixed in with JS via JSX is also an abomination ...
Totally agree. I use the default React.DOM elements instead. I find them more transparent and easy to read, and manipulation of these are much easier using the map, filter, folds etc.
I agree - my company is going to open source an event machine for Angular sometime in the next couple of months which should address this hole.
> Totally agree. I use the default React.DOM elements instead. I find them more transparent and easy to read, and manipulation of these are much easier using the map, filter, folds etc.
Unfortunately it doesn't seem like React documented React.DOM :( . I would rather just use HTML, but I would rather have it in a separate file. Perhaps a build tool for grunt/gulp where you can register keys with the path to the template being the value, and the tool converts the value into the React.DOM elements would be a good idea.
React.DOM.div(), etc. are part of React's public API -- if we didn't document them, that's a mistake.
Edit: As a note, I did find out how it worked by doing source code diving two months ago.
Why?
Ha! It made sense to me. It was very easy to explain its purpose and it is entirely optional.
- this feels like it is a key conceptual difference but I'm not clear on what this means.
Never got beyond all the directives, digests, factories, services, scopes, dependency injentions, all the ng-* tags and so on. That is a lot of terminology for something that is supposed to make developing web appliclations easy.
Granted I am not a Web UI developer was just curious what everything was excited about.
Maybe all this complexity just makes sense to someone who already did all the more complex stuff wiht jQuery? Not sure.
Anyway React made sense to me. The whole data flow ideas, minizing mutable state and inter-dependencies between components, VDOM and even JSX.
So I like React a lot better.
It seems to me that the integrated approach of angular isn't answered by react.
You are correct that React alone won't replace Angular, but with other tools (Ampersand, Flux, etc) you can use the pieces that you want and put them together. It's the difference between a library and a framework.
Now react may help with the performances of refreshing the dom in that scenario, but so far i didn't encounter that issue myself.
I do find that the flux model makes more sense to me. Flux is a set of best practices, they use React for the rendering/view portion, and since their talks there have been several implementations of the workflow. Some using Ampersand or Backbone, others implementing their own pieces. Now Facebook has been releasing their own implementation...
It's all pretty interesting.
Router - Backbone's router, page.js etc
Web service querying - simple jquery ajax calls or you could use breeze.js, pouchdb etc
Unit testing - React has one built in, but you could use others too.
And there you have your answer :)
What the JS people don't seem to grasp is that I don't care how many libraries are out there. I care even less about the incompatibilities and the different release cycles of all those libraries. By now, I hope you understand that my interest in maintaining and integrating all those into a coherent system approaches zero.
I am a software engineer and not a JS technologist. The front-end is just 1-10% of any serious system and yet, in the JS world, it takes 90% of the time building it and maintaining it. It just doesn't add up.
Imagine 10-15 years ago if we had to build GUI apps by mixing and matching 100 incoherent libraries, that in 1-5 months some of them will be obsolete, abandoned or whatnot. This is what JS has accomplished today and people just take it for granted.
Now I am sad and I will return to my crying corner.
While it is true that there are far too many frameworks that come and go in JS land, you can find very stable, well-maintained and clean libraries too. For anything that's essential to your stack(DOM interaction, routing, UI elements etc), typically you'll find multiple well tested and stable libraries. Atleast, that has been my experience.
With well designed libraries, integration is rarely a problem. They are designed to be interoperable and don't make too many assumptions about things they aren't good at.
It takes a little bit of work upfront, but I find it's far better than relying on monolithic frameworks that tries to do everything under the sun(and usually fail).
Switch to React, I guarantee you that your front-end dev time(and overall) dev time will drop drastically to 20% :)
For every well maintained JS "technology" there are 100 others that aren't and they occupy the same playground. Evaluating them takes more time than one might think and at the end of the day, what you choose carries a huge risk. Yes this also happens in other aspects/technologies, but with JS stuff the risk is almost always higher.
A word about monolithic systems; You give too much credit on what a JS framework does. It's just one job. Do you ascribe the same term to GTK or Qt for example?
To be honest, React seems decent. I don't necessarily disagree with you, you just touched... a nerve of mine :)
If I ever have to evaluate JS frameworks again, React will have its turn then.
Cheers
Wow, I want you to come work for me for a week. The front end is what interfaces with the user - your client - the one whom is paying money. You may hate JS, but it is the tool that we use to build interaction.
I don't want to underplay the importance of the front-end, or in general the interfaces and what that means for bringing value to a product.
But however you spin it it's not the core technology. You could make the same point you made, by saying the same about the marketing/sales department. Yes, it's how you bring customers and without it you'll probably fail to reach a large audience. But again, it's not the core of your product.
Also keep in mind that mobile platforms(which are quickly becoming much more important than the web) also have a user interface. Take a guess at which of the 2(web/mobiles) are more costly to develop and maintain. The web, by far. That can't happen for much longer, that's all that I'm saying.
Now what would be interesting questions though are: 1) How many people work in the backend and how many work in each of the respective front-ends.
2) Suppose that you had 2 front-end interfaces, angular(for the web) and an android app(it could be an iPhone app, it doesn't matter). How many backend devs would need to know or actively interact with the angular front-end and how many would need to interact with the android app.
In my case, none of the backend people(a lot) need to interact with the mobile codebase(2-people team for every mobile type), while all of us need to help or interact with the web front-end.
I see similar scenarios with most of the companies I interact or know about. The mobile team is almost always autonomous and can accomplish a lot with just a few people. While hords of people are thrown into the web frontend, even if it's not their primary specialty. Hence the need for fullstack developers. Why? Because the JS ecosystem sucks and we still don't have a real integrated solution. I hope that this will change, preferably before I retire.
More often than not, the web frontend ends up being client side HTML/JS and some sort of intermediate middle-end server that hosts that HTML/JS. That way it turns into a fullstack app that does some processing on the middle-end to pass it on to the front-end JS.
You can make the frontend 100% static HTML/JS (and serveable off any static file CDN), so all you have to worry about is the API between them.
Using something that does all that for you is tantamount to outsourcing all the engineering work to the makers of that thing.
If you're given and entire system and just have to put the pieces together according to what the client needs, then you're basically a plumber.
Now there is nothing wrong with that, it makes good business sense, which is the justification you provide, but its not really engineering. Or if it is, it's only a small subset of the problems engineering solves.
Do you think the builders of the Golden Gate Bridge, the Hoover Dam or the Space Shuttle didn't have to think about all the bits and pieces they would need source and bring together into one coherent whole? That's engineering.
Unless you're trying to tell me that people who build e.g. KDE with the Qt framework are plumbers and people who develop with Backbone.js are engineers. In which case I wouldn't want to engage in such a discussion.
Neither Angular nor React nor Backbone are equivalent to KDE or Qt, so those are false equivalencies use to construct a poor excuse for a strawman.
The user agents (browsers) and the web as a platform is the closest equivalent to Qt, since collectively, they abstract away all the differences between platforms as Qt does. Collectively and individually they represent excellent examples of engineering. The problem with them is that the problem they are trying to solve basically changed from what Tim Berners-Lee originally tried to solved. He tried to make a hyperlinked document platform, not an app platform. The web is now trying to evolve to supporting apps while also remaining a good documentation platform.
React would be most closely equivalent to added the paint/draw and retain-mode graphics part of Qt to the web. Flux and its different implementations and the various libraries out are likely equivalent to different solutions for events and data stores available in the Qt ecosystem, but I'm not a Qt developer so I wouldn't know. Those who built react are doing engineering as are those who build with react, it's just that the latter are absolved from solving the engineering problems related to render/paint/layout and retain-mode graphics.
Angular is an attempt to bundle everything together (render/draw, events, data) into one monolithic framework solution, doing reasonably well, but none exceptionally well. Those who built angular are doing engineering. However, those who build with angular are basically doing plumbing.
People who build with KDE and people who build with angular are basically performing the same type of work.
I don't know what backbone is equivalent to in the KDE or Qt world, but I would imagine it's probably some early library/quasi-framework in the Qt world when it was still the wild west and there weren't very good engineering practices and project organization strategies in Qt projects.
I can't believe I wasted my time responding to your logical fallacy.
First of all I stupidly thought that the part about KDE/GTK which is in this comment of mine https://news.ycombinator.com/item?id=8508094, was included in the comment to which you replied. So my bad and -1 for me.
What I meant is I don't think that anyone sees Qt or GTK as monolithic systems and they are about 1000 times more complex than any JS library you could name, as they solve a myriad problems to which JS is oblivious and wouldn't be able to solve anyway.
Contrast that with the web situation today, where they can't even decide which is the view, which the controller or "hey, maybe these don't map very well on the web side of things". Yes I agree about Tim Berners-Lee and the http stuff. But at some point things have to converge into something coherent, because the problem we have to solve is quite elementary, compared to other technologies.
Also if you honestly believe that people who developed KDE and people who develop with AngularJS are performing the same type of work... it just betrays the fact that you're just a JS programmer and haven't seen some real engineering work.
Javascript touches the tip of the iceberg with regards to technical challenge and Software Engineering, so please... just take a breath :)
It creates unneeded wasted work in evaluating and comparing the alternatives; it makes maintenance harder and slower as people moving between projects have to get used to different components and styles every time, etc. Opinionated frameworks have a valid engineering reason for being and staying opinionated.
AngularJS does too much, and nearly all of that too much poorly.
Really the choice comes down to whether you're a "single big framework" or "lots of little libraries" type of guy. The former should go with Angular2, the latter with React, IMO.
It's really not that huge of a jump from Angular 1.0 to Angular 2.0. Small example:
<button ng-click="addTodo()">+</button>
becomes
<button (click)="addTodo()">+</button>
and
<div ng-controller="SantaTodoController">
literally becomes
<div>
Getting the advantage of 1 framework that's batteries included + universal (i.e. taught in CodeSchool, Tuts+, etc.) vs. an eclectic selection of libraries all over the place, gives Angular an advantage IMO.
Also pay attention to the new createFactory method which aims to make it easy to separate your changing HTML from the static HTML (which you would have previously used a templating library for)
My recommendation is to not use JSX ever since it breaks a lot of your tooling. The first impression people get is that "Hey this makes my code easier to read", but that is only because JSX introduces the problem that it attempts to solve.
Basically most HTML structures are 80% unchanging and 20% changing (the reason we use templates in the first place). React.DOM was a pain previously because you'd define a complicated HTML structure in Javascript, which isn't really any harder or more complex, but then you'd have all this code that was never changing distracting you from the code that was changing (i.e. your app behavior). JSX fixed this problem by turning all the static bits to html like templates do so it was visually easy to separate from your behavior code. This was the wrong solution because it's over engineered and breaks compatibility with a lot of things.
createFactory essentially allows you to "partially apply" the static parts and get a function that only needs to deal with the dynamic parts (like compiled template functions but for virtual DOM)
Anyways, check out the following links:
React implements UI views and controllers. You write views that know how to render themselves, and then you write views that control them; the latter type of view fulfills the role of the classical MVC controller.
For example, consider how Cocoa works. It's a classical MVC framework: You have a view controller, which mediates between data and views. The controller doesn't know how to render anything, but it listens to data modifications, and sends update commands to the views; it also listens to changes to views and propagates those changes to the data model. (You can also let Cocoa Bindings do it for you, for the most part.)
In a single app, you typically end up with many such controllers, typically one per window, and controllers can reference each other to facilitate communication; also, there are often controllers that individually control just a single view, because it's easier to encapsulate reusable components that way. For example, if you need a text field that autocompletes, you could subclass NSTextField and build this special behaviour into the view itself, but it's cleaner to create a controller that can bind to any normal NSTextView.
In React, you have the same distribution of controllers (some handling big, multi-view layouts, some targeting discrete views), but the controller actually takes part in the view hierarchy: A controller has views as its children. It may not even use DOM elements, but consist entirely of custom view components. And it does exactly the same stuff as a controller would. For example, it may contain this:
<Form>
<TextField label='Name' minLength={3} ref='nameField'
value={this.state.name}/>
<NumericField label='Age' min={0} ref='ageField'
value={this.state.value}>
</Form>
In this example, TextField and NumericField would be generic view components, just like the standard Cocoa views; the controller wouldn't be doing anything view-related like working with the DOM, but it would mediate between the data model and the child views that it controls.This is very much like building out a form in Interface Builder and connecting the actual controls to variables using IBOutlets. In fact, I would argue that there is hardly any distinction at all. The difference is that the UI is declared in the controller. And why not? Interface Builder is separate, and keeps its view data stored separately, because a WYSIWYG editor can't touch code. (Actually, Delphi showed that it was possible, but that's another story.)
The fact that there is a separation isn't actually useful to anyone. You generally cannot edit the view layout without breaking code, and you can't edit the code without breaking the view: They have to be maintained completely in sync with each other. So you might as well just keep the view layout in the same file as the controller. Which is what React does.
As someone working on a team that practices a good amount of separation of concerns, this is patently false. This is more dependent on how good your template language is than anything, but this separation helps to assure that we're not introducing new bugs or the like.
The main arguments for React along what you're saying is that people seem to abuse the "view model" concept. It's rarely as necessary as people seem to want to make it (though again, dependent on template language).
It has nothing to do with how good your template language is. It's simply that a controller's main controller (not talking about partials here) has an implicit dependency on the controller, and the controller has a dependency on the template. Unlike, say, data models, the relationship is not unidirectional.
But really, what is this separation for? What does it gain us? We generally separate stuff out into declarations and files because it gains us modularity ("separation of concerns") and reusability. Data models are constantly reused, for example, as are views. But that one template belonging exclusively to the controller isn't reusable. It's separated out for no particular reason other than the fact that, historically, it has been expressed in a different language and must be parsed and "compiled" separately, so it has not been about "concerns" but about implementation details.
React removes that step, and because the template is unequivocally tied to the controller, there is nothing gained by separating them. The point of React is that the "template" is the component. The component's rendering is intimately tied to how its internal state and data model is wired up because the one half wouldn't work without the other, and vice versa.
(As an aside, in a well-designed, pure component, there is little state and the component is mostly template, anyway.)
(As an aside, most template languages don't even let you validate a template's inputs — that is, declaring that it requires specific named inputs and what their types/structure are. No idea why, seems pretty obvious defensive functionality to me. But React does this.)
Oooh, do tell!
Let's say you created a form, which in Delphi parlance was a surface that could inhabit controls, typically an actual application window. You would get this empty window:
http://www.vwlowen.co.uk/basicdelphi/images/theide.jpg
You would also automatically get a source file containing the class definition for that form, roughly corresponding to a window controller class in Cococa. This class would be completely empty, mind; no init code needed or anything:
http://136513.jakero00.web.hosting-test.net/wp-content/uploa...
(The GUI layout would live in a separate binary "form file" you never needed to edit directly. This file contained serialized objects that you could read and write in code, similar to OS X bundles, except more easily extensible.)
This class would be, by virtue of having the same base file name, automatically linked up with the corresponding form, so you could quickly switch between code and UI.
Then if you added a button the form, Delphi would automatically add a private member variable declaration "FButton1: TButton" to your class definition, as glimpsed here:
http://www.delphisources.ru/pages/faq/master-delphi-7/conten...
The framework would know, from the GUI definition, that FButton1 was that button. You could edit it and move it around in your code, and it would still be bound correctly.
Same thing with event handlers: If you went into the button's inspector and double-clicked on the "click" handler, it created the method for you, and placed the cursor in the right place so you could immediately fill it out with code.
This system made developers insanely productive, because the "boilerplate interactions" were reduced to almost nothing, and all the work was actual work. No "IBOutlet" stuff needed, no manually connecting the variable to the right thing in the GUI builder, and very little setup.
A few more brilliant, deceptively minor details made this even more magical. First, the form you edited was truly "live". Delphi actually rendered real controls in the editor. If you created a control that did custom rendering, it would render like that in the GUI editor, live. Interface Builder sort of does this, but not quite, and custom controls are a pain and apparently no longer supported.
The second thing was the object inspector:
https://www.ibm.com/developerworks/data/library/techarticle/...
Interface Builder has a very poor one; Delphi's felt natural. Every property exposed by a control would be visible there through reflection: Delphi would actually parse properties out of your code. It supported structured properties, so if something was a TFont, it expanded into sub-properties for font name, font size and so on.
If you created a new class TGradientButton or something, and exposed two properties FromColor and ToColor, they would show up in the object inspector, automatically, and since these properties would be something like TColor, it would know to display an RGB widget for them.
You could also register custom object inspector behaviour, so that, instead of FromColor/ToColor, perhaps there was only one property "Gradient" of type TGradient. Your custom object inspector thingy could then render a gradient editor for that property.
XCode + Interface Builder is about 10% of what Delphi was. I say "was", it still exists, but I haven't touched it since around 2000-2001. It's insane that Delphi 1.0 in 1995 was more powerful than XCode + Interface Builder today.
(I suppose it lives on in the Visual.NET tools; after creating Delphi, Anders Hejlsberg joined Microsoft and created C#. But I haven't used any of it.)
React is very cool, no doubt, and I use it in my own app, but let's not get ahead of ourselves. React is far from perfect:
- the Virtual DOM is a leaky abstraction: you sometimes need to get your hands on a real DOM node: http://facebook.github.io/react/docs/working-with-the-browse...
- if you're updating the virtual DOM from anywhere other than React's event loop (for example from a setTimeout() or XHR callback), batching doesn't happen properly which can lead to inefficiency. Needing to be aware of what runs inside a React event loop vs. what doesn't can add application complexity. More info: https://groups.google.com/forum/#!topic/reactjs/LkTihnf6Ey8
- writing manual event handlers is a somewhat more manual and less expressive than some of the two-way data binding approaches like Knockout.js or Angular.js.
You can argue about the minor details of the tech stack till you turn green and blue, but Angular wins because it succeeds in the only metric that really counts.
jQuery: (for reference)
5,656 commits
7 branches
122 releases
199 contributors
React: 3,003 commits
10 branches
18 releases
226 contributors
Ember: 7,490 commits
35 branches
90 releases
412 contributors
Angular: 5,988 commits
12 branches
111 releases
1,044 contributors <---
I have made a bet on Angular two years ago and the reason was: They understand how to herd cats. They get community right and at the end of the day, that's the only thing that really counts (no matter how much nerds like to pretend that it doesn't and it's all about technological purity or what have you).I am absolutely confident that they are making good calls and the way they have handled the transition periods so far (and the way they are going about these new "big" changes) only increases my confidence.
I would be very surprised if in a few years, Angular wasn't on the same level of "you can basically assume that it's loaded" as jQuery is.
[0] https://www.flickr.com/photos/valanx/14136669418/in/set-7215...
A proper argument would be: jQuery has about three times the contributors that mootools has. If I had to decide between mootools and jQuery, I'd pick the second because of that metric alone, yes. (And this is how the market ended up playing out.)
Angular (born Jan 2010) has 2.5 times the number of contributors of ember (born Apr 2011), 5 times of React (born May 2013). I'm not just trying to find a reason to dismiss React and I do realize that it is still young. From a business standpoint, though, the choice couldn't possibly be any clearer.
I do agree that React has gathered a sizable crowd in a short time and it's definitely on my list of projects that I keep an eye on. But it's simply too young to warrant the same kind of investment that I have personally made into Angular.
Sure .. it makes sense. Though one of the main selling points of React is that it's dead easy.
We are big boys and girls here we can take the technical details. No need to use all these external proxies.
I think once proponets start to point to all these other things and not to nherent benefits or advantages of the technologies, they have already lost me.
I don't think you can reasonably say that there's "the only metric that really counts". All these metrics are indicators of activity anyway, not quality.
> They get community right and at the end of the day, that's the only thing that really counts.
The number of contributors is an indicator of the terminal goal. It's not the terminal goal itself. It's very important to remember that.
Some like Angular, some like React, some like Ember. Companies are successful with all 3 of these frameworks. And that's what counts. What's important is whether the tools help us get things done. And all 3 frameworks do exactly that, in different ways.
You can try to say "I win", but you only win if your product works better than your competitors, not if you have a "better" framework.
Popularity is not the most useful measure but it is a useful metric to determine the viability of a framework and it also gives an idea about how open a team is to outside contributions which is a huge factor in eventual success. (See: Linux vs Minix).
I'm not a fan of Javascript either on the clientside or on the serverside but I agree with the GGP that they seem to get community right and even if every other decision they make is wrong in the long turn that may make them the equivalent of PHP in their domain.
The same is true for React but not for Amber nor jQ.
However React's docs are much simpler than Angular since it only provides the View and the docs are only a few pages really.
But I see the comparisons is between Apples and Oranges here.
jQuery is a DOM library.
Angular and Ember are client-side MVC libraries.
React is an [isomorphic] UI library.
IMHO Angular/Ember and React and jQuery don't even compare in the same planes.
I'm not supporting React here, but its quite new and off late its getting a lot of traction. So the number of contributors and commits for a library that's quite new is astonishing!
And frankly I feel Angular team made a huge mistake by completely changing the syntax which makes it difficult to be adopted by anyone that knows/uses Angular 1.x.
The number of committers only gives you some insight to any three of these things, and can actually mislead you. The Javascript ecosystem is ridiculously fast moving (which is a nice way to put it :)) so number of committers doesn't tell me if all those folks will just jump onto the next thing that comes along. Also, the Javascript community has developers of a wide variety of skill levels, so the number of committers doesn't necessarily say much about the quality of the library without understanding who these committers are. I'd argue there is often a small number of key contributors to any open source project, with other folks contributing small patches to fix bugs or minor enhancements, so the total number of committers doesn't tell you a much more important thing: who are the key contributors, what is their background and views on software engineering, and how likely are they to remain committed to the project over the long term?
It seems to me the main thing Angular has going for it is that Google has bought in to it, so that means no matter how flawed it is (or not), it's not going anywhere anytime soon so you can be sure security fixes and bugs will continue be addressed over the long term. Then again, Facebook seems all-in on React (and I'm not sure about Ember) so maybe this isn't much of a differentiator.
I recently began searching for a new JavaScript job. I don't like Angular at all and I am skipping all positions that mention it. I have to skip ~90% of all ads. Think of it – 90% of companies that are expanding their web development use Angular.
So, even if this change will kill Angular, it will probably take years. It has become too big to fail.
If you like Angular, get excited about it. Look at how .NET or Java guys accept everything coming from Microsoft or Oracle. You are in a similar ship now. No one got fired for choosing Angular. No one will.
In terms of roles I see posted on LinkedIn in the UK (which may or may not be representative of the industry as a whole, but it's all I've got to go on), there's a lot of Angular, a lot of "Angular or similar (eg. Backbone)", and a lot of "MVC (eg. Angular, Backbone)". Many of those same roles do also mention jQuery, but not with the same sort of billing it might have had two years ago. I'm not sure I've ever seen a role specifically mentioning Ember.
Like quite a few others in this thread, I'm an Angular naysayer for the standard reasons, and would generally prefer to avoid it, but the market does rather dictate what we end up doing sometimes, for better or for worse.
Listen, if I can figure it out and get lots and lots of work done with it, it's neither horrible nor overblown and the barrier of entry was there but I got over it. By all means, keep ignoring it, but drop the shtick where you know better than thousands and thousands of us out here building things with it.
I'm in agreement with your point, but... if 'the market' wants angular... 'the market' is going to have a hell of a time dealing with a mess in a couple of years when many of the decision makers that mandated angular move on to something else and leave piles of mess behind for someone else to clean up.
Previously there was no the framework for web frontend development (like Rails for Ruby). From now on you will need convincing reasons to use anything else, even if it is clearly better. Moving on to something else will be much harder.
On the other hand my wish is not to get into stupid arguments at my new job :)
That's already happening. Two contacts came up in the last two weeks with Angular projects gone off the rails (pun intended).
> Why waste time learning and suffering through AngularJS absurdities when ReactJS exists?
Because I'd have to suffer through learning and integrating Backbone or Flux in addition to React to accomplish what I could by learning just Angular. And then I'd have to hope that my choices remained compatible with each other through version updates. Anyway, I may find React to be a better designed lib when I get around to using it, but it's definitely not an apples to apples comparison when it's only attempting to tackle 1 of the pieces that Angular handles.
That's a weird argument. Just because you think it's not horrible or overblown doesn't really mean much. That's just an opinion.
I've worked full-time with AnguarJS over a year, and I know it pretty well. It's easily better than jQuery spaghetti code, and probably better than most data-binding frameworks. It has lots of issues, though. From bad documentation and performance to the mess of $scope.$apply/digest loop and a lot of moderate design problems.
Anyway, the biggest problem is the boat. AngularJS is really trying to "eat" other libraries and actually doesn't try to be modular. A data-binding/MVC framework shouldn't invent it's own module system, and recently it's own programming language. Apparently Google is trying to kill of jQuery too and substitute their own system. And they want to reinvent everything as AngularJS modules instead of "plain" JavaScript code that can be used across multiple frameworks.
What I'd like to see in AngularJS 2 is a tiny core which does data-binding without $scope.$apply, is fast and modular and could be used with a wide range of other frameworks. What I don't want to do is start writing AngularJS modules with AtScript and using their forced(?) ES6 classes.
In addition, it would appear that we would be able to use these libraries with Node.js as well.
I can only see this being a good thing.
A contrary opinion to the OP's opinion. Are you asking me "where's the data" (?), because this whole thread is opinions.
edit:
> It has lots of issues, though.
No argument here. Providing validation feedback on forms, for instance. I'm not arguing that it's perfect and that I'll never love again, but it has opened up my head this year and for that I'll go to the mat for it.
I agree with your comment about it. I tried it and didn't like it. I've talked to a few devs who Have mentioned issue in larger projects more around organizing the code base.).
Regardless of all of that. There's so much demand that I'm going to drop emberjs and learn angular.
A platform like this achieves critical mass when it starts appearing in McKinsey slides, and then it will become a permanent fixture in job ads for the next 10 years. I guess Angular has reached that milestone.
I haven't done the exact numbers and 90% seems really high, but it feels like it. I bet the exact number wouldn't be lower than 75%.
I live in Eastern Europe, but I am mostly looking for remote jobs. I am a real full-stack developer and would gladly work on backend with Node.js, but these jobs are even rarer these days.
Only a brave woman would build her house on GWT
I'm honestly surprised how often I keep hearing about its high barrier to entry. I've worked on ~5 different MVC style web frameworks, all server side, over ~5 years of professional programming. I just started a front-end position using Angular for the last three months, and have found it pretty straight-forward to pick up. That is, the concepts I learned server-side have translated fairly cleanly to the front-end.
Most of the people I've seen struggle with the framework so far are those that didn't have that server side experience. Which isn't to say its required, but only to say some of the concepts they struggle the most with are concepts you need for any MVC style web framework - server side or front-end. Its not that they are that similar, but that they encounter and solve many of the same problems. Routing, separation of concerns, dependency injection, testing, getting what you want into the template, etc. And Angular isn't what you'd call a micro framework (see Django vs Flask or Bottle from Python world, for example). So of course Angular is large; it tries to solve alot of problems for you (how well it does so is another story).
Anyways, the take-away (from my point of view) is that much of the work that used to be done by server-side guys can now be done by front-end guys. So they have to learn all the same concepts and struggle with all the same problems to be effective.
When new language features of C# or other languages (e.g. Go) are brought up on here, inevitably those features and benefits will be contrast against other languages. And they should. Because we aren't hammers and everything isn't a nail, and even if we happen to use tool A today, we usually have the capacity to move to tool B tomorrow if it made sense.
It's similar to reading comments on a Halo (Xbox) post on Reddit. Over half the comments are flame wars about PS4 > Xbox. There have been many "framework vs. framework" potss already on HN, let's keep the flamewars contained.
Carry on.
I think people like to mention React because every since it was publicized last year Facebook has had ES6 integration in mind. With Angular, 2's goals have been up for a long time but I don't think many people thought about how much the API would have to change to accommodate the new features.
React is the _other_ popular framework today so people are talking about.
In large the discussion is fairly civil (so far), people are passionate and seem to care about the topic and are discussing it.
Breaking how the framework looks this drastically is both very brave and very risky. Especially since from discussions with Angular core (and as you can see from the presentation) - Angular 2.0 relies heavily on ES6 features and syntax which are not yet supported in any browser and worse - are not known by most web developers anyway.
The tooling will be the most interesting to me, I can only guess that they'll use node and traceur for building the output in a project to something a browser can use. I've been moving towards React (and Flux) as it lines up well with the way I've been developing with node. This just takes it a step farther.
As for the features that aren't well known, this will change and have to be learned. There's enough in the ES6 stuff that I'm running new development against Node 0.11 so that I can get generator support and some other language features in place. Though still using the CommonJS/Node style require() statements.
I do hope, that like React and its' tooling that the Angular guys have a compelling case and support for shared server/client logic and rendering as well as support for Browserify and Webpack+hot-reload. Though I like Webpack I think it goes too far from the node system, it is really nice however and I can see why others use it.
It's all really interesting... I'm curious to see where Polymer goes from here as well...
These are the reasons I'm using flux/react now. I'm really looking forward to following the development of Angular 2 now, and may just be my tool of choice for new development in a couple years.
Which is why part of the project is a compiler which compiles ES6 (actually, an ES6 superset) to ES5, which is supported by every browser.
Kind of like how people make fun of Enterprise Java Beans' FactoryFactory... methods.
This is a good thing! I'm glad they're learning, and willing to make it better. In my career I've gone from ASP -> PHP -> ASP.NET Web Forms -> ASP.NET MVC -> Angular/knockout/react. We're developers, if you can't flow with change you should move on to one of the more established engineering disciplines.
Your clients or employers suddenly have to worry about one extra thing because their newly developed applications/systems suddenly become 'out of date' simply because the crazy churn in on JavaScript frameworks API.
It is not a good thing. We are invalidating people's investments, time and money for no good reason.
Don't be that programmer that leave shit all over the place for his/her successor to pick up due to bad choice of technology stack.
With JS, all the frameworks and libraries out there are just a few years old. Angular is about 5 years old, but Google doesn't even use Angular in their sites, which should be extremely telling (along with the complexity learning and figuring out the API). In fact I think Google isn't even planning on Angular on any Google sites in the future. They are waiting until Web Components are finalized.
With React, it is apparently mature enough, it is used on Facebook (1 billion users), Instagram (a child company of Facebook, like Youtube for Google), Khan Academy, Github (github issue viewer), AirBnB, CloudFlare, and a lot more:
https://github.com/facebook/react/wiki/Sites-Using-React
In the JS world, there's a lot of reason to keep moving forward with tech. Sure it doesn't have to be the latest and greatest, but since JS is such a "poor" language, a lot of these newer tools, features, framework, and libraries help build more professional, quality code. Shying away from newer tech (again not the latest and greatest, but away from tech that improves quality of code) highlights obstinance and ignorance about the technology behind it, as well as how little someone understands the industry today.
Angular is also used by a formidable set of companies in production - Microsoft, Google, Apple, VMware, Netflix, MSNBC, Bloomberg, Washington Post, USA Today, US News & World Report, Amazon, Udacity, Cisco, and countless others. I have heard of it being used in the financial sector quite a bit as well. The prevalance of Angular and the strong support by Google is far more telling.
Of course, I gain nothing by someone choosing Angular over React or vice versa. I'm just sharing my experience and leaving them to make their own choice.
Does anyone have some idea about when this launches and when it can be sort of considered stable for building apps beyond mere prototyping? Curious about the timeframe :) Thanks
I've found that no knowledge I've gained from learning technology/framework/language etc has ever gone to waste.
Somewhere down the line, the insights gained previously come in really handy or even make something that I thought wasn't possible, realizable.
Two years in internet-time is a long time! For all you know, civilisation as we know it will have ceased by then.
Edit: They took it down, sorry :\
I don't think I'll use Angular for any new projects, they basically flushed every library and documentation (1st and 3rd party) down the drain.
> the framework will be “drastically different looking”, meaning users will need to get to grips with a new kind of architecture. It’s also been confirmed that there will be no migration path from Angular 1.X to 2.0.
> Currently Angular is aiming for a release by the end of 2015 – but early 2016 seems more realistic given the drastic changes that are planned.
This essentially makes investing in Angular pointless, when there are far more capable and easier to learn frameworks out there - Meteor primarily, and also Derby.js, though it's got about 1/10th of the momentum of Meteor, which launched 1.0 two days ago, and had 20k GitHub stars without backing from some giant company. BTW, Meteor never broke compatibility with earlier releases in such drastic ways as Angular will.
They should provide a path to easily shift programmers thinking from 1.x to 2 (hopefully it is already in their roadmap)
2. They are following the http://semver.org definition of a major version change perfectly fine "MAJOR version when you make incompatible API changes".
3. If anyone is bothered by the complete shift, fork Angular at version 1.3 and maintain it yourself. That's the joy of open source. You might even be a hero to many other developers.
- clean model abstraction, which prevents soo much boilerplate - clean templates - components, partials, great re usability
Ember 'feels' so much more right to me. I really enjoyed working with it and it reminded me of the desktop frameworks I used to work with. It's not without it's faults, but what is.
But sadly Ember just doesn't seem to be holding it's head up in the ongoing swell of JS frameworks. I think that is a great pity. But time goes on and they'll all be forgotten in a few years.
(Because it looks fascinating, but I'd like to see some detailed documentation and examples on how it's going to work.)
It's not proper documentation but debates and design documents but it's all there.
Of course - not to forget https://github.com/angular/Angular2.design
[1] http://angularjs.blogspot.fi/2014/04/angular-and-durandal-co....
I think this is excellent use of attributes and good way to refactor things. What others pointed out, this is different framework :)
It's also safe to say this is just too big of a change without public commentary. Way too big.
Seems like a very big leap considering people are just getting use to the way AngularJS 1 works ($scopes etc).
I'd venture it's ecmascript 6 being used, as Google suffers NIH syndrome too..
Looks like it's great if you're starting from scratch though!
or best is, just scrape client side MVC framework, and fallback to server MVC framework