Fork me on GitHub

TodoMVC Challenge

This challenge consists of trying to use Assetgraph to build every example application implemented in TasteJS's TodoMVC project.

Rules:

Running the build system will be done like so: buildProduction --outroot <appname>-dist http://todomvc.com/path/to/appname

The buildProduction binary I'm running can be found here. It is a part of Assetgraph-builder, which is wrapped by Grunt-reduce, making them functionally identical. This should ensure that my results will be reproducible if you choose to switch your build step to grunt-reduce.

I will log my progress with building each of the apps, showing you build success or failure, what steps I had to take to make the build work and what bugs I found and had to fix.

My end goal with creating this challenge is to prove the worth of assetgraph as a build system stable enough to be a plug in replacement for the current Grunt build chain that is auto generated by most Yeoman generators.

Status

Out of total TodoMVC apps, are working, are not working and are so far untested. apps are following a bad development practice which assetgraph will never support.

Bugs found


JavaScript Apps

Before After

Backbone.js

Backbone.js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.

Log

  1. 2013-12-23: Built using local branch fixing #137. App works!
  2. 2013-12-12: Bug reported to Assetgraph
  3. 2013-12-12: Build Failed

Before After

AngularJS

What HTML would have been had it been designed for web apps

Log

  1. 2014-12-11: Use ngmin to annotage AngularJS minifier unsafe syntax
  2. 2013-12-11: Build Successful. Source code non-minifier safe

Before After

Ember.js

Ember is a JavaScript framework for creating ambitious web applications that eliminates boilerplate and provides a standard application architecture.

Log

  1. 2014-02-13: Build Successful
  2. 2014-02-13: Errors identified as global 'use strict'-directives affecting minified Ember. Pull request sent to TodoMVC.
  3. 2013-12-12: Bug reported to Assetgraph
  4. 2013-12-11: Build Failed. Throws "Uncaught ReferenceError: Ember is not defined" after minfication

Before After

KnockoutJS

Simplify dynamic JavaScript UIs by applying the Model-View-View Model (MVVM) pattern

Log

  1. 2013-12-13: Build Successful

Before After

Dojo

Dojo saves you time and scales with your development process, using web standards as its platform. It’s the toolkit experienced developers turn to for building high quality desktop and mobile web applications.

Log

  1. 2013-12-13: Build Failed. Tonnes of errors caused by AMD require references for missing files

Before After

Vue

Vue.js provides efficient MVVM data bindings with a simple and flexible API. It uses plain JavaScript object models, DOM-based templating and extendable directives and filters.

Log

  1. 2014-02-13: Build Successful.

Before After

YUI

YUI's lightweight core and modular architecture make it scalable, fast, and robust. Built by frontend engineers at Yahoo!, YUI powers the most popular websites in the world.

Log

  1. 2013-12-13: Assetgraph bug: Inline script block get moved up before external script that defines the global it references
  2. 2013-12-13: Assetgraph bug: Missing relation modeling for YUI module dependencies
  3. 2013-12-13: Build Successful. Application doesn't run

Before After

Agility.js

Agility.js is an MVC library for Javascript that lets you write maintainable and reusable browser code without the infrastructural overhead found in other MVC libraries. The goal is to enable developers to write web apps at least as quickly as with jQuery, while simplifying long-term maintainability through MVC objects.

Log

  1. 2013-12-11: All green!
  2. 2013-12-11: Bug reported to Assetgraph
  3. 2013-12-11: First build run fails

Before After

Knockback.js

Knockback.js provides Knockout.js magic for Backbone.js Models and Collections.

Log

  1. 2013-12-23: Built using local branch fixing #137. App works!
  2. 2013-12-15: UMD pattern treated like RequireJS even when not present
  3. 2013-12-15: Build Successful

Before After

CanJS

CanJS with jQuery. CanJS is a client-side, JavaScript framework that makes building rich web applications easy. It provides can.Model (for connecting to RESTful JSON interfaces), can.View (for template loading and caching), can.Observe (for key-value binding), can.EJS (live binding templates), can.Control (declarative event bindings) and can.route (routing support).

Log

  1. 2013-12-23: Built using local branch fixing #137. App works!
  2. 2013-12-15: UMD pattern treated like RequireJS even when not present
  3. 2013-12-15: Build Successful

Before After

Maria

An MVC framework for JavaScript applications. The real MVC. The Smalltalk MVC. The Gang of Four MVC. The three core design patterns of MVC (observer, composite, and strategy) are embedded in Maria's Model, View, and Controller objects. Other patterns traditionally included in MVC implementations (e.g. factory method and template) make appearances too.

Log

  1. 2013-12-15: Build Successful

Before After

Polymer

Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers. It is comprised of core platform features (e.g Shadow DOM, Custom Elements, MDV) enabled with polyfills and a next generation web application framework built on these technologies.

Log

  1. 2014-02-13: Build Successful
  2. 2013-12-15: Model Polymer relations
  3. 2013-12-15: Lower severity level of partially parsed CSS to warning instead of error
  4. 2013-12-15: Build failed

Before After

dermis

dermis is a tiny framework that provides models, collections, controllers, and data-binding out of the box. dermis is designed to be the simplest possible solution for creating complex applications

Log

  1. 2013-12-15: Route functionality broken. Can be fixed using assetgraphs GETSTATICURL function
  2. 2013-12-15: Build Successful

Before After

Montage

Montage simplifies the development of rich HTML5 applications by providing modular components, real-time two-way data binding, CommonJS dependency management, and many more conveniences.

Log

  1. 2013-12-12: App not working. Using some kind of home brewn dependency system. Unsupported
  2. 2013-12-12: Build Successful

Before After

Ext.js

Ext JS 4 is the next major advancement in our JavaScript framework. Featuring expanded functionality, plugin-free charting, and a new MVC architecture it's the best Ext JS yet. Create incredible web apps for every browser.

Log

  1. 2013-12-15: Inline script block get moved up before external script that defines the global it references
  2. 2013-12-15: Build Successful

Before After

Sammy.js

Sammy.js is a tiny JavaScript framework developed to ease the pain and provide a basic structure for developing JavaScript applications.

Log

  1. 2013-12-23: Fails on custom template loading. Can be fixed using assetgraphs GETSTATICURL function
  2. 2013-12-23: Built using local branch fixing #137. Still broken
  3. 2013-12-15: UMD pattern treated like RequireJS even when not present
  4. 2013-12-15: Build Successful

Before After

Stapes

Stapes is a (really) tiny Javascript MVC micro-framework (1.7kb) that has all the building blocks you need when writing an MVC app. It includes a powerful event system, support for inheritance, use with AMD, plugin support and more. A RequireJS Todo application is also available.

Log

  1. 2013-12-15: Build Successful

Before After

Epitome

Epitome is a new extensible and modular open-source MVP* framework, built out of MooTools Classes and Events.

Log

  1. 2013-12-15: Build Successful

Before After

soma.js

soma.js is a framework created to build scalable and maintainable javascript applications.

Log

  1. 2013-12-23: Built using local branch fixing #137. Reveals Soma is minifier unsafe. App will work if built with correct reserved names or --nocompress
  2. 2013-12-15: UMD pattern treated like RequireJS even when not present
  3. 2013-12-12: Build Successful

Before After

DUEL

DUEL is a dual-side templating engine using HTML for layout and 100% pure JavaScript as the binding language. The same views may be executed both directly in the browser (client-side template) and on the server (server-side template).

Log

  1. 2013-12-15: Build Successful

Before After

Kendo UI

Kendo UI is a comprehensive HTML5, JavaScript framework for modern web and mobile app development

Log

  1. 2013-12-15: Build Successful

Before After

PureMVC

PureMVC is a lightweight framework for creating applications based upon the classic Model-View-Controller design meta-pattern.

Log

  1. 2014-02-13: Rebuilt with assetgraph-builder 1.8.13. Build Successful
  2. 2013-12-15: App non-functional. No JS error thrown. Needs further investigation
  3. 2013-12-15: Build Successful

Before After

Olives

Olives is a JS MVC framework that helps you create realtime UIs. It includes a set of AMD/CommonJS modules that are easily extensive, a high level of abstraction to reduce boilerplate and is based on socket.io, to provide a powerful means to communicate with node.js.

Log

  1. 2013-12-17: Won't fix support for 3 argument define. Olives is going against best practice and we do not wish to support this.
  2. 2013-12-15: Population fails to pick up 3 argument AMD define call
  3. 2013-12-15: Build Successful

Before After

PlastronJS

PlastronJS is an mvc framework built on top of the Closure Library and built to compile with projects that use the Closure Compiler.

Log

  1. 2013-12-16: Build Successful

Before After

Dijon

Dijon is an IOC and DI micro-framework for Javascript. Originally it was meant to be a port of Robotlegs, but deviated to something quite different. It remains however heavily inspired by Robotlegs, and more specifically Swiftsuspenders.

Log

  1. 2013-12-16: Build Successful

Before After

rAppid.js

rAppid.js is a declarative JavaScript framework for rapid web application development. It supports dependency loading, Model-View binding, View-Model binding, dependency injection and i18n.

Log

  1. 2014-01-03: App not working. Uses unsupported custom module loading syntax
  2. 2014-01-03: Build Successful

Before After

DeftJS + ExtJS

Essential extensions for enterprise web and mobile application development with Ext JS and Sencha Touch

Log

  1. 2014-01-03: Missing relation modeling for ExtJS module dependencies
  2. 2014-01-03: Build Successful

Before After

Aria Templates

Aria Templates has been designed for web apps that are used 8+ hours a day, and that need to display and process high amount of data with a minimum of bandwidth consumption.

Log

  1. 2014-01-03: App broken. Custom module loading is not picked up by assetgraph
  2. 2014-01-03: Build warns correctly about missing CSS file, otherwise succeeds

Before After

Enyo + Backbone.js

Enyo is a simple but powerful encapsulation model, which helps you factor application functionality into self-contained building blocks that are easy to reuse and maintain.

Log

  1. 2014-01-03: App broken. Custom module loading is not picked up by assetgraph
  2. 2014-01-03: Build successful

Before After

AngularJS (optimized)

What HTML would have been had it been designed for web apps. A version with several performance optimizations.

Log

  1. 2014-01-04: Use ngmin to annotage AngularJS minifier unsafe syntax
  2. 2014-01-04: Build successful

Before After

React

React is a JavaScript library for building user interfaces.

Log

  1. 2014-01-05: Build Successful

Before After

SAPUI5

SAPUI5 is SAP's HTML5-based UI technology that allows you to build rich, interactive Web applications.

Log

  1. 2013-01-06: App non-functional. Unsupported custom module loading system
  2. 2013-01-06: Build Successful

Before After

Exoskeleton

A faster and leaner Backbone for your HTML5 apps.

Log

  1. 2014-01-07: Build Successful

Before After

Atma.js

HMVC and the component-based architecture for building client, server or hybrid applications

Log

  1. 2014-01-07: App broken. Custom module loading is not picked up by assetgraph
  2. 2013-01-07: Build Successful

Compile to JavaScript

Before After

Spine

Spine is a lightweight framework for building JavaScript web applications. Spine gives you an MVC structure and then gets out of your way, allowing you to concentrate on the fun stuff, building awesome web applications.

Log

  1. 2013-12-16: Build Successful

Before After

Dart

Dart firstly targets the development of modern and large scale browser-side web apps. It's an object oriented language with a C-style syntax. It has two run modes : it can be compiled to JS, and will later run in native VM in compliant browsers (just in a dedicated Chromium provided with Dart SDK for the moment).

Log

  1. 2014-01-14: Build Successful

Before After

GWT

Google Web Toolkit (GWT) is an MVP development toolkit for building and optimizing complex browser-based applications. GWT is used by many products at Google, including Google AdWords.

Log

  1. 2014-01-14: App broken. Custom module loading is not picked up by assetgraph
  2. 2014-01-14: Build Successful

Before After

Closure

The Closure Library is a broad, well-tested, modular, and cross-browser JavaScript library. You can pull just what you need from a large set of reusable UI widgets and controls, and from lower-level utilities for DOM manipulation, server communication, animation, data structures, unit testing, rich-text editing, and more.

Log

  1. 2014-01-14: Build Successful

Before After

Batman.js

Batman.js is a framework for building rich web applications with CoffeeScript or JavaScript. App code is concise and declarative, thanks to a powerful system of view bindings and observable properties. The API is designed with developer and designer happiness as its first priority.

Log

  1. 2013-12-16: Build Successful

Before After

TypeScript + Backbone.js

TypeScript is a language for application-scale JavaScript development. It offers classes, modules, interfaces and type-checking at compile time to help you build robust components.

Log

  1. 2014-01-14: Build Successful

Before After

TypeScript + AngularJS

An AngularJS + TypeScript implementation of TodoMVC. The only significant difference between this and the vanilla Angular app is that dependency injection is done via annotated constructors, which allows minification of JavaScript.

Log

  1. 2014-01-14: Build Successful

Before After

Serenade.js

Serenade.js is yet another MVC client side JavaScript framework. Why do we indulge in recreating the wheel? We believe that Serenade.js more closely follows the ideas of classical MVC than competing frameworks.

Log

  1. 2014-01-14: Build Successful

MVC Extension Frameworks

Before After

MarionetteJS

Backbone.Marionette is a composite application library for Backbone.js that aims to simplify the construction of large scale JavaScript applications.

Log

  1. 2014-03-09: Rebuilt with latest assetgraph. All bugs fixed!
  2. 2014-01-14: JSDOM mangles html-templates with <% ... %> syntax
  3. 2014-01-14: Build Successful

Before After

Thorax

An opinionated, battle tested Backbone + Handlebars framework to build large scale web applications.

Log

  1. 2014-02-14: Build Successful
  2. 2014-02-14: Error caused by global leakage of 'use strict'. Pull request sent to TodoMVC.
  3. 2014-01-14: After building Thorax app, `this` is undefined
  4. 2014-01-14: Build Successful

Before After

Chaplin + Brunch

Chaplin is an architecture for JavaScript applications using the Backbone.js library. Chaplin addresses Backbone’s limitations by providing a lightweight and flexible structure that features well-proven design patterns and best practises.

Log

  1. 2014-01-14: Build Successful

Module Loaders

Before After

Backbone.js + RequireJS

RequireJS is a JavaScript file and module loader. It is optimized for in-browser use, but it can be used in other JavaScript environments, like Rhino and Node. Using a modular script loader like RequireJS will improve the speed and quality of your code.

Log

  1. 2014-03-09: Build Successful, all bugs closed!
  2. 2014-01-14: Assetgraph doesn't register RequireJS configuration in non-HtmlScript included assets
  3. 2014-01-14: Build Successful

Before After

Flight

Flight is a lightweight, component-based JavaScript framework that maps behavior to DOM nodes. Twitter uses it for their web applications.

Log

  1. 2014-03-09: Build Successful, all bugs closed!
  2. 2014-01-14: Assetgraph doesn't register RequireJS configuration in non-HtmlScript included assets
  3. 2014-01-14: Build Successful

Before After

Knockout + RequireJS

This project is an adaptation of /architecture-examples/knockoutjs with require.js.

Log

  1. 2014-01-14: Build Successful

Before After

AngularJS + RequireJS

What HTML would have been had it been designed for web apps. This is an example of using it with AMD modules.

Log

  1. 2014-01-14: Build Successful

Before After

CanJS + RequireJS

CanJS is a client-side, JavaScript framework that makes building rich web applications easy. The AMD version lets you use the framework in a fully modular fashion and will only what you actually need.

Log

  1. 2014-02-14: Build Successful
  2. 2014-02-14: Updated fixed app from TodoMVC repository
  3. 2014-01-14: App is completely broken before build. CanJS + RequireJS app is broken
  4. 2014-01-14: Build warns about missing Todo.js

Before After

TroopJS + RequireJS

TroopJS attempts to package popular front-end technologies and bind them with minimal effort for the developer. It includes jQuery for DOM manipulation, When.js for promises, RequireJS for modularity and Has.js for feature detection. On top, it includes Pub/Sub support, templating, weaving (widgets to DOM) and auto-wiring.

Log

  1. 2014-01-14: Assetgraph doesn't pick up require.config.packages
  2. 2014-01-14: Build Successful

Before After

Thorax + Lumbar

An opinionated, battle tested Backbone + Handlebars framework to build large scale web applications. This implementation uses Lumbar, a route based module loader.

Log

  1. 2014-01-14: App broken. Custom module loading is not picked up by assetgraph
  2. 2014-01-14: Build Successful

Before After

soma.js + RequireJS

soma.js is a framework created to build scalable and maintainable javascript applications.

Log

  1. 2014-01-14: App broken. Soma is minifier unsafe. App will work if built with correct reserved names or --nocompress
  2. 2014-01-14: Build Successful

Before After

Durandal

Single Page Apps Done Right

Log

  1. 2014-01-14: App broken. Custom module loading is not picked up by assetgraph
  2. 2014-01-14: Build Successful

Before After

Lavaca + RequireJS

A curated collection of tools for building mobile web applications.

Log

  1. 2014-01-14: Population fails to pick up 3 argument AMD define call
  2. 2014-01-14: Build Successful

Real-time

Before After

Firebase + AngularJS

Firebase is a scalable realtime backend that lets you build apps without managing servers. Firebase persists and updates JSON data in realtime and is best used in combination with a JavaScrpt MV* framework such as AngularJS or Backbone.

Log

  1. 2014-01-14: Use ngmin to annotage AngularJS minifier unsafe syntax
  2. 2014-01-14: Build successful

Compare these to a non-framework implementation

Before After

Vanilla JS

You know JavaScript right? :P

Log

  1. 2013-12-13: Build Successful

Before After

jQuery

jQuery is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. jQuery is designed to change the way that you write JavaScript.

Log

  1. 2013-12-13: Build Successful