When comparing Backbone vs Marko, the Slant community recommends Backbone for most people. In the question“What are the best client-side JavaScript MV* frameworks?” Backbone is ranked 3rd while Marko is ranked 17th. The most important reason people chose Backbone is:
A lightweight view class is provided but there is no default templating method implemented. Because views are minimal it allows for much more freedom to implement views however you would like, and because of this freedom it's possible to write views to more uniquely adapt to a problem. User interactions are done within an events object that allows these interactions to be segregated from the rest of the view code which makes the behavioral aspect of the view easier to read and manage.
Ranked in these QuestionsQuestion Ranking
Pros
Pro Gives you the freedom to implement views however you want
A lightweight view class is provided but there is no default templating method implemented. Because views are minimal it allows for much more freedom to implement views however you would like, and because of this freedom it's possible to write views to more uniquely adapt to a problem.
User interactions are done within an events object that allows these interactions to be segregated from the rest of the view code which makes the behavioral aspect of the view easier to read and manage.
Pro Can be combined with any library you want
Backbone can be combined with any library of your choosing, giving you the ultimate flexibility in creating customized solutions for unique projects. Even the only two backbone requirements, jQuery and underscore can be replaced with equivalent libraries like zepto or lo-dash.
Pro Large community
Backbone has existed longer than most frameworks, and has a large following of users and projects using it as a framework.
Pro You can call underscore.js methods directly on Backbone objects
Backbone collections and models are extended by underscore.js method allowing you to call underscore methods directly on the Backbone objects.
Pro Easy to interface with the API
Backbone provides Model and Collection classes that provide strong analogs to restful resources. These strong analogs allow you to interface more naturally with the API, and makes it easier to write custom behaviors for more complicated API interactions.
Collections provide a variety of powerful manipulation methods that are integrated from the underscore library, that allow you to manipulate, sort, and filter collection data easily.
Pro Easy to implement complex user interaction
Because all the state is managed by Models and Controllers, and they are extendable objects, you can isolate all the state logic onto those objects allowing the rest of the application to not worry about it. The app is simplified to just taking in input to modify the Models and Controllers, and updating the views to reflect them, but none of the state needs to be a concern outside of the Model and Controller classes.
Pro Doesn’t force you into a particular coding style or paradigm
There is no “magic” happening below the surface: the source code is clear, readable and well commented. Backbone is also “lightweight” in the sense that it doesn’t require a ton of buy-in to use. It can be easily integrated into an existing page, and you can choose to only use certain components of the library (Views without Models or Collections, for example). While there are many frameworks that seem to be faster to get started with, Backbone’s lack of surprises, clear documentation, speed & flexibility make it a good fit for all types of apps.
Pro Extendable with plugins
Because Backbone is so simple, and the different components are very well isolated, it is very easy to extend the functionality of Backbone. If you're writing your own extended code it's easy to keep it separated out, and share with the community.
The community also has many plugins already available, which you can pick and choose to use to fit your programming style.
Pro Easy to abstract interaction
All Backbone classes extend an events class that allows for listening and triggering functionality. Because all classes implement events by default it is easier to provide asynchronous communication between objects, and it allows better abstraction of interaction so the event emitting object does not need to know the structure or existence of the receiving object.
Pro Extremely fast
Marko consistently outperforms other alternatives in code benchmarks, both on rendering speed and compilation time.
Pro Custom tags
Custom tags provide a simple mechanism for embedding more complex components into a template by extending the HTML grammar with support for new tags. For example:
<div>
<say-hello name="World"/>
</div>
Custom tags are easy to create since they just map to a JavaScript "renderer" function as shown below:
module.exports = function sayHelloRenderer(input, out) {
out.write('Hello ' + input.name + '!');
}
Custom tags support nested content:
<fancy-overlay title="My Title">
This will be the body content of the overlay
</fancy-overlay>
Custom tags can also have parent/child relationships to support more complex use cases such a "tabs" component with nested "tab" components:
<fancy-tabs>
<fancy-tabs:tab label="Home">
Content for Home
</fancy-tabs:tab>
<fancy-tabs:tab label="Profile">
Content for Profile
</fancy-tabs:tab>
<fancy-tabs:tab label="Messages">
Content for Messages
</fancy-tabs:tab>
</fancy-tabs>
Pro Streaming
Streaming allows progressive HTML rendering and reduces time to first byte.
Pro Server-side rendering
Marko supports both server-side and client-side rendering.
Pro Marko Widgets
Marko Widgets allows UI components (rendering + behavior) to be built using Marko.
Pro Compiled templates are readable CommonJS modules
Avoids ugly globals and "named" templates.
var template = require('./template.marko');
var html = template.renderSync({name: 'Frank'});
Pro Asynchronous rendering
Marko makes additional asynchronous calls after the view rendering has begun.
Pro Lightweight runtime (~4 KB gzip)
Pro Easy to integrate with express.js
Easy Integration with Express and Node
Pro Documentation is well maintained and helpful
The documentation is extensive and very helpful. It also contains several sample applications which are very useful.
Pro Allows JavaScript expressions
JavaScript expressions can be executed inside the templates.
Pro Simple and readable syntax
Marko has a HTML-like syntax which should be easy to read and understand for everyone who has even minimal experience in web development.
Pro Short learning curve
It is easy to get up to speed and understand what is going on in a very short period of time.
Pro Small compiled templates
Marko's compiled templates are usually very small, as proven by benchmarks.
Pro Lots of tests
To prevent regressions, Marko includes a full suite of tests. The testing harness renders a collection of templates and does an exact string comparison to make sure that the tests rendered exactly as expected. There are also API tests, and negative tests to make sure that errors are reported in a friendly way.
To run tests:
git clone https://github.com/marko-js/marko
cd marko
npm install
npm test
Pro Friendly compile-time error messages
Error messages come in an easy to read and friendly format, with valid stack traces and file formats of the file(s) which brought the error(s).
Pro Concise and Mixed syntax
The Concise syntax type lets you write Marko with a Jade-like indentation based syntax, and the Mixed mode lets you combine in regular HTML-style syntax.
Pro Server and client logic can easily be expressed within the same template
Pro Has a very active and interactive community
Marko's development community is rather small compared to other frameworks but community is well mannered and active. You can chat with the core development team using gitter.im
Cons
Con Requires more coding compared to other frameworks
Because many features are not provided out of the box, you either have to write more base class code to get those features, or find a plugin that provides them in a way you like.
It does not provide much structure either, things like memory management must be kept in mind by the developer, also the lack of view lifecycle management makes state changes prone to memory leaks.
Con Can easily lead you to spaghetti code
Heavy event-binding can lead to unmanageable spaghetti mess. BB tempts users to overuse it for no reason.
Con No data binding
Backbone does not have data binding support. However, there are some libraries that can be implemented in order to have data binding in Backbone. Such as Epoxy
Con If you want to get the full experience you have to use NodeJS
To use markojs's most popular feature: SSR although you can use any language based server as a backend. It is rather complicated.
Con Very opinionated and not customizable enough
Some custom use cases are not possible. For example, trying to build an AMP page using Marko can be very challenging (special style tag requirements are hard to work with, also, Marko by default inserts a script tag into the rendered output html which is invalid in AMP and needs to be manually removed, etc..)