Gulp.js event stream merge order

前端 未结 4 1761
渐次进展
渐次进展 2021-01-31 09:20

I am trying to merge css and scss files into a main.css file that goes in my build directory. Its working, but not in the right order. The style attributes from the scss files n

相关标签:
4条回答
  • 2021-01-31 09:29

    I tried gulp-order without success: the order somehow wasn't taken into account.

    The solution which worked for me was using stream-series, mentioned by Aperçu.

    return streamSeries(
        cssTomincss,
        cssFromscss)
        .pipe(concat('main.css'))
        .pipe(minifyCSS())
        .pipe(gulp.dest('build/css'));
    
    0 讨论(0)
  • 2021-01-31 09:37

    I failed with all provided answers, they produced some silent errors. Finally merge2 worked for me (seems like there was gulp-merge and later the project was renamed into merge2). I'm not sure why there is a need in streamify plugin, e.g. streams created with Rollup may produce "stream-not-supported-errors" with gulp-concat, gulp-uglify or gulp-insert.

    const mergeStreams = require('merge2');
    const streamify = require('streamify');
    ...
    gulp.task('build', () => {
        const streams = sources.map(createJSFile);
        return mergeStreams(...streams)
            .pipe(streamify(concat('bundle.js')))
            .pipe(streamify(uglify()))
            .pipe(gulp.dest('./dist'));
    });
    
    0 讨论(0)
  • 2021-01-31 09:49

    It seems that the plugin gulp-order fits perfectly well in your case.

    It allows you to re-order the passed stream with your own glob pattern, for example based on your code :

    return es.merge(cssTomincss, cssFromscss)
        .pipe(order([
          'dev/css/reset.css',
          'dev/css/style.css',
          'dev/css/typography.css',
          'dev/css/sizes.css',
          'dev/css/*.css',
        ]))
        .pipe(concat('main.css'))
        .pipe(minifyCSS())
        .pipe(gulp.dest('build/css'))
    

    One drawback of this is that you have to re-declare your globs, but you can get around by assign your globs to a value and then concat them in you order pipe, much cleaner.

    You may have to set the base option to . of gulp-order as stated in their Readme if the files were not ordered correctly.

    One another way would be to use stream-series, basically the same as event-stream, but the order of your stream is preserved, and you don't have to rewrite your globs.

    0 讨论(0)
  • 2021-01-31 09:52

    Try streamqueue.

    var streamqueue = require('streamqueue');
    
    gulp.task('css', function () {
        return streamqueue({ objectMode: true },
                gulp.src(['dev/css/reset.css', 'dev/css/style.css', 'dev/css/typography.css', 'dev/css/sizes.css']),
                gulp.src(['dev/css/*.scss']).pipe(sass())
            )
            .pipe(concat('main.css'))
            .pipe(minifyCSS())
            .pipe(gulp.dest('build/css'))
    });
    

    This cheatsheet will help you. PDF is here.

    0 讨论(0)
提交回复
热议问题