Последовательное и паралельное выполнение задач Gulp
Вам следует понимать, что все задачи Gulp
асинхронны. Давайте посмотрим на примере, пусть внутри публичной задачи вызываются две приватных:
gulpfile.jsfunction taskD(cb) {
task1(cb);
task2(cb);
cb();
}
Асинхронность означает, что задача task2
не будет дожидаться окончания выполнения задачи task1
, а будет выполняться параллельно с ней.
Пусть первая задача преобразует LESS в CSS, а вторая задача минимизирует полученный CSS. В таком случае мы столкнемся с проблемой: ведь нельзя минимизировать CSS файл до того, как в него попадет результат компиляции LESS.
Если бы задачи выполнялись синхронно, последовательно одна за другой, мы столкнулись бы с другой проблемой: задачи, которые можно выполнить параллельно, выполнялись бы одна за другой, замедляя работу Gulp
.
Пусть первая задача минимизирует CSS файлы, а вторая задача минимизирует JavaScript файлы. Очевидно, что эти две не связанные операции можно выполнять одновременно. К счастью, Gulp
предоставляет инструменты, позволяющие явно указать, какие задачи должны быть выполнены параллельно, а какие последовательно.
Группы задач
Задачи Gulp
можно объединять в группы или композиции, явно указать на метод выполнения кода последовательно или параллельно.
Для примера возьмем следующие задачи:
gulpfile.jsfunction task1(cb) {
cb();
}
function task2(cb) {
cb();
}
Последовательное выполнение
Для последовательного выполнения задач предназначена функция series()
. Эта функция параметрами принимает любое количество задач и выполняет их по очереди в порядке перечисления.
gulpfile.jsconst { series } = require('gulp');
Теперь мы можем воспользоваться этой функцией:
gulpfile.jsfunction taskD(cb) {
series(task1, task2);
cb();
}
exports.default = taskD;
Можно сразу экспортировать результат работы series
, не создавая лишней функции для публичной задачи:
gulpfile.jsexports.default = series(task1, task2);
Параллельное выполнение
Для параллельного выполнения задач предназначена функция parallel()
. Эта функция параметрами принимает любое количество задач и выполняет их паралельно.
gulpfile.jsconst { parallel } = require('gulp');
Теперь мы можем воспользоваться этой функцией:
gulpfile.jsfunction taskD(cb) {
parallel(task1, task2);
cb();
}
exports.default = taskD;
Можно сразу экспортировать результат работы parallel
, не создавая лишней функции для публичной задачи:
gulpfile.jsexports.default = parallel(task1, task2);
Комбинации
Функции series()
и parallel()
можно вкладывать в друг друга в любых комбинациях:
gulpfile.jsexports.default = series(task1, parallel(task2, task3));