Search code examples
asp.net-mvcangularjsreactjsdotliquid

Angularjs Light version


I use angular in many projects, specially in ASP.NET MVC, but i dont like angular-

  • router (also ui-router, this is not much problem indeed as it's just a plugin) - concept of web-apps kills all ASP.NET features
  • services and factories - as all of this can be done inside common controller. (This might sound tricky)
  • constants and values - as i dont think this is really needed if you use requirejs or other AMD

What i love in angular is just directives, and when i make big nested directive, i use same controller foreach, so there is no $scope interacting (less watchers)

.controller('BaseGridCtrl', function(){
   //instead of 
   //$scope.value = 123;

   var ctrl = this;
   //this  is for Table-base-directive
   ctrl.value = 123;
   //this  is for Table-head-directive
   ctrl.value2 = 123;
});
.directive('table-base', function(){
    return {
        template: '<div>{{bgc.value}}</div>',
        controller: 'BaseGridCtrl',
        controllerAs: 'bgc'
    }
});
.directive('table-head', function(){
    return {
        template: '<div>{{bgc.value2}}</div>',
        controller: 'BaseGridCtrl',
        controllerAs: 'bgc'
    }
});
.directive('table-foot', function(){
    return {
        template: '<div>{{bgc.value3}}</div>',
        controllerAs: 'bgc',
        controller: function(){
           var ctrl = this;
           ctrl.value3 = 123;
        }
    }
});

So the link function is used veeery rare. And specially i like that angular easily detects directive - which is great as you just write 1 tag <grid> instead of reactjs components (This also might sound tricky). In my projects i use DotLiquid for razor views (it's stored in database as string) Sample:

<grid theme="some" route="localhost:9000/some/action"></grid>

So dotLiquid just renders this string w/o problem, or even applies other bingings beside angularjs. And this is great as all stuff is self contained. Which cannot be achieved by reactjs - you need to bootstrap components by yourself

React.renderComponent(<Grid />, document.querySelector('#someId'))

resume

Currently it's heavy, about 100kb, but without all this unnecessary stuff it would be really light. I would like to use only directive and controller services, Also with server-side rendering angular gonna bootstrap itself on each request which is not wise, but with lighter version it's a bit tradeoff. Has anybody tried to strip angular services succesfully? Or is there any consideration, any ideas?

edit

Angular-light looks promising, but:

  • it doesn't provide HTML tag detection, only attributes
  • really ugly, alight.directives.al.getValue this looks so bad only for me or someone else?

edit2

Ok, that 100kb might not play alot. But consider it as workout, as you might know, angular start only once, at page load, so it must build the app, pull all modules, configure each, then all services of module, then inject them where they are needed, then supply callbacks from factories and services to any who injects them, at least it gonna check if any exists (on each module), all of this happens at start, only once! By wiping up size, we also can minimize javascript execution(indeed it will), factory and service watchers, so we won't need any parts that aren't used. We can even get rid of controllers (and use them inline), only 1 service. angular.directive (which is best part of party). Have looked at mustache, handlebars, but they are just like reactjs.


Solution

  • You can try Angular Light ~15kb (gzipped), it doesn't have services, factories, constants, values, DI, router and so on.

    In addition, it has helpful features like text-directives and a support of Object.observe (benchmark)

    edit

    It provides HTML tag detection, attributes and comments.