Schlagwort-Archive: JavaScript

Using Grunt „The JavaScript Task Runner“

Grunt erleichtert definitiv die Entwicklungsarbeit. Aber wie benutze ich es?

Grunt ist abhängig von node.js bzw. dessen Paketmanager npm. Diese müssen folglich vorher installiert sein.
Im Projektverzeichnis sollte eine Datei package.json vorhanden sein:

{
  "name": "myTool",
  "description": "describe the tool"
}

Danach kann Grunt für das Projekt installiert bzw. aktiviert werden:

$ npm install grunt --save-dev

Dadurch wird neues Verzeichnis node_modules im Projektverzeichnis erstellt und Grunt kann benutzt werden. Die Option –save-dev ergänzt/erweitert die devDependencies in package.json um grunt. Analog für verwendete Grunt-Plugins gilt:

$ npm install grunt-contrib-concat --save-dev
$ npm install grunt-contrib-cssmin --save-dev
$ npm install grunt-contrib-uglify --save-dev
$ npm install grunt-contrib-watch --save-dev

Anschließend sind auch die installierten Plugins einsatzbereit, bspw.

$ grunt watch

Die Konfigurationsdatei Gruntfile.js sieht in etwa so aus:

  // Creating a wrapper
module.exports = function(grunt){
    // Initializing configuration objects
  grunt.initConfig({
      // Reading 'package.json' so that we can use setting given there
    pkg : grunt.file.readJSON('package.json'),
      // specifying the settings for css file minification
    cssmin : {
      backend : {
        expand : true,
        cwd : 'web/verwaltung/css/',
        src : [ '*.css', '!*.min.css' ],
        dest : 'web/verwaltung/css/',
        ext : '.min.css'
      },
      frontend : {
        expand : true,
        cwd : 'web/styles/',
        src : [ '*.css', '!*.min.css' ],
        dest : 'web/styles/',
        ext : '.min.css'
      },
      options: {
        banner: '/*! <%= pkg.name %> - <%= grunt.template.today("yyyy-mm-dd H:M") %> */'
      }
    },
      // specifying the settings for js file minification
    uglify : {
      backend: {
        files: {
          'web/verwaltung/js/be.min.js': ['web/js/jquery.jnotify.js','web/js/shared/dialog-service.js','web/verwaltung/js/app.js']
        }
      },
      frontendApp: {
        files: {
          'web/js/app.min.js': ['web/js/jquery.jnotify.js','web/js/shared/dialog-service.js','web/js/snv.js']
        }
      },
      frontendNgGrid: {
        files: {
          'web/js/angular-gridster.min.js': ['web/js/angular-gridster.js']
        }
      },
      options: {
        banner: '/*! <%= pkg.name %> - <%= grunt.template.today("yyyy-mm-dd H:M") %> */'
      }
    },
      // @see http://www.thegeekstuff.com/2014/10/grunt-contrib-watch-automate/
    watch: {
      backend: {
        files: ['web/verwaltung/css/*.css','web/verwaltung/js/*.js'],
        tasks: ['minifyBE'],
        options: {
          spawn:false,
          event:['all']
        }
      },
      frontend: {
        files: ['web/styles/*.css','web/js/*.js'],
        tasks: ['minifyFE'],
        options: {
          spawn:false,
          event:['all']
        }
      }
    }
  });
    // Loading grunt-packages
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-watch');
    // Registering tasks
  grunt.registerTask( 'minifyBE', [ 'cssmin:backend', 'uglify:backend' ] );
  grunt.registerTask( 'minifyFE', [ 'cssmin:frontend', 'uglify:frontendApp', 'uglify:frontendNgGrid' ] );
}

Die mit registerTask() hinterlegten Aufgaben können mittels Konsole auch separat gestartet werden:

$ grunt minifyBE