[Grunt + AngularJS] Using ng-annotate for min-safe AngularJS

When you minify your code with a tool like Uglify, the resulting minified file will rename variables. This is a problem for AngualrJS, which uses parameter names to provide injected dependencies. You could use the array notation manually, but no human should ever have to suffer this fate, or you could use ng-annotate with Grunt, and let your helper robots get the job done instead.

Without annotations:

angular.module("MyMod").controller("MyCtrl", function($scope, $timeout) {
});

With annotations:

angular.module("MyMod").controller("MyCtrl", ["$scope", "$timeout", function($scope, $timeout) {
}]);

The problem with Uglify:

angular.module("MyMod").controller("MyCtrl", function($scope, $timeout) {
});

to:

anuglar.module("MyMode").controller("MyCtrl", function(a,b){});

It will rename the injection, but AnularJS Don‘t know what is a and b, so it will cause problem.

If we usse annotation first then ufligy the code:

After annotation:
angular.module("MyMod").controller("MyCtrl", ["$scope", "$timeout", function($scope, $timeout) {
}]);

After Uglify:
angular.module("MyMod").controller("MyCtrl", ["$scope","$timeout", function(a,b){
}]);

Uglify will still rename the injectionm, but with annotation, angularjs know what a and b are, so won‘t cause problem.

Install:


npm install grunt-ng-annotate --save-dev

Read More: https://www.npmjs.org/package/grunt-ng-annotate

Code:


/**
 * Created by Answer1215 on 11/16/2014.
 */
module.exports = function(grunt) {
    grunt.initConfig({
        stylus:{
            compile:{
                options: {
                    compress: false
                },
                files: {
                    "app/css/app.css": "styl/app.styl"
                }
            }
        },
        watch:{
            stylus:{
                files: [‘styl/**/*.styl‘],
                tasks: [‘stylus:compile‘]
            },
            css:{
                options: {livereload: true},
                files: [‘app/css/**.css‘]
            },
            html:{
                options: {livereload: true},
                files: [‘**.html‘]
            },
            script: {
                options: {livereload: true},
                files: [‘app/js/**.js‘]
            }
        },
        concat:{
            options: {
                separator: ‘;‘
            },
            js:{
                src: [‘bower_components/angular/angular.min.js‘, ‘build/temp/app.js‘, ‘build/temp/**.js‘],
                dest: "build/app.js"
            }
        },
        uglify: {
            js: {
                src: ["build/app.js"],
                dest: "build/app.min.js"
            }
        },
        clean: {
            build: ‘build‘,  //clean the build directory
            temp: ‘build/temp‘
        },
        ngAnnotate:{
            options: {
                // Task-specific options go here.
                singleQuotes: true
            },
            app:{
                files: {
                    // Target-specific file lists and/or options go here.
                    ‘build/temp/app.js‘: [‘app/js/app.js‘],
                    ‘build/temp/one.js‘: [‘app/js/one.js‘],
                    ‘build/temp/two.js‘: [‘app/js/two.js‘]
                }
            }

        }
    });

    grunt.registerTask(‘build‘, [‘clean:build‘, ‘ngAnnotate‘, ‘concat‘, ‘uglify‘,‘clean:temp‘]);

    grunt.loadNpmTasks(‘grunt-contrib-watch‘);
    grunt.loadNpmTasks(‘grunt-contrib-stylus‘);
    grunt.loadNpmTasks(‘grunt-contrib-concat‘);
    grunt.loadNpmTasks(‘grunt-contrib-uglify‘);
    grunt.loadNpmTasks(‘grunt-contrib-clean‘);
    grunt.loadNpmTasks(‘grunt-ng-annotate‘);
}
时间: 2024-12-12 12:47:19

[Grunt + AngularJS] Using ng-annotate for min-safe AngularJS的相关文章

转走进AngularJs(八) ng的路由机制

走进AngularJs(八) ng的路由机制 2013-12-19 我来说两句 收藏 我要投稿 今天心情不错~,公司请了个中医来给按摩拔罐刮痧,一套下来那个爽啊~,趁着精力充沛了解了下Angular的路由机制,在此分享出来与大家共同学习. 在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP.为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以

[后端人员耍前端系列]AngularJs篇:30分钟快速掌握AngularJs

一.前言 对于前端系列,自然少不了AngularJs的介绍了.在前面文章中,我们介绍了如何使用KnockoutJs来打造一个单页面程序,后面一篇文章将介绍如何使用AngularJs的开发一个单页面应用程序.在开始使用AngularJs开发SPA之前,我觉得有必要详细介绍下AngularJs所涉及的知识点.所有也就有了这篇文章. 二.AngularJs介绍 AngularJS是Google推出的一款Web应用开发框架.它提供了一系列兼容性良好并可扩展的服务,包括数据绑定.DOM操作.MVC和依赖注

走进AngularJs(八) ng的路由机制

在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP.为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以在页面上放一个大大的返回按钮,让用户点击返回来导航,但总是无法避免用户习惯性的点后退.解决此问题的一个方法是使用hash,监听hashchange事件来进行视图切换,另一个方法是用HTML5的history API,通过pushState(

走进AngularJs(二) ng模板中常用指令的使用方式

通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板开始入手是个不错方式,因为这部分内容相对简单好理解,而且是视图层的东西,大家都喜欢可以立马看得见的东西嘛.本篇我将搜罗模板中的常用指令一一测试,了解其使用方法,有点像背单词的感觉,会比较枯燥.不过对于初学,这样的枯燥是必须要经历的,开始~ 一.模板中可使用的东西及表达式 模板中可以使用的东西包括以下

angularJs中ng一些内置的工具方法:

1.angular.equals: (1)两个参数满足===比较返回true;(2)两个参数是同一种类型,同时他们的每一个属性通过angular.equals都是返回true:(3)两个都是NAN(在js中虽然NAN==NAN为false,但是这里为true);(4)两个对象代表同一个正则表达式,如/abc/==/abc/(虽然在js中返回false) 2.angular.copy: 创建来源source的一个深度克隆对象,可以是一个对象或者数组.如果没有指定destination那么就会返回一

AngularJS(三)——在多个AngularJS controller之间共享数据

在MVC中,为了方便维护,针对不同业务会使用不同的controller.有时我们需要在不同的controller中共享数据,本文旨在解决这一问题. 1. 使用$rootScope直接绑定 AngularJS中有一个$rootScope对象,它是AngularJS中最接近全局作用域的对象,是所有$scope对象的最上层,可以简单理解为BOM中的window对象或Node.js中的global对象.最简单的方式是直接将要共享的数据绑定到$rootScope对象中: <!DOCTYPE html>

angularjs ocLazyLoad分步加载js文件,angularjs ocLazyLoad按需加载js

用angular有一段时间了,平日里只顾着写代码,没有注意到性能优化的问题,而今有时间,于是捋了捋,讲学习过程记录于此: 问题描述:由于采用angular做了网页的单页面应用,需要一次性在主布局中将所有模块需要引用到的js都引入.对于比较小的项目,这是可行的,但是对于大的项目,一旦js文件较多,在页面首次加载时就引入所有js文件,无疑会延缓页面加载的速度,造成不良额用户体验.那么分布加载(按需加载)就显得很有必要了. <!DOCTYPE html> <html lang="en

[AngularJS] Write a simple Redux store in AngularJS app

The first things we need to do is create a reducer: /** * CONSTANT * @type {string} */ export const GET_CATEGORIES = "GET_CATEGORIES"; /** * INIT VALUE */ export const initialCategories = [ {id: 0, name: 'Development'}, {id: 1, name: 'Design'},

angularJS (2) angular.min.js

angular.min.js /* AngularJS v1.2.29 (c) 2010-2014 Google, Inc. http://angularjs.org License: MIT*/(function(V,W,v){'use strict';function z(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.a

Angularjs Nodejs Grunt 一个例子

做了一个简单的示例,目的是记录环境配置以及这套框架的结构流程. 1.配置环境 默认nodejs已安装. 安装以下模块:express(nodejs框架),grunt(javascript task runner),grunt-contrib-watch(grunt live load插件),grunt-express-server(grunt启动express服务端插件). 命令行中进入程序目录,依次输入以下命令: npm install express 回车 npm install grunt