MinSafe Angular

Minification is often used to decrease the size of JS files, consequently decreasing load times.

Many minification tools rename variables to single characters. For example a minification tool will take the following code block:

function sayHi (name) {
console.log("Hi " + name);
}

sayHi("Dave");

..and change it to:

// note: the only minification task shown in the examples on this page is the
// renaming of variables

function sayHi (a) {
console.log("Hi " + a);
}

sayHi("Dave");

This can cause problems with Angular dependency injection. A common way of injecting dependencies is to pass the dependency names as function arguments:

angular.module("myApp")
.controller("MyCtrl", function ($location) {
var path = $location.path();
console.log("This page is located at " + path);
});

..becomes:

angular.module("myApp")
.controller("MyCtrl", function (a) {
var b = a.path(); // undefined
console.log("This page is located at " + b)
});

To ensure minification does not break an Angular app, Inline Array Notation must be to ensure that the dependency injection will be successful regardless of the name of the function’s parameter:

angular.module("myApp")
.controller("MyCtrl", ["$location", function (locationVar) {
var path = locationVar.path();
console.log("This page is located at " + path);
}]);

// after variables are renamed:

angular.module("myApp")
.controller("MyCtrl", ["$location", function (a) {
var b = a.path(); // (= this works
console.log("This page is located at " + b)
}]);

If you want to save yourself from writing extra lines of code, you can forget the Inline Array Notation and use ngmin to make your Angular code minsafe before minifying it.