Порядок слияния потока событий Gulp.js

Я пытаюсь объединить файлы CSS и SCSS в файл main.css, который находится в моей директории сборки. Работает, но не в правильном порядке. Атрибуты стиля из файлов scss должны находиться в нижней части файла main.css, поэтому они отменяют все остальные.

моя задача Gulp выглядит так:

    //CSS
gulp.task('css', function () {
    var cssTomincss = gulp.src(['dev/css/reset.css', 'dev/css/style.css','dev/css/typography.css',    'dev/css/sizes.css']);

    var cssFromscss = gulp.src(['dev/css/*.scss'])
        .pipe(sass());

    return es.merge(cssTomincss, cssFromscss)
        .pipe(concat('main.css'))
        .pipe(minifyCSS())
        .pipe(gulp.dest('build/css'))
});

Сначала я определяю источники с переменными. Я использую плагин gulp-sass для преобразования файла scss в обычный css (.pipe(sass)), а затем объединяю их с помощью функции es.merge и объединяю их в main.css.

Проблема заключается в том, что атрибуты стиля в файлах.scss оказываются где-то в верхнем конце файла main.css. Мне нужно, чтобы они были внизу. Таким образом, они должны быть соединены внизу.

Любая подсказка о том, как это сделать?

4 ответа

Решение

Попробуйте 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'))
});

Эта таблица поможет вам. PDF здесь.

Я безуспешно пробовал глоток: заказ как-то не учитывался.

Решение, которое работало для меня, заключалось в использовании потоковых серий, упомянутых Aperçu.

return streamSeries(
    cssTomincss,
    cssFromscss)
    .pipe(concat('main.css'))
    .pipe(minifyCSS())
    .pipe(gulp.dest('build/css'));

Похоже, что плагин gulp-order отлично вписывается в ваш случай.

Позволяет переупорядочить пройденный stream с вашим собственным glob шаблон, например, на основе вашего кода:

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'))

Одним из недостатков этого является то, что вы должны повторно объявить globs, но вы можете обойтись, назначив свой globs к значению, а затем объединить их в вас order труба, намного чище.

Возможно, вам придется установить base возможность . порядка gulp, как указано в их файле Readme, если файлы не были упорядочены правильно.

Другим способом будет использование серии потоков, в основном такой же, как и для потока событий, но порядок вашего потока сохраняется, и вам не нужно переписывать globs,

Я потерпел неудачу со всеми предоставленными ответами, они произвели некоторые тихие ошибки. Наконец- то у меня сработало merge2 (похоже там было gulp-merge и позже проект был переименован в merge2). Я не уверен, почему существует необходимость в плагине streamify, например, потоки, созданные с помощью Rollup, могут выдавать "поток-не-поддерживаемые ошибки" с gulp-concat, gulp-uglify или же 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'));
});
Другие вопросы по тегам