Gulp 4: Сквозные исходные потоки
vinyl-fs
, которое появилось в Gulp 4 – это возможность иметь 'сквозные' исходные потоки. Оно делает gulp.src
доступным для записи.Обычно gulp.src
создаёт поток файловых объектов на основе предоставленного вами шаблона подстановки. Это сделало обязательным размещение gulp.src
в начале вашего потока. Теперь он может быть размещён в любом месте вашего конвейера
, пропуская предыдущие шаги.
Это позволяет создавать довольно интересные сценарии. Самым полезным из них объединение потоков. Как вы можете увидеть на приведённом далее примере, мы хотим проверить линтером свои JavaScript файлы
и объединить их с файлами поставщиков в один файл.
var gulp = require('gulp');
var concat = require('gulp-concat');
var jshint = require('gulp-jshint');
var uglify = require('gulp-uglify');
gulp.task('default', function() {
return gulp.src('src/**/*.js') /** 1 **/
.pipe(jshint()) /** 2 **/
.pipe(jshint.reporter('default'))
.pipe(jshint.reporter('fail'))
.pipe(gulp.src('vendor/**/*.js', {passthrough: true})) /** 3 **/
.pipe(uglify())
.pipe(concat('main.min.js'))
.pipe(gulp.dest('dest'));
});
Пояснение процесса:
- Мы собираем наши исходные JavaScript файлы.
- Это файлы, которые мы разработали, а значит мы хотим, что бы они соответствовали нашим соглашениям о кодировании.
- После выполнения
JSHint
, мы получаем все файлы поставщиков. К ним относятся такие пакеты файлов, какjQuery
,lodash
и прочие. При использовании флагаpassthrough
, все файловые объекты пропускают предыдущие этапы конвейера потока и добавляются к общему потоку.
Мы так же можем использовать эту возможность, когда хотим объединить вывод препроцессора sass с обычными исходными css файлами.
gulp.task('styles', function(){
return gulp.src('styles/main.scss')
.pipe(sass())
.pipe(gulp.src('styles/**/*.css'), {passthrough: true})
.pipe(concat('main.css'))
.pipe(gulp.dest('dist'));
});
То же самое с CoffeeScript, если вам понравилась идея:
gulp.task('scripts', function(){
return gulp.src('scripts/*.coffee')
.pipe(coffee())
.pipe(gulp.src('scripts/*.js'), {passthrough: true})
.pipe(uglify())
.pipe(gulp.dest('dist'));
});
Хотя это не решает все задачи, в которых может пригодиться использование слияния. Объединение различных источников в средине потока это определённо желанное дополнение.