Крайне необходимая задача, возникающая в работе каждого верстальщика - это оптимизация графики, нарезанной из psd-макета или используемой в HTML-шаблоне.
Для этой цели существует много разных инструментов, начиная с RIOT и заканчивая утилитами Linux. Но гораздо более удобной возможностью является автоматизация процесса сжатия картинок с помощью плагина под Gulp.
Таким плагином является gulp-imagemin. Он умеет сжимать картинки форматов PNG, JPEG, GIF и SVG. Все остальные (не поддерживаемые) форматы графических файлов просто игнорируются плагином .1
gulp-imagemin
Установка gulp-imagemin
Установка плагина стандартная и производиться командой 1
gulp-imagemin
с ключом 1
npm install
для внесения пакета в список зависимостей проекта:1
--save-dev
$ sudo npm install --save-dev gulp-imageminСоздание задачи под gulp-imagemin
После установки плагина необходимо создать задачу сжатия картинок под этот плагин. Ничего необычного в этом нет и задача создается стандартно. Сначала создаем переменную 1
gulp-imagemin
, в которую помещаем сам плагин 1
imagemin
:1
gulp-imagemin
var imagemin = require('gulp-imagemin');А затем создаем задачу с произвольным именем :1
compress
// Compress Task
gulp.task('compress', function() {
gulp.src('images/*')
.pipe(imagemin())
.pipe(gulp.dest('build/images'))
});Задачу можно запускать однократно вручную или автоматически, доверив это дело Gulp и поместив ее внутрь встроенной функции 1
compress
.1
gulp.watch
Создаю в проекте директорию 1
gulp_test
и размещаю в ней несколько изображений формата 1
images
, но достаточно большого размера:1
.jpg
$ ls images/
black (22).jpg black (23).jpg black (28).jpg black (31).jpg black (36).jpg black (41).jpgЦель - проверить, действительно ли происходит сжатие графических файлов. Давайте опробуем работу плагина однократно, запустив в консоли команду 1
gulp-imagemin
:1
gulp compress
$ gulp compress
Using gulpfile ~/Projects/gulp_test/gulpfile.js
Starting 'compress'...
Finished 'compress' after 8.56 ms
gulp-imagemin: Minified 6 images (saved 83.02 kB - 7.2%)Отлично! Задача запустилась и выполнилась за 8.56 миллисекунд. При этом было обработано 6 изображений, над которыми была произведена операция сжатия. Экономия размера в результате компресии составила 1
compress
.1
7.2%
Давайте посмотрим на изображения в оригинале, расположенные в директории :1
images

… запомним примерные размеры каждого из файлов. А затем взглянем на содержимое директории , в которой располагаются сжатые плагином 1
build/images/
изображения:1
gulp-imagemin

Видно при сравнении, что размер графических файлов, пускай и ненамного, но уменьшился.
Gulp-imagemin - автоматический мониторинг
Давайте доведем нашу задачу до логического завершения и настроим Gulp таким образом, чтобы он автоматически отслеживал добавление в директории новых изображений.1
images
И как только они появляются там, то немедлено производил бы их сжатие при помощи плагина .1
gulp-imagemin
Для этого создам задачу мониторинга :1
watch
// Watch Task
gulp.task('watch', function() {
gulp.watch('images/*', ['compress']);
});… которую добавлю в очередь на выполнение для дефолтной задачи :1
default
// Default Task
gulp.task('default', ['watch']);Полностью листниг файла для данного случая выглядит следующим образом:1
gulpfile.js
var gulp = require('gulp'),
imagemin = require('gulp-imagemin');
// Default Task
gulp.task('default', ['watch']);
// Watch Task
gulp.task('watch', function() {
gulp.watch('images/*', ['compress']);
});
// Compress Task
gulp.task('compress', function() {
gulp.src('images/*')
.pipe(imagemin())
.pipe(gulp.dest('build/images'));
});Запускаю в консоли команду , а затем по одному добавлю в директорию 1
gulp
два файла-скриншота, созданных мною для этой статьи.1
images
Видим, что каждый раз, как в директорию был добавлен файл, Gulp запускал задачу 1
images
на выполнение:1
compress
$ gulp
Using gulpfile ~/Projects/gulp_test/gulpfile.js
Starting 'watch'...
Finished 'watch' after 8.42 ms
Starting 'default'...
Finished 'default' after 12 μs
Starting 'compress'...
Finished 'compress' after 13 ms
gulp-imagemin: Minified 7 images (saved 93.43 kB - 7.7%)
Starting 'compress'...
Finished 'compress' after 2.13 ms
gulp-imagemin: Minified 8 images (saved 103.77 kB - 8%)На выполнение первой задачи ушло 7 миллисекунд:
gulp-imagemin: Minified 7 images (saved 93.43 kB - 7.7%)… на вторую задачу - 2.13 миллисекунд:
gulp-imagemin: Minified 8 images (saved 103.77 kB - 8%)При этом я “выиграл” и 1
7.7%
размера, что скажется на скорости загрузки страницы в браузере. Также обратите внимание, что Gulp продолжает работать, находясь в фоновом режиме.1
8%
Усложним задачу для gulp-imagemin
Можно немного усложнить и усовершенствовать процесс оптимизации изображений. Для этого немного перепишу задачу таким образом:1
compress
// Compress Task
gulp.task('compress', function() {
gulp.src('images/*')
.pipe(imagemin({
progressive: true
}))
.pipe(gulp.dest('images/'));
});Первое изменение - это добавлена опция к плагину 1
progressive: true
. Эта опция управляет методом сжатия графических файлов и приведена мною для наглядности примера.1
gulp-imagemin
Второе изменение - изменена директория назначения. Теперь директория-источник изображений и директория-“выхлоп” 1
gulp.src('images/*')
, куда помещаются обработанные изображения - одна и та же.1
gulp.dest('images/')
Таким образом, достаточно положить в директорию какое-либо изображение и оно тут же преобразуется в точно такое же изображение, но меньшего размера! Удобно, не правда ли?1
images
На этом все.