如何避免在GruntJS中不必要的丑化?

时间:2014-06-17 07:38:26

标签: gruntjs

我有一个grunt文件,其定义如下:

uglify: {
        build: {
                src: 'www/temp/application.js', // a concatenation of files via grunt-contrib-concat
                dest: 'www/temp/application.min.js'
        }
},

我真正想做的是仅在application.min.js文件被更改的情况下重新计算最终application.js。更确切地说,我想添加条件:

# pseudocode

if (getFileContents(application.js) == getFileContents(previously.uglified.application.js)) {
    // do nothing
} else {
    // run uglifying on application.js
}

原因:

  • 我通过git部署我的项目,uglifying相对较慢(3秒以上)而且,由于我不经常更改JS文件,因此没有必要。

1 个答案:

答案 0 :(得分:1)

有几种可能的解决方案:

您可以创建自己的grunt任务,使用例如fs.stat检查文件的上次修改时间,然后通过grunt.task.run以准备好的选项作为参数运行uglify任务。

或者您可以构建文件对象,通过过滤器函数动态传递它:

var fs = require('fs');

module.exports = function (grunt) {

  function filterChanged(files) {
    var mtime = '',
        stats;

    for (var dest in files) {
      stats = fs.statSync(files[dest]);

      try {
        mtime = fs.readFileSync(files[dest] + '.mtime', 'utf8');
      }
      catch (ex) {
        fs.writeFileSync(files[dest] + '.mtime', stats.mtime, 'utf8');
        return files;
      }

      if (stats.mtime == mtime || !mtime) {
        delete files[dest];
      }
      else {
        fs.writeFileSync(files[dest] + '.mtime', stats.mtime, 'utf8');
      }
    }

    return files;
  }

  grunt.initConfig({
    uglify: {
      build: {
        files: filterChanged({
          'www/temp/application.min.js': 'www/temp/application.js'
        })
      }
    }
  });

};

这会导致每次filterChanged任务运行时调用uglify函数。