Build optimized grunt file












0














I have a very large angular js application and I want to optimize its performance.
I want to create separate minified js files instead of creating a single file(scripts.js).



I found a solution to do this here.
It minifies the files but when I deploy it, I get invalid provider error.
Here is my grunt file (I have removed the code used for separate minifcation and posting my original grunt file.)



// Generated on 2016-06-18 using generator-angular 0.15.1
'use strict';

// # Globbing
// for performance reasons we're only matching one level down:
// 'test/spec/{,*/}*.js'
// use this if you want to recursively match all subfolders:
// 'test/spec/**/*.js'

module.exports = function (grunt) {

// Time how long tasks take. Can help when optimizing build times
require('time-grunt')(grunt);

// Automatically load required Grunt tasks
require('jit-grunt')(grunt, {
useminPrepare: 'grunt-usemin',
ngtemplates: 'grunt-angular-templates',
cdnify: 'grunt-google-cdn'
});

// Configurable paths for the application
var appConfig = {
app: require('./bower.json').appPath || 'app',
dist: 'dist'
};

// Define the configuration for all the tasks
grunt.initConfig({

// Project settings
yeoman: appConfig,

// Watches files for changes and runs tasks based on the changed files
watch: {
bower: {
files: ['bower.json'],
tasks: ['wiredep']
},
js: {
files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
tasks: ['newer:jshint:all', 'newer:jscs:all'],
options: {
livereload: '<%= connect.options.livereload %>'
}
},
jsTest: {
files: ['test/spec/{,*/}*.js'],
tasks: ['newer:jshint:test', 'newer:jscs:test', 'karma']
},
compass: {
files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
tasks: ['compass:server', 'postcss:server']
},
gruntfile: {
files: ['Gruntfile.js']
},
livereload: {
options: {
livereload: '<%= connect.options.livereload %>'
},
files: [
'<%= yeoman.app %>/{,*/}*.html',
'.tmp/styles/{,*/}*.css',
'<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
]
}
},

// The actual grunt server settings
connect: {
options: {
port: 9000,
// Change this to '0.0.0.0' to access the server from outside.
hostname: 'localhost',
livereload: 35729
},
livereload: {
options: {
open: true,
middleware: function (connect) {
return [
connect.static('.tmp'),
connect().use(
'/bower_components',
connect.static('./bower_components')
),
connect().use(
'/app/styles',
connect.static('./app/styles')
),
connect.static(appConfig.app)
];
}
}
},
test: {
options: {
port: 9001,
middleware: function (connect) {
return [
connect.static('.tmp'),
connect.static('test'),
connect().use(
'/bower_components',
connect.static('./bower_components')
),
connect.static(appConfig.app)
];
}
}
},
dist: {
options: {
open: true,
base: '<%= yeoman.dist %>'
}
}
},

// Make sure there are no obvious mistakes
jshint: {
options: {
jshintrc: '.jshintrc',
reporter: require('jshint-stylish')
},
all: {
src: [
'Gruntfile.js',
'<%= yeoman.app %>/scripts/{,*/}*.js'
]
},
test: {
options: {
jshintrc: 'test/.jshintrc'
},
src: ['test/spec/{,*/}*.js']
}
},

// Make sure code styles are up to par
jscs: {
options: {
config: '.jscsrc',
verbose: true
},
all: {
src: [
'Gruntfile.js',
'<%= yeoman.app %>/scripts/{,*/}*.js'
]
},
test: {
src: ['test/spec/{,*/}*.js']
}
},

// Empties folders to start fresh
clean: {
dist: {
files: [{
dot: true,
src: [
'.tmp',
'<%= yeoman.dist %>/{,*/}*',
'!<%= yeoman.dist %>/.git{,*/}*'
]
}]
},
server: '.tmp'
},

// Add vendor prefixed styles
postcss: {
options: {
processors: [
require('autoprefixer-core')({browsers: ['last 1 version']})
]
},
server: {
options: {
map: true
},
files: [{
expand: true,
cwd: '.tmp/styles/',
src: '{,*/}*.css',
dest: '.tmp/styles/'
}]
},
dist: {
files: [{
expand: true,
cwd: '.tmp/styles/',
src: '{,*/}*.css',
dest: '.tmp/styles/'
}]
}
},

// Automatically inject Bower components into the app
wiredep: {
app: {
src: ['<%= yeoman.app %>/index.html'],
ignorePath: /..//
},
test: {
devDependencies: true,
src: '<%= karma.unit.configFile %>',
ignorePath: /..//,
fileTypes:{
js: {
block: /(([st]*)/{2}s*?bower:s*?(S*))(n|r|.)*?(/{2}s*endbower)/gi,
detect: {
js: /'(.*.js)'/gi
},
replace: {
js: ''{{filePath}}','
}
}
}
},
sass: {
src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
ignorePath: /(../){1,2}bower_components//
}
},

// Compiles Sass to CSS and generates necessary files if requested
compass: {
options: {
sassDir: '<%= yeoman.app %>/styles',
cssDir: '.tmp/styles',
generatedImagesDir: '.tmp/images/generated',
imagesDir: '<%= yeoman.app %>/images',
javascriptsDir: '<%= yeoman.app %>/scripts',
fontsDir: '<%= yeoman.app %>/styles/fonts',
importPath: './bower_components',
httpImagesPath: '/images',
httpGeneratedImagesPath: '/images/generated',
httpFontsPath: '/styles/fonts',
relativeAssets: false,
assetCacheBuster: false,
raw: 'Sass::Script::Number.precision = 10n'
},
dist: {
options: {
generatedImagesDir: '<%= yeoman.dist %>/images/generated'
}
},
server: {
options: {
sourcemap: true
}
}
},

// Renames files for browser caching purposes
filerev: {
dist: {
src: [
'<%= yeoman.dist %>/scripts/{,*/}*.js',
'<%= yeoman.dist %>/styles/{,*/}*.css',
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/styles/fonts/*'
]
}
},

// Reads HTML for usemin blocks to enable smart builds that automatically
// concat, minify and revision files. Creates configurations in memory so
// additional tasks can operate on them
useminPrepare: {
html: '<%= yeoman.app %>/index.html',
options: {
dest: '<%= yeoman.dist %>',
flow: {
html: {
steps: {
js: ['concat', 'uglifyjs'],
css: ['cssmin']
},
post: {}
}
}
}
},

// Performs rewrites based on filerev and the useminPrepare configuration
usemin: {
html: ['<%= yeoman.dist %>/{,*/}*.html'],
css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'],
options: {
assetsDirs: [
'<%= yeoman.dist %>',
'<%= yeoman.dist %>/images',
'<%= yeoman.dist %>/styles'
],
patterns: {
js: [[/(images/[^''""]*.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']]
}
}
},

// The following *-min tasks will produce minified files in the dist folder
// By default, your `index.html`'s <!-- Usemin block --> will take care of
// minification. These next options are pre-configured if you do not wish
// to use the Usemin blocks.
// cssmin: {
// dist: {
// files: {
// '<%= yeoman.dist %>/styles/main.css': [
// '.tmp/styles/{,*/}*.css'
// ]
// }
// }
// },
// uglify: {
// dist: {
// files: {
// '<%= yeoman.dist %>/scripts/scripts.js': [
// '<%= yeoman.dist %>/scripts/scripts.js'
// ]
// }
// }
// },
// concat: {
// dist: {}
// },

imagemin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.app %>/images',
src: '{,*/}*.{png,jpg,jpeg,gif}',
dest: '<%= yeoman.dist %>/images'
}]
}
},

svgmin: {
dist: {
files: [{
expand: true,
cwd: '<%= yeoman.app %>/images',
src: '{,*/}*.svg',
dest: '<%= yeoman.dist %>/images'
}]
}
},

htmlmin: {
dist: {
options: {
collapseWhitespace: true,
conservativeCollapse: true,
collapseBooleanAttributes: true,
removeCommentsFromCDATA: true
},
files: [{
expand: true,
cwd: '<%= yeoman.dist %>',
src: ['*.html'],
dest: '<%= yeoman.dist %>'
}]
}
},

ngtemplates: {
dist: {
options: {
module: 'dataGameApp',
htmlmin: '<%= htmlmin.dist.options %>',
usemin: 'scripts/scripts.js'
},
cwd: '<%= yeoman.app %>',
src: 'views/{,*/}*.html',
dest: '.tmp/templateCache.js'
}
},

// ng-annotate tries to make the code safe for minification automatically
// by using the Angular long form for dependency injection.
ngAnnotate: {
dist: {
files: [{
expand: true,
cwd: '.tmp/concat/scripts',
src: '*.js',
dest: '.tmp/concat/scripts'
}]
}
},

// Replace Google CDN references
cdnify: {
dist: {
html: ['<%= yeoman.dist %>/*.html']
}
},

// Copies remaining files to places other tasks can use
copy: {
dist: {
files: [{
expand: true,
dot: true,
cwd: '<%= yeoman.app %>',
dest: '<%= yeoman.dist %>',
src: [
'*.{ico,png,txt}',
'.htaccess',
'*.html',
'images/{,*/}*.{webp}',
'styles/fonts/{,*/}*.*'
]
}, {
expand: true,
cwd: '.tmp/images',
dest: '<%= yeoman.dist %>/images',
src: ['generated/*']
}, {
expand: true,
cwd: '.',
src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*',
dest: '<%= yeoman.dist %>'
}]
},
styles: {
expand: true,
cwd: '<%= yeoman.app %>/styles',
dest: '.tmp/styles/',
src: '{,*/}*.css'
}
},

// Run some tasks in parallel to speed up the build process
concurrent: {
server: [
'compass:server'
],
test: [
'compass'
],
dist: [
'compass:dist',
'imagemin',
'svgmin'
]
},

// Test settings
karma: {
unit: {
configFile: 'test/karma.conf.js',
singleRun: true
}
}
});


grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
if (target === 'dist') {
return grunt.task.run(['build', 'connect:dist:keepalive']);
}

grunt.task.run([
'clean:server',
'wiredep',
'concurrent:server',
'postcss:server',
'connect:livereload',
'watch'
]);
});

grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
grunt.task.run(['serve:' + target]);
});

grunt.registerTask('test', [
'clean:server',
'wiredep',
'concurrent:test',
'postcss',
'connect:test',
'karma'
]);

grunt.registerTask('build', [
'clean:dist',
'wiredep',
'useminPrepare',
'concurrent:dist',
'postcss',
'ngtemplates',
'concat',
'ngAnnotate',
'copy:dist',
'cdnify',
'cssmin',
'uglify',
'filerev',
'usemin',
'htmlmin'
]);

grunt.registerTask('default', [
'newer:jscs',
//'test',
'build'
]);
};


Please suggest an approach to do this










share|improve this question



























    0














    I have a very large angular js application and I want to optimize its performance.
    I want to create separate minified js files instead of creating a single file(scripts.js).



    I found a solution to do this here.
    It minifies the files but when I deploy it, I get invalid provider error.
    Here is my grunt file (I have removed the code used for separate minifcation and posting my original grunt file.)



    // Generated on 2016-06-18 using generator-angular 0.15.1
    'use strict';

    // # Globbing
    // for performance reasons we're only matching one level down:
    // 'test/spec/{,*/}*.js'
    // use this if you want to recursively match all subfolders:
    // 'test/spec/**/*.js'

    module.exports = function (grunt) {

    // Time how long tasks take. Can help when optimizing build times
    require('time-grunt')(grunt);

    // Automatically load required Grunt tasks
    require('jit-grunt')(grunt, {
    useminPrepare: 'grunt-usemin',
    ngtemplates: 'grunt-angular-templates',
    cdnify: 'grunt-google-cdn'
    });

    // Configurable paths for the application
    var appConfig = {
    app: require('./bower.json').appPath || 'app',
    dist: 'dist'
    };

    // Define the configuration for all the tasks
    grunt.initConfig({

    // Project settings
    yeoman: appConfig,

    // Watches files for changes and runs tasks based on the changed files
    watch: {
    bower: {
    files: ['bower.json'],
    tasks: ['wiredep']
    },
    js: {
    files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
    tasks: ['newer:jshint:all', 'newer:jscs:all'],
    options: {
    livereload: '<%= connect.options.livereload %>'
    }
    },
    jsTest: {
    files: ['test/spec/{,*/}*.js'],
    tasks: ['newer:jshint:test', 'newer:jscs:test', 'karma']
    },
    compass: {
    files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
    tasks: ['compass:server', 'postcss:server']
    },
    gruntfile: {
    files: ['Gruntfile.js']
    },
    livereload: {
    options: {
    livereload: '<%= connect.options.livereload %>'
    },
    files: [
    '<%= yeoman.app %>/{,*/}*.html',
    '.tmp/styles/{,*/}*.css',
    '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
    ]
    }
    },

    // The actual grunt server settings
    connect: {
    options: {
    port: 9000,
    // Change this to '0.0.0.0' to access the server from outside.
    hostname: 'localhost',
    livereload: 35729
    },
    livereload: {
    options: {
    open: true,
    middleware: function (connect) {
    return [
    connect.static('.tmp'),
    connect().use(
    '/bower_components',
    connect.static('./bower_components')
    ),
    connect().use(
    '/app/styles',
    connect.static('./app/styles')
    ),
    connect.static(appConfig.app)
    ];
    }
    }
    },
    test: {
    options: {
    port: 9001,
    middleware: function (connect) {
    return [
    connect.static('.tmp'),
    connect.static('test'),
    connect().use(
    '/bower_components',
    connect.static('./bower_components')
    ),
    connect.static(appConfig.app)
    ];
    }
    }
    },
    dist: {
    options: {
    open: true,
    base: '<%= yeoman.dist %>'
    }
    }
    },

    // Make sure there are no obvious mistakes
    jshint: {
    options: {
    jshintrc: '.jshintrc',
    reporter: require('jshint-stylish')
    },
    all: {
    src: [
    'Gruntfile.js',
    '<%= yeoman.app %>/scripts/{,*/}*.js'
    ]
    },
    test: {
    options: {
    jshintrc: 'test/.jshintrc'
    },
    src: ['test/spec/{,*/}*.js']
    }
    },

    // Make sure code styles are up to par
    jscs: {
    options: {
    config: '.jscsrc',
    verbose: true
    },
    all: {
    src: [
    'Gruntfile.js',
    '<%= yeoman.app %>/scripts/{,*/}*.js'
    ]
    },
    test: {
    src: ['test/spec/{,*/}*.js']
    }
    },

    // Empties folders to start fresh
    clean: {
    dist: {
    files: [{
    dot: true,
    src: [
    '.tmp',
    '<%= yeoman.dist %>/{,*/}*',
    '!<%= yeoman.dist %>/.git{,*/}*'
    ]
    }]
    },
    server: '.tmp'
    },

    // Add vendor prefixed styles
    postcss: {
    options: {
    processors: [
    require('autoprefixer-core')({browsers: ['last 1 version']})
    ]
    },
    server: {
    options: {
    map: true
    },
    files: [{
    expand: true,
    cwd: '.tmp/styles/',
    src: '{,*/}*.css',
    dest: '.tmp/styles/'
    }]
    },
    dist: {
    files: [{
    expand: true,
    cwd: '.tmp/styles/',
    src: '{,*/}*.css',
    dest: '.tmp/styles/'
    }]
    }
    },

    // Automatically inject Bower components into the app
    wiredep: {
    app: {
    src: ['<%= yeoman.app %>/index.html'],
    ignorePath: /..//
    },
    test: {
    devDependencies: true,
    src: '<%= karma.unit.configFile %>',
    ignorePath: /..//,
    fileTypes:{
    js: {
    block: /(([st]*)/{2}s*?bower:s*?(S*))(n|r|.)*?(/{2}s*endbower)/gi,
    detect: {
    js: /'(.*.js)'/gi
    },
    replace: {
    js: ''{{filePath}}','
    }
    }
    }
    },
    sass: {
    src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
    ignorePath: /(../){1,2}bower_components//
    }
    },

    // Compiles Sass to CSS and generates necessary files if requested
    compass: {
    options: {
    sassDir: '<%= yeoman.app %>/styles',
    cssDir: '.tmp/styles',
    generatedImagesDir: '.tmp/images/generated',
    imagesDir: '<%= yeoman.app %>/images',
    javascriptsDir: '<%= yeoman.app %>/scripts',
    fontsDir: '<%= yeoman.app %>/styles/fonts',
    importPath: './bower_components',
    httpImagesPath: '/images',
    httpGeneratedImagesPath: '/images/generated',
    httpFontsPath: '/styles/fonts',
    relativeAssets: false,
    assetCacheBuster: false,
    raw: 'Sass::Script::Number.precision = 10n'
    },
    dist: {
    options: {
    generatedImagesDir: '<%= yeoman.dist %>/images/generated'
    }
    },
    server: {
    options: {
    sourcemap: true
    }
    }
    },

    // Renames files for browser caching purposes
    filerev: {
    dist: {
    src: [
    '<%= yeoman.dist %>/scripts/{,*/}*.js',
    '<%= yeoman.dist %>/styles/{,*/}*.css',
    '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
    '<%= yeoman.dist %>/styles/fonts/*'
    ]
    }
    },

    // Reads HTML for usemin blocks to enable smart builds that automatically
    // concat, minify and revision files. Creates configurations in memory so
    // additional tasks can operate on them
    useminPrepare: {
    html: '<%= yeoman.app %>/index.html',
    options: {
    dest: '<%= yeoman.dist %>',
    flow: {
    html: {
    steps: {
    js: ['concat', 'uglifyjs'],
    css: ['cssmin']
    },
    post: {}
    }
    }
    }
    },

    // Performs rewrites based on filerev and the useminPrepare configuration
    usemin: {
    html: ['<%= yeoman.dist %>/{,*/}*.html'],
    css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
    js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'],
    options: {
    assetsDirs: [
    '<%= yeoman.dist %>',
    '<%= yeoman.dist %>/images',
    '<%= yeoman.dist %>/styles'
    ],
    patterns: {
    js: [[/(images/[^''""]*.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']]
    }
    }
    },

    // The following *-min tasks will produce minified files in the dist folder
    // By default, your `index.html`'s <!-- Usemin block --> will take care of
    // minification. These next options are pre-configured if you do not wish
    // to use the Usemin blocks.
    // cssmin: {
    // dist: {
    // files: {
    // '<%= yeoman.dist %>/styles/main.css': [
    // '.tmp/styles/{,*/}*.css'
    // ]
    // }
    // }
    // },
    // uglify: {
    // dist: {
    // files: {
    // '<%= yeoman.dist %>/scripts/scripts.js': [
    // '<%= yeoman.dist %>/scripts/scripts.js'
    // ]
    // }
    // }
    // },
    // concat: {
    // dist: {}
    // },

    imagemin: {
    dist: {
    files: [{
    expand: true,
    cwd: '<%= yeoman.app %>/images',
    src: '{,*/}*.{png,jpg,jpeg,gif}',
    dest: '<%= yeoman.dist %>/images'
    }]
    }
    },

    svgmin: {
    dist: {
    files: [{
    expand: true,
    cwd: '<%= yeoman.app %>/images',
    src: '{,*/}*.svg',
    dest: '<%= yeoman.dist %>/images'
    }]
    }
    },

    htmlmin: {
    dist: {
    options: {
    collapseWhitespace: true,
    conservativeCollapse: true,
    collapseBooleanAttributes: true,
    removeCommentsFromCDATA: true
    },
    files: [{
    expand: true,
    cwd: '<%= yeoman.dist %>',
    src: ['*.html'],
    dest: '<%= yeoman.dist %>'
    }]
    }
    },

    ngtemplates: {
    dist: {
    options: {
    module: 'dataGameApp',
    htmlmin: '<%= htmlmin.dist.options %>',
    usemin: 'scripts/scripts.js'
    },
    cwd: '<%= yeoman.app %>',
    src: 'views/{,*/}*.html',
    dest: '.tmp/templateCache.js'
    }
    },

    // ng-annotate tries to make the code safe for minification automatically
    // by using the Angular long form for dependency injection.
    ngAnnotate: {
    dist: {
    files: [{
    expand: true,
    cwd: '.tmp/concat/scripts',
    src: '*.js',
    dest: '.tmp/concat/scripts'
    }]
    }
    },

    // Replace Google CDN references
    cdnify: {
    dist: {
    html: ['<%= yeoman.dist %>/*.html']
    }
    },

    // Copies remaining files to places other tasks can use
    copy: {
    dist: {
    files: [{
    expand: true,
    dot: true,
    cwd: '<%= yeoman.app %>',
    dest: '<%= yeoman.dist %>',
    src: [
    '*.{ico,png,txt}',
    '.htaccess',
    '*.html',
    'images/{,*/}*.{webp}',
    'styles/fonts/{,*/}*.*'
    ]
    }, {
    expand: true,
    cwd: '.tmp/images',
    dest: '<%= yeoman.dist %>/images',
    src: ['generated/*']
    }, {
    expand: true,
    cwd: '.',
    src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*',
    dest: '<%= yeoman.dist %>'
    }]
    },
    styles: {
    expand: true,
    cwd: '<%= yeoman.app %>/styles',
    dest: '.tmp/styles/',
    src: '{,*/}*.css'
    }
    },

    // Run some tasks in parallel to speed up the build process
    concurrent: {
    server: [
    'compass:server'
    ],
    test: [
    'compass'
    ],
    dist: [
    'compass:dist',
    'imagemin',
    'svgmin'
    ]
    },

    // Test settings
    karma: {
    unit: {
    configFile: 'test/karma.conf.js',
    singleRun: true
    }
    }
    });


    grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
    if (target === 'dist') {
    return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
    'clean:server',
    'wiredep',
    'concurrent:server',
    'postcss:server',
    'connect:livereload',
    'watch'
    ]);
    });

    grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
    grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
    grunt.task.run(['serve:' + target]);
    });

    grunt.registerTask('test', [
    'clean:server',
    'wiredep',
    'concurrent:test',
    'postcss',
    'connect:test',
    'karma'
    ]);

    grunt.registerTask('build', [
    'clean:dist',
    'wiredep',
    'useminPrepare',
    'concurrent:dist',
    'postcss',
    'ngtemplates',
    'concat',
    'ngAnnotate',
    'copy:dist',
    'cdnify',
    'cssmin',
    'uglify',
    'filerev',
    'usemin',
    'htmlmin'
    ]);

    grunt.registerTask('default', [
    'newer:jscs',
    //'test',
    'build'
    ]);
    };


    Please suggest an approach to do this










    share|improve this question

























      0












      0








      0







      I have a very large angular js application and I want to optimize its performance.
      I want to create separate minified js files instead of creating a single file(scripts.js).



      I found a solution to do this here.
      It minifies the files but when I deploy it, I get invalid provider error.
      Here is my grunt file (I have removed the code used for separate minifcation and posting my original grunt file.)



      // Generated on 2016-06-18 using generator-angular 0.15.1
      'use strict';

      // # Globbing
      // for performance reasons we're only matching one level down:
      // 'test/spec/{,*/}*.js'
      // use this if you want to recursively match all subfolders:
      // 'test/spec/**/*.js'

      module.exports = function (grunt) {

      // Time how long tasks take. Can help when optimizing build times
      require('time-grunt')(grunt);

      // Automatically load required Grunt tasks
      require('jit-grunt')(grunt, {
      useminPrepare: 'grunt-usemin',
      ngtemplates: 'grunt-angular-templates',
      cdnify: 'grunt-google-cdn'
      });

      // Configurable paths for the application
      var appConfig = {
      app: require('./bower.json').appPath || 'app',
      dist: 'dist'
      };

      // Define the configuration for all the tasks
      grunt.initConfig({

      // Project settings
      yeoman: appConfig,

      // Watches files for changes and runs tasks based on the changed files
      watch: {
      bower: {
      files: ['bower.json'],
      tasks: ['wiredep']
      },
      js: {
      files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
      tasks: ['newer:jshint:all', 'newer:jscs:all'],
      options: {
      livereload: '<%= connect.options.livereload %>'
      }
      },
      jsTest: {
      files: ['test/spec/{,*/}*.js'],
      tasks: ['newer:jshint:test', 'newer:jscs:test', 'karma']
      },
      compass: {
      files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
      tasks: ['compass:server', 'postcss:server']
      },
      gruntfile: {
      files: ['Gruntfile.js']
      },
      livereload: {
      options: {
      livereload: '<%= connect.options.livereload %>'
      },
      files: [
      '<%= yeoman.app %>/{,*/}*.html',
      '.tmp/styles/{,*/}*.css',
      '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
      ]
      }
      },

      // The actual grunt server settings
      connect: {
      options: {
      port: 9000,
      // Change this to '0.0.0.0' to access the server from outside.
      hostname: 'localhost',
      livereload: 35729
      },
      livereload: {
      options: {
      open: true,
      middleware: function (connect) {
      return [
      connect.static('.tmp'),
      connect().use(
      '/bower_components',
      connect.static('./bower_components')
      ),
      connect().use(
      '/app/styles',
      connect.static('./app/styles')
      ),
      connect.static(appConfig.app)
      ];
      }
      }
      },
      test: {
      options: {
      port: 9001,
      middleware: function (connect) {
      return [
      connect.static('.tmp'),
      connect.static('test'),
      connect().use(
      '/bower_components',
      connect.static('./bower_components')
      ),
      connect.static(appConfig.app)
      ];
      }
      }
      },
      dist: {
      options: {
      open: true,
      base: '<%= yeoman.dist %>'
      }
      }
      },

      // Make sure there are no obvious mistakes
      jshint: {
      options: {
      jshintrc: '.jshintrc',
      reporter: require('jshint-stylish')
      },
      all: {
      src: [
      'Gruntfile.js',
      '<%= yeoman.app %>/scripts/{,*/}*.js'
      ]
      },
      test: {
      options: {
      jshintrc: 'test/.jshintrc'
      },
      src: ['test/spec/{,*/}*.js']
      }
      },

      // Make sure code styles are up to par
      jscs: {
      options: {
      config: '.jscsrc',
      verbose: true
      },
      all: {
      src: [
      'Gruntfile.js',
      '<%= yeoman.app %>/scripts/{,*/}*.js'
      ]
      },
      test: {
      src: ['test/spec/{,*/}*.js']
      }
      },

      // Empties folders to start fresh
      clean: {
      dist: {
      files: [{
      dot: true,
      src: [
      '.tmp',
      '<%= yeoman.dist %>/{,*/}*',
      '!<%= yeoman.dist %>/.git{,*/}*'
      ]
      }]
      },
      server: '.tmp'
      },

      // Add vendor prefixed styles
      postcss: {
      options: {
      processors: [
      require('autoprefixer-core')({browsers: ['last 1 version']})
      ]
      },
      server: {
      options: {
      map: true
      },
      files: [{
      expand: true,
      cwd: '.tmp/styles/',
      src: '{,*/}*.css',
      dest: '.tmp/styles/'
      }]
      },
      dist: {
      files: [{
      expand: true,
      cwd: '.tmp/styles/',
      src: '{,*/}*.css',
      dest: '.tmp/styles/'
      }]
      }
      },

      // Automatically inject Bower components into the app
      wiredep: {
      app: {
      src: ['<%= yeoman.app %>/index.html'],
      ignorePath: /..//
      },
      test: {
      devDependencies: true,
      src: '<%= karma.unit.configFile %>',
      ignorePath: /..//,
      fileTypes:{
      js: {
      block: /(([st]*)/{2}s*?bower:s*?(S*))(n|r|.)*?(/{2}s*endbower)/gi,
      detect: {
      js: /'(.*.js)'/gi
      },
      replace: {
      js: ''{{filePath}}','
      }
      }
      }
      },
      sass: {
      src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
      ignorePath: /(../){1,2}bower_components//
      }
      },

      // Compiles Sass to CSS and generates necessary files if requested
      compass: {
      options: {
      sassDir: '<%= yeoman.app %>/styles',
      cssDir: '.tmp/styles',
      generatedImagesDir: '.tmp/images/generated',
      imagesDir: '<%= yeoman.app %>/images',
      javascriptsDir: '<%= yeoman.app %>/scripts',
      fontsDir: '<%= yeoman.app %>/styles/fonts',
      importPath: './bower_components',
      httpImagesPath: '/images',
      httpGeneratedImagesPath: '/images/generated',
      httpFontsPath: '/styles/fonts',
      relativeAssets: false,
      assetCacheBuster: false,
      raw: 'Sass::Script::Number.precision = 10n'
      },
      dist: {
      options: {
      generatedImagesDir: '<%= yeoman.dist %>/images/generated'
      }
      },
      server: {
      options: {
      sourcemap: true
      }
      }
      },

      // Renames files for browser caching purposes
      filerev: {
      dist: {
      src: [
      '<%= yeoman.dist %>/scripts/{,*/}*.js',
      '<%= yeoman.dist %>/styles/{,*/}*.css',
      '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
      '<%= yeoman.dist %>/styles/fonts/*'
      ]
      }
      },

      // Reads HTML for usemin blocks to enable smart builds that automatically
      // concat, minify and revision files. Creates configurations in memory so
      // additional tasks can operate on them
      useminPrepare: {
      html: '<%= yeoman.app %>/index.html',
      options: {
      dest: '<%= yeoman.dist %>',
      flow: {
      html: {
      steps: {
      js: ['concat', 'uglifyjs'],
      css: ['cssmin']
      },
      post: {}
      }
      }
      }
      },

      // Performs rewrites based on filerev and the useminPrepare configuration
      usemin: {
      html: ['<%= yeoman.dist %>/{,*/}*.html'],
      css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
      js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'],
      options: {
      assetsDirs: [
      '<%= yeoman.dist %>',
      '<%= yeoman.dist %>/images',
      '<%= yeoman.dist %>/styles'
      ],
      patterns: {
      js: [[/(images/[^''""]*.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']]
      }
      }
      },

      // The following *-min tasks will produce minified files in the dist folder
      // By default, your `index.html`'s <!-- Usemin block --> will take care of
      // minification. These next options are pre-configured if you do not wish
      // to use the Usemin blocks.
      // cssmin: {
      // dist: {
      // files: {
      // '<%= yeoman.dist %>/styles/main.css': [
      // '.tmp/styles/{,*/}*.css'
      // ]
      // }
      // }
      // },
      // uglify: {
      // dist: {
      // files: {
      // '<%= yeoman.dist %>/scripts/scripts.js': [
      // '<%= yeoman.dist %>/scripts/scripts.js'
      // ]
      // }
      // }
      // },
      // concat: {
      // dist: {}
      // },

      imagemin: {
      dist: {
      files: [{
      expand: true,
      cwd: '<%= yeoman.app %>/images',
      src: '{,*/}*.{png,jpg,jpeg,gif}',
      dest: '<%= yeoman.dist %>/images'
      }]
      }
      },

      svgmin: {
      dist: {
      files: [{
      expand: true,
      cwd: '<%= yeoman.app %>/images',
      src: '{,*/}*.svg',
      dest: '<%= yeoman.dist %>/images'
      }]
      }
      },

      htmlmin: {
      dist: {
      options: {
      collapseWhitespace: true,
      conservativeCollapse: true,
      collapseBooleanAttributes: true,
      removeCommentsFromCDATA: true
      },
      files: [{
      expand: true,
      cwd: '<%= yeoman.dist %>',
      src: ['*.html'],
      dest: '<%= yeoman.dist %>'
      }]
      }
      },

      ngtemplates: {
      dist: {
      options: {
      module: 'dataGameApp',
      htmlmin: '<%= htmlmin.dist.options %>',
      usemin: 'scripts/scripts.js'
      },
      cwd: '<%= yeoman.app %>',
      src: 'views/{,*/}*.html',
      dest: '.tmp/templateCache.js'
      }
      },

      // ng-annotate tries to make the code safe for minification automatically
      // by using the Angular long form for dependency injection.
      ngAnnotate: {
      dist: {
      files: [{
      expand: true,
      cwd: '.tmp/concat/scripts',
      src: '*.js',
      dest: '.tmp/concat/scripts'
      }]
      }
      },

      // Replace Google CDN references
      cdnify: {
      dist: {
      html: ['<%= yeoman.dist %>/*.html']
      }
      },

      // Copies remaining files to places other tasks can use
      copy: {
      dist: {
      files: [{
      expand: true,
      dot: true,
      cwd: '<%= yeoman.app %>',
      dest: '<%= yeoman.dist %>',
      src: [
      '*.{ico,png,txt}',
      '.htaccess',
      '*.html',
      'images/{,*/}*.{webp}',
      'styles/fonts/{,*/}*.*'
      ]
      }, {
      expand: true,
      cwd: '.tmp/images',
      dest: '<%= yeoman.dist %>/images',
      src: ['generated/*']
      }, {
      expand: true,
      cwd: '.',
      src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*',
      dest: '<%= yeoman.dist %>'
      }]
      },
      styles: {
      expand: true,
      cwd: '<%= yeoman.app %>/styles',
      dest: '.tmp/styles/',
      src: '{,*/}*.css'
      }
      },

      // Run some tasks in parallel to speed up the build process
      concurrent: {
      server: [
      'compass:server'
      ],
      test: [
      'compass'
      ],
      dist: [
      'compass:dist',
      'imagemin',
      'svgmin'
      ]
      },

      // Test settings
      karma: {
      unit: {
      configFile: 'test/karma.conf.js',
      singleRun: true
      }
      }
      });


      grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
      if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
      }

      grunt.task.run([
      'clean:server',
      'wiredep',
      'concurrent:server',
      'postcss:server',
      'connect:livereload',
      'watch'
      ]);
      });

      grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
      grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
      grunt.task.run(['serve:' + target]);
      });

      grunt.registerTask('test', [
      'clean:server',
      'wiredep',
      'concurrent:test',
      'postcss',
      'connect:test',
      'karma'
      ]);

      grunt.registerTask('build', [
      'clean:dist',
      'wiredep',
      'useminPrepare',
      'concurrent:dist',
      'postcss',
      'ngtemplates',
      'concat',
      'ngAnnotate',
      'copy:dist',
      'cdnify',
      'cssmin',
      'uglify',
      'filerev',
      'usemin',
      'htmlmin'
      ]);

      grunt.registerTask('default', [
      'newer:jscs',
      //'test',
      'build'
      ]);
      };


      Please suggest an approach to do this










      share|improve this question













      I have a very large angular js application and I want to optimize its performance.
      I want to create separate minified js files instead of creating a single file(scripts.js).



      I found a solution to do this here.
      It minifies the files but when I deploy it, I get invalid provider error.
      Here is my grunt file (I have removed the code used for separate minifcation and posting my original grunt file.)



      // Generated on 2016-06-18 using generator-angular 0.15.1
      'use strict';

      // # Globbing
      // for performance reasons we're only matching one level down:
      // 'test/spec/{,*/}*.js'
      // use this if you want to recursively match all subfolders:
      // 'test/spec/**/*.js'

      module.exports = function (grunt) {

      // Time how long tasks take. Can help when optimizing build times
      require('time-grunt')(grunt);

      // Automatically load required Grunt tasks
      require('jit-grunt')(grunt, {
      useminPrepare: 'grunt-usemin',
      ngtemplates: 'grunt-angular-templates',
      cdnify: 'grunt-google-cdn'
      });

      // Configurable paths for the application
      var appConfig = {
      app: require('./bower.json').appPath || 'app',
      dist: 'dist'
      };

      // Define the configuration for all the tasks
      grunt.initConfig({

      // Project settings
      yeoman: appConfig,

      // Watches files for changes and runs tasks based on the changed files
      watch: {
      bower: {
      files: ['bower.json'],
      tasks: ['wiredep']
      },
      js: {
      files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
      tasks: ['newer:jshint:all', 'newer:jscs:all'],
      options: {
      livereload: '<%= connect.options.livereload %>'
      }
      },
      jsTest: {
      files: ['test/spec/{,*/}*.js'],
      tasks: ['newer:jshint:test', 'newer:jscs:test', 'karma']
      },
      compass: {
      files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
      tasks: ['compass:server', 'postcss:server']
      },
      gruntfile: {
      files: ['Gruntfile.js']
      },
      livereload: {
      options: {
      livereload: '<%= connect.options.livereload %>'
      },
      files: [
      '<%= yeoman.app %>/{,*/}*.html',
      '.tmp/styles/{,*/}*.css',
      '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
      ]
      }
      },

      // The actual grunt server settings
      connect: {
      options: {
      port: 9000,
      // Change this to '0.0.0.0' to access the server from outside.
      hostname: 'localhost',
      livereload: 35729
      },
      livereload: {
      options: {
      open: true,
      middleware: function (connect) {
      return [
      connect.static('.tmp'),
      connect().use(
      '/bower_components',
      connect.static('./bower_components')
      ),
      connect().use(
      '/app/styles',
      connect.static('./app/styles')
      ),
      connect.static(appConfig.app)
      ];
      }
      }
      },
      test: {
      options: {
      port: 9001,
      middleware: function (connect) {
      return [
      connect.static('.tmp'),
      connect.static('test'),
      connect().use(
      '/bower_components',
      connect.static('./bower_components')
      ),
      connect.static(appConfig.app)
      ];
      }
      }
      },
      dist: {
      options: {
      open: true,
      base: '<%= yeoman.dist %>'
      }
      }
      },

      // Make sure there are no obvious mistakes
      jshint: {
      options: {
      jshintrc: '.jshintrc',
      reporter: require('jshint-stylish')
      },
      all: {
      src: [
      'Gruntfile.js',
      '<%= yeoman.app %>/scripts/{,*/}*.js'
      ]
      },
      test: {
      options: {
      jshintrc: 'test/.jshintrc'
      },
      src: ['test/spec/{,*/}*.js']
      }
      },

      // Make sure code styles are up to par
      jscs: {
      options: {
      config: '.jscsrc',
      verbose: true
      },
      all: {
      src: [
      'Gruntfile.js',
      '<%= yeoman.app %>/scripts/{,*/}*.js'
      ]
      },
      test: {
      src: ['test/spec/{,*/}*.js']
      }
      },

      // Empties folders to start fresh
      clean: {
      dist: {
      files: [{
      dot: true,
      src: [
      '.tmp',
      '<%= yeoman.dist %>/{,*/}*',
      '!<%= yeoman.dist %>/.git{,*/}*'
      ]
      }]
      },
      server: '.tmp'
      },

      // Add vendor prefixed styles
      postcss: {
      options: {
      processors: [
      require('autoprefixer-core')({browsers: ['last 1 version']})
      ]
      },
      server: {
      options: {
      map: true
      },
      files: [{
      expand: true,
      cwd: '.tmp/styles/',
      src: '{,*/}*.css',
      dest: '.tmp/styles/'
      }]
      },
      dist: {
      files: [{
      expand: true,
      cwd: '.tmp/styles/',
      src: '{,*/}*.css',
      dest: '.tmp/styles/'
      }]
      }
      },

      // Automatically inject Bower components into the app
      wiredep: {
      app: {
      src: ['<%= yeoman.app %>/index.html'],
      ignorePath: /..//
      },
      test: {
      devDependencies: true,
      src: '<%= karma.unit.configFile %>',
      ignorePath: /..//,
      fileTypes:{
      js: {
      block: /(([st]*)/{2}s*?bower:s*?(S*))(n|r|.)*?(/{2}s*endbower)/gi,
      detect: {
      js: /'(.*.js)'/gi
      },
      replace: {
      js: ''{{filePath}}','
      }
      }
      }
      },
      sass: {
      src: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'],
      ignorePath: /(../){1,2}bower_components//
      }
      },

      // Compiles Sass to CSS and generates necessary files if requested
      compass: {
      options: {
      sassDir: '<%= yeoman.app %>/styles',
      cssDir: '.tmp/styles',
      generatedImagesDir: '.tmp/images/generated',
      imagesDir: '<%= yeoman.app %>/images',
      javascriptsDir: '<%= yeoman.app %>/scripts',
      fontsDir: '<%= yeoman.app %>/styles/fonts',
      importPath: './bower_components',
      httpImagesPath: '/images',
      httpGeneratedImagesPath: '/images/generated',
      httpFontsPath: '/styles/fonts',
      relativeAssets: false,
      assetCacheBuster: false,
      raw: 'Sass::Script::Number.precision = 10n'
      },
      dist: {
      options: {
      generatedImagesDir: '<%= yeoman.dist %>/images/generated'
      }
      },
      server: {
      options: {
      sourcemap: true
      }
      }
      },

      // Renames files for browser caching purposes
      filerev: {
      dist: {
      src: [
      '<%= yeoman.dist %>/scripts/{,*/}*.js',
      '<%= yeoman.dist %>/styles/{,*/}*.css',
      '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
      '<%= yeoman.dist %>/styles/fonts/*'
      ]
      }
      },

      // Reads HTML for usemin blocks to enable smart builds that automatically
      // concat, minify and revision files. Creates configurations in memory so
      // additional tasks can operate on them
      useminPrepare: {
      html: '<%= yeoman.app %>/index.html',
      options: {
      dest: '<%= yeoman.dist %>',
      flow: {
      html: {
      steps: {
      js: ['concat', 'uglifyjs'],
      css: ['cssmin']
      },
      post: {}
      }
      }
      }
      },

      // Performs rewrites based on filerev and the useminPrepare configuration
      usemin: {
      html: ['<%= yeoman.dist %>/{,*/}*.html'],
      css: ['<%= yeoman.dist %>/styles/{,*/}*.css'],
      js: ['<%= yeoman.dist %>/scripts/{,*/}*.js'],
      options: {
      assetsDirs: [
      '<%= yeoman.dist %>',
      '<%= yeoman.dist %>/images',
      '<%= yeoman.dist %>/styles'
      ],
      patterns: {
      js: [[/(images/[^''""]*.(png|jpg|jpeg|gif|webp|svg))/g, 'Replacing references to images']]
      }
      }
      },

      // The following *-min tasks will produce minified files in the dist folder
      // By default, your `index.html`'s <!-- Usemin block --> will take care of
      // minification. These next options are pre-configured if you do not wish
      // to use the Usemin blocks.
      // cssmin: {
      // dist: {
      // files: {
      // '<%= yeoman.dist %>/styles/main.css': [
      // '.tmp/styles/{,*/}*.css'
      // ]
      // }
      // }
      // },
      // uglify: {
      // dist: {
      // files: {
      // '<%= yeoman.dist %>/scripts/scripts.js': [
      // '<%= yeoman.dist %>/scripts/scripts.js'
      // ]
      // }
      // }
      // },
      // concat: {
      // dist: {}
      // },

      imagemin: {
      dist: {
      files: [{
      expand: true,
      cwd: '<%= yeoman.app %>/images',
      src: '{,*/}*.{png,jpg,jpeg,gif}',
      dest: '<%= yeoman.dist %>/images'
      }]
      }
      },

      svgmin: {
      dist: {
      files: [{
      expand: true,
      cwd: '<%= yeoman.app %>/images',
      src: '{,*/}*.svg',
      dest: '<%= yeoman.dist %>/images'
      }]
      }
      },

      htmlmin: {
      dist: {
      options: {
      collapseWhitespace: true,
      conservativeCollapse: true,
      collapseBooleanAttributes: true,
      removeCommentsFromCDATA: true
      },
      files: [{
      expand: true,
      cwd: '<%= yeoman.dist %>',
      src: ['*.html'],
      dest: '<%= yeoman.dist %>'
      }]
      }
      },

      ngtemplates: {
      dist: {
      options: {
      module: 'dataGameApp',
      htmlmin: '<%= htmlmin.dist.options %>',
      usemin: 'scripts/scripts.js'
      },
      cwd: '<%= yeoman.app %>',
      src: 'views/{,*/}*.html',
      dest: '.tmp/templateCache.js'
      }
      },

      // ng-annotate tries to make the code safe for minification automatically
      // by using the Angular long form for dependency injection.
      ngAnnotate: {
      dist: {
      files: [{
      expand: true,
      cwd: '.tmp/concat/scripts',
      src: '*.js',
      dest: '.tmp/concat/scripts'
      }]
      }
      },

      // Replace Google CDN references
      cdnify: {
      dist: {
      html: ['<%= yeoman.dist %>/*.html']
      }
      },

      // Copies remaining files to places other tasks can use
      copy: {
      dist: {
      files: [{
      expand: true,
      dot: true,
      cwd: '<%= yeoman.app %>',
      dest: '<%= yeoman.dist %>',
      src: [
      '*.{ico,png,txt}',
      '.htaccess',
      '*.html',
      'images/{,*/}*.{webp}',
      'styles/fonts/{,*/}*.*'
      ]
      }, {
      expand: true,
      cwd: '.tmp/images',
      dest: '<%= yeoman.dist %>/images',
      src: ['generated/*']
      }, {
      expand: true,
      cwd: '.',
      src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*',
      dest: '<%= yeoman.dist %>'
      }]
      },
      styles: {
      expand: true,
      cwd: '<%= yeoman.app %>/styles',
      dest: '.tmp/styles/',
      src: '{,*/}*.css'
      }
      },

      // Run some tasks in parallel to speed up the build process
      concurrent: {
      server: [
      'compass:server'
      ],
      test: [
      'compass'
      ],
      dist: [
      'compass:dist',
      'imagemin',
      'svgmin'
      ]
      },

      // Test settings
      karma: {
      unit: {
      configFile: 'test/karma.conf.js',
      singleRun: true
      }
      }
      });


      grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
      if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
      }

      grunt.task.run([
      'clean:server',
      'wiredep',
      'concurrent:server',
      'postcss:server',
      'connect:livereload',
      'watch'
      ]);
      });

      grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
      grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
      grunt.task.run(['serve:' + target]);
      });

      grunt.registerTask('test', [
      'clean:server',
      'wiredep',
      'concurrent:test',
      'postcss',
      'connect:test',
      'karma'
      ]);

      grunt.registerTask('build', [
      'clean:dist',
      'wiredep',
      'useminPrepare',
      'concurrent:dist',
      'postcss',
      'ngtemplates',
      'concat',
      'ngAnnotate',
      'copy:dist',
      'cdnify',
      'cssmin',
      'uglify',
      'filerev',
      'usemin',
      'htmlmin'
      ]);

      grunt.registerTask('default', [
      'newer:jscs',
      //'test',
      'build'
      ]);
      };


      Please suggest an approach to do this







      angularjs gruntjs grunt-contrib-uglify






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 23 at 1:50









      Akshay

      338314




      338314





























          active

          oldest

          votes











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439788%2fbuild-optimized-grunt-file%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439788%2fbuild-optimized-grunt-file%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Contact image not getting when fetch all contact list from iPhone by CNContact

          count number of partitions of a set with n elements into k subsets

          A CLEAN and SIMPLE way to add appendices to Table of Contents and bookmarks