Что такое Gulp? Установка и создание Gulp задач

Gulp – это менеджер задач, использование которого позволяет автоматизировать большинство рутинных процессов, с которыми вы столкнетесь при разработке. Как правило, подразумевают веб-разработку, но жестких ограничений на применение Gulp нет. Позже я постараюсь рассмотреть несколько примеров использования данного таск-менеджера вне контекста веб-приложений или даже вне контекста разработки. Тем не менее, когда вы будете слышать что-либо о Gulp, с большой долей вероятности можно говорить, что речь пойдет о фронтенде.

Следует учесть, что сам по себе Gulp практически ничего не делает. Вся его сила заключена в огромном количестве плагинов, взаимодействием которых Gulp управляет исходя из заданных вами правил. На момент написания этого материала, на официальном сайте говорится о существовании без малого 4 000 плагинов.

Установка Gulp

Для работы Gulp необходимо наличие Node.js и npm. Установка выполняется из командной строки.

Создадим директорию для будущего проекта. Это можно сделать средствами файл менеджера, к которому вы привыкли, но я останусь в режиме командной строки.

Создаем директорию проекта и переходим в нее:

mkdir gulp-project
cd gulp-project

Глобально установим gulp-утилиту командной строки:

npm install --global gulp-cli

Инициируем файл package.json в директории проекта:

npm init

Локально устанавливаем Gulp

npm install --save-dev gulp

Конфигурируем Gulp c помощью gulpfile.js

Все, что вы хотите доверить работе Gulp, должно быть описано в gulpfile.js, который необходимо поместить рядом с package.json.

Следует понимать, что gulpfile это просто js файл, где вы можете писать любой JavaScript код и он будет выполняться с помощью nodejs. Главное, чтобы этот js код был зарегистрирован в качестве gulp задач, которые могут выполняться. Иными словами, даже не используя gulp плагины, можно в какой-то степени оптимизировать рабочие процессы.

Gulp позволяет регистрировать таски двумя способами, но я рассмотрю тот, который рекомендуется официальной документацией – через exports.

Пример простейшего таска:

function someTask(cb) {
  console.log('Some gulp task');
  cb();
}

exports.default = someTask

Gulp task – это функция, которая будет выполнена при вызове в качестве gulp задания. В нашем случае внутри функции мы просто бросаем запись в консоль. В конце работы вызываем callback cb(), что сообщает менеджеру о завершении работы задачи. Функцию экспортируем в качестве gulp-таска с именем default. Имя, разумеется, может быть любое.

Запустим задачу default консольной командой:

gulp default

Вызов может быть осуществлен вручную (консольной командой), может быть инициирован в IDE (многие IDE имеют интеграцию с Gulp), либо таск можно вызвать по событию изменения какого-то файла.

Я добавлю еще две задачи, создающие копии директорий, если в них были созданы/изменены файлы. Будь это реальный проект, такими директориями могли бы оказаться директории с изображениями и шрифтами верстки, которые необходимо скопировать в production версию.

Я создал две директории внутри текущей рабочей: ./fonts и ./images. Их содержимое должно быть скопировано, например, в ./dist/fonts и ./dist/images соответственно.

Пока gulpfile.js изменился следующим образом:

const gulp = require('gulp');

function copyImages() {
  return gulp.src('./images/**/*')
      .pipe(gulp.dest('./dist/images'));
}

function copyFonts() {
  return gulp.src('./fonts/**/*')
      .pipe(gulp.dest('./dist/fonts'));
}

exports.copyImages = copyImages;
exports.copyFonts = copyFonts;
exports.copy = gulp.parallel(copyImages, copyFonts)

В первой строке импортируется gulp, что позволит использовать его API. Затем создаются две функции, которые экспортируются в виде трех задач. По одной на каждую функцию, плюс одна общая задача, запустив которую, gulp выполнит сразу обе функции, причем сделает это не последовательно, а параллельно, что должно снизить общее время копирования, если файлов в директориях будет много.

В функциях нет вызова cb(); он не требуется в том случае, если мы возвращаем объект, с которым работаем.

Осталось написать watcher.

Настройка Gulp watcher

В файл добавлена еще одна функция, внутри которой, с помощью вызова gulp.watch(), происходит установка наблюдателя на директорию. В качестве второго параметра передается таск, который должен быть вызван, если наблюдатель зарегистрировал изменения в директории.

function watcher(cb) {
  gulp.watch('./images/**/*', gulp.parallel(copyImages));
  gulp.watch('./fonts/**/*', gulp.parallel(copyFonts));
  cb();
}

Функцию также регистрируем в качестве таска:

exports.watcher = gulp.parallel(watcher);

Теперь можно запустить watcher командой:

gulp watcher

Вывозы gulp.watch() можно было не заворачивать в функцию, но тогда они срабатывали бы при запуске абсолютно любой gulp-задачи. Если в вашем файле всего одна задача, то это может быть удобно.

Итоговые содержимое файла gulpfile.js:

const gulp = require('gulp');

function copyImages() {
  return gulp.src('./images/**/*')
      .pipe(gulp.dest('./dist/images'));
}

function copyFonts() {
  return gulp.src('./fonts/**/*')
      .pipe(gulp.dest('./dist/fonts'));
}

function watcher(cb) {
  gulp.watch('./images/**/*', gulp.parallel(copyImages));
  gulp.watch('./fonts/**/*', gulp.parallel(copyFonts));
  cb();
}

exports.copyImages = copyImages;
exports.copyFonts = copyFonts;
exports.copy = gulp.parallel(copyImages, copyFonts);
exports.watcher = gulp.parallel(watcher);

В заключении

Как уже, наверное, стало понятно, Gulp не является чем-то революционным. До его появления упомянутые задачи решались bash скриптингом, cron’ом и прочими утилитами, доступными в любой операционной системе. Но Gulp и другие таск-манеджеры смогли предложить более простое и изящное решение.

В следующей публикации рассмотрим реальный кейс, актуальный при решении задач, связанных с версткой сайта или веб-приложения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии (0)

Пока нет комментариев