[AngularJS] 5 simple ways to speed up your AngularJS application

Nowdays, Single page apps are becoming increasingly popular among the fornt-end developers. It is the time to say goodbye with refreshing the whole page due to clicking on a single link. It helps to speed up out web application and improve our use experience. Today we‘d talk about how to speed up your AngularJS application. This article is based on AngularJS 1.3.x version.

1. Disabling the debug info



When you use directive, Angular adds some additional debug information to the DOM.

Javascript:

app.controller(‘AppController‘,  function () {
  this.appCtrl = this;

  appCtrl.message = "Hello World!";
});

HTML:

<p>{{appCtrl.message}}</p>

Once compiled, we get something like this:

<p class="ng-binding">Hello World!</p>

This debug info is super useful when you debuggin because the tools like Protractor and Batarang which can rely on this information. However, great things always come with cost. When our project comes to production, those information is useless to users. And additional properties and classes that are added to the DOM also come with a performance cost depending on how much is stored on the scope and DOM operations are expensive anyway.

AngularJS 1.3 enables us to switch those debug information, what you need to do to disable the debug info:

app.config(function( $compileProvider ) {

    $compileProvider.debugInfoEnabled(false);
});

To enable it again, you can do in console:

angular.reloadWithDebugInfo();

2. Use $applyAsync



Configure $http service to combine processing of multiple http responses received at around the same time via $rootScope.$applyAsync. This can result in significant performance improvement for bigger applications that make many HTTP requests concurrently (common during application bootstrap) [1].

Sinlge $http request triggers $digest() which can help to update application model and DOM. If you have many $http requests triggered almost at the same time and each request will run $digest() which cost a lot.

The idea to use $applyAsync is to compile multiple $http requets into one $digest. We show how to use this here:

app.config(function($httpProvider) {

    $httpProvider.useApplyAsync(true);
});

3. Using one time binding



AngularJS comes up with two way binding which is cool because you don‘t need to set up any event listen, it helps you to update the model automaticlly. But, as we said, great thing comes with cost.  In order to make databinding possible, Angular uses $watch APIs to observe model mutations on the scope. Imaging if there is too many watcher, your application become heavy and slow. This is why we need one-time binding. One-time expressions will stop recalculating once they are stable, which happens after the first digest.

You can see the demo here: http://jsbin.com/dijeno/9/edit?html,css,js,output

The way to use one time binding is quite simple, from our first simple of AppController, we know that everytime appCtrl.message changes, {{appCtrl.message}} will also change. So if we apply the one-time expression to our example above, we change this:

<p>{{::appCtrl.message}}</p>

4. Using lazy loading



Lazy loading is very useful when you have a large application which needs to load hundred files. And among those hundred files, there is only 10% files whcih are needed to bootstrap your applcation and the other 90% are only useful in the running time. So, in order to speed up, you don‘t want those 90% files loaded when the boostrap time. That is the place where lazy loading comes in to handy.

There are many ways to do lazy loading, for example RequireJS, the one which I often use is called ocLazyLoad. It is quite easy to use with AngularJS.

What you need to do first is install ocLazyLoad:

bower install oclazyload

Then inject into the application dependency:

var app = angular.module("demo", ["oc.lazyLoad"])

Javascript: When you click on the AppCtrl, we want to load everything related to the store module.

    app.controller("AppCtrl", function($ocLazyLoad) {

        var app = this;
        app.click = function() {
            $ocLazyLoad.load({
                name: "store",
                files: [
                    "app/store/store.js",
                    "app/store/store.tpl.html",
                    "app/css/store.css"
                ]
            })
        }
    })

5. Resolve data beforehand



Let see two parts of code first, then talk about why resolve is good.

Controller Way:

function MainCtrl(SomeService) {

    var mainCtrl= this;

    // unresolved
    mainCtrl.something;

    // resolved asynchronously
    SomeService.doSomething().then(function(response) {
        mainCtrl.something = response;
    });

}

angular.module(‘app‘, [])
    .controller(‘MainCtrl‘, MainCtrl);

Route Resolve:

// config with resolve pointing to relevant controller
function config ($routeProvider) {
  $routeProvider
  .when(‘/‘, {
    templateUrl: ‘views/main.html‘,
    controller: ‘MainCtrl‘,
    controllerAs: ‘main‘,
    resolve: MainCtrl.resolve
  });
}
// controller as usual
function MainCtrl (SomeService) {
  // resolved!
  this.something = SomeService.something;
}
// create the resolved property
MainCtrl.resolve = {
  doSomething: function (SomeService) {
    return SomeService.doSomething();
  }
};

angular
  .module(‘app‘)
  .controller(‘MainCtrl‘, MainCtrl)
  .config(config);

For controller activate:

  • Views load right away
  • The Service code executes after the controller code
  • Animation can be shown during the view transition

For route resolve

  • The code executes before the route via a promise
  • Resolve makes the new view wait for the route to resolve
  • Animation can be shown before the resolve and through the view transition

  

Resolve happens before your controller will instantiate, and your template will load and everything will set up. It gives users a felling that they can wait less time to get the interface updated, because all the data are already resolved (parpared) for interface to use.

时间: 2024-08-07 03:39:34

[AngularJS] 5 simple ways to speed up your AngularJS application的相关文章

Permanent Link: 101 ways to speed up your Magento e-commerce website

101 ways to speed up your Magento e-commerce website May 18, 2010/in E-commerce, Magento /by Guido Jansen As you probably know by now, Google is Using site speed in web search ranking. And I couldn’t agree more: speed is important for your site, and

AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

简介AngularJS中使用factory和service的方法 AngularJS支持使用服务的体系结构"关注点分离"的概念.服务是JavaScript函数,并负责只做一个特定的任务.这也使得他们成为维护和测试的单独实体.控制器,过滤器可以调用它们作为需求的基础.服务使用AngularJS的依赖注入机制注入正常. AngularJS提供例如许多内在的服务,如:$http, $route, $window, $location等.每个服务负责例如一个特定的任务,$http是用来创建AJ

angularJS 报错: [ngModel:numfmt] http://errors.angularjs.org/1.4.1/ngModel/numfmt?p0=333

<!doctype html> <html ng-app="a10086"> <head> <meta charset="utf-8"> <script src="angular.min.js"></script> </head> <body> <pre> stringToNumber2 指令中这么写没问题, 但是html中调用也这么写,h

AngularJs中Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.15/

我在使用angularjs的时候报出来这个错误: Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.15/ 当时只是代码都可以访问但是,就是不能正常的发送请求,应该是在自己写的controller层或者service层中有出现标点符号,或者是单词拼写出现了错误,才会导致这样的问题. 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/11074901.html

angularjs学习之四(解决模板视图和angularjs之间的冲突 )

问题: 在php的mvc视图中,我们需要在加载的过程中 传递一些数据给模板: 如: //这里是某个 controller $data['users'] = {something from databases}; $this->load->view('home/index',$data); //这里是对应的视图 <div ng-controller="loadData"> <ul> <!--1. 初始化的时候我们需要使用下面这句--> &l

Five ways to maximize Java NIO and NIO.2--reference

Java NIO -- the New Input/Output API package-- was introduced with J2SE 1.4 in 2002. Java NIO's purpose was to improve the programming of I/O-intensive chores on the Java platform. A decade later, many Java programmers still don't know how to make th

Five ways to maximize Java NIO and NIO.2--转

原文地址:http://www.javaworld.com/article/2078654/java-se/java-se-five-ways-to-maximize-java-nio-and-nio-2.html Java NIO -- the New Input/Output API package-- was introduced with J2SE 1.4 in 2002. Java NIO's purpose was to improve the programming of I/O-

15 Highly Useful Angularjs Tools for Web Developers (转)

15 Highly Useful Angularjs Tools for Web Developers Angularjs is a new kid on coding block.This angularjs tools is especially well-suited for building one-page web apps, although certainly not limited to that. Angularjs is relatively new JavaScript f

Basics of AngularJS

Basics of AngularJS: Part 1 By Gowtham Rajamanickam on Apr 09, 2015 AngularJS I have planned to start writing about AngularJS. I have begun to learn AngularJS a few months back, it's a great feature for website UI developers. It is also easy to learn