gulpminifybundling-and-minificationgulp-concat

Do not minify already minified files during concatenation and minification


I have a gulp task which minifies CSS files and concatenates them to one file:

gulp.task('minify-css', function() {
'use strict';
var pathsToMinifyAndConcat = [
    'css/index.css'
];

var pathsToConcatOnly = [
    'lib/css/font-awesome-4.3.0/font-awesome.min.css'
];

var minifyFiles = require('gulp-cssnano');
var concatAllFilesToOneFile = require('gulp-concat');
return gulp.src(
        []
            .concat(pathsToMinifyAndConcat)
            .concat(pathsToConcatOnly)
    )
    .pipe(minifyFiles())
    .pipe(concatAllFilesToOneFile('application.min.css'))
    .pipe(gulp.dest('dist'));
});

But, if some files are already minified (like font-awesome.min.css for example), it should not be minified again - it should be only concatenated, and it should be omitted from the minifying process. Is there a way to do it without hacky solutions (I don't want to use solutions which I can't fully understand - and I'm pretty new to gulp) with preserved files order? I found a plugin to add src files in any point in the pipeline: gulp-add-src, but it seems to be inactive for a while.


Solution

  • There is more than one way of doing what you want. I will give you two examples.

    First:

    var gulp = require('gulp');
    var minify = require('gulp-cssnano');
    var concat = require('gulp-concat');
    var merge = require('merge-stream');
    
    gulp.task('minify-css', function() {
    
      var pathsToMinify = [
        'css/style1.css'
      ];
    
      var pathsToConcat = [
        'css/style2.css'
      ];
    
      var minStream = gulp.src(pathsToMinify)
        .pipe(minify());
    
      var concatStream = gulp.src(pathsToConcat)
    
      return merge(minStream, concatStream)
        .pipe(concat('all.css'))
        .pipe(gulp.dest('dist'));
    
    });
    

    In this example it is created two different streams. One is minified and the other is not. In the end these two streams are merged, concatenated and then the files are written in the disk.

    Second:

    var gulp = require('gulp');
    var minify = require('gulp-cssnano');
    var concat = require('gulp-concat');
    var gulpFilter = require('gulp-filter');
    
    gulp.task('minify-css', function() {
    
      var paths = [
        'css/style1.css',
        'css/style2.css'
      ];
    
      // Files to minify.
      var filter = gulpFilter([
        'style1.css'
      ],
      {
        restore: true
      });
    
      return gulp.src(paths)
        .pipe(filter)
        .pipe(minify())
        .pipe(filter.restore)
        .pipe(concat('all.css'))
        .pipe(gulp.dest('dist'));
    
    });
    

    In this example, just one stream is created but the vinyl file objects are filtered by gulp-filter and just the filtered ones are minified. Then, all the files originally in the pipeline are restored with filter.restore and concatenated.

    There are other possibilities, like creating two different tasks where one just minifies and the other concatenates, but with this approach you would need to write the minified files temporarily in the disk.