Самый простой способ оптимизировать скорость страницы, не нарушая всего

Я пообещал себе, что больше не буду участвовать в учебных курсах по Gulp; Task Runners - не самая сексуальная тема в мире, и есть вероятность, что если вы добрались до этого блога, вы либо укрепили конвейер CI / CD для запуска программного обеспечения, либо он вам просто не нужен . На этот раз мы сделаем исключение, потому что gulp-imagemin особенно хорош.

Imagemin - это отдельная библиотека Node, которая также поставляется с CLI и, конечно же, с плагином Gulp. Короче говоря, imagemin сжимает изображения в заданном каталоге и достаточно умен, чтобы распознавать уже сжатые изображения. Это огромно, потому что мы можем опрометчиво сказать imagemin сжимать одну и ту же папку с изображениями сотни раз, и каждое изображение будет сжато только один раз.

В этом руководстве мы возьмем gulp-imagemin и создадим задачу для сжатия изображений в сложных структурах папок.

Использование Imagemin для сложных структур папок

Мы, вероятно, уже упоминали об этом один или два раза раньше, но этот блог является темой, работающей в стеке Призраков. Особенность Ghost (и, вероятно, любой другой платформы для ведения блогов) заключается в том, что он хранит контент в иерархии папок на основе даты. / images выглядит так:

/images
├─ /2017
│  └─ 01
│  └─ 02
│  └─ 03
│  └─ 04
│  └─ 05
│  └─ 06
│  └─ 07
│  └─ 08
│  └─ 09
│  └─ 10
│  └─ 11
│  └─ 12
└─ /2018
   └─ 01
   └─ 02
   └─ 03
   └─ 04
   └─ 05
   └─ 06
   └─ 07
   └─ 08
   └─ 09
   └─ 10
   └─ 11

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

Запуск нашего Gulpfile

Давайте начнем с изучения основных библиотек, необходимых для этого:

var gulp = require('gulp'),
  imagemin = require('gulp-imagemin'),
  fs = require('fs'),
  path = require('path');

gulp-imagemin - это основной плагин Gulp, который нам нужен для сжатия наших изображений, но на самом деле он бесполезен сам по себе - нам также нужно импортировать plugins-for-a-plugin; gulp-imagemin требует отдельного плагина для каждого типа изображения, которое нам нужно выразить.

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

Плагины Imagemin

Как уже упоминалось, у самого imagemin есть плагины для каждого типа изображения: требуются только те, которые, по вашему мнению, вам понадобятся:

var gulp = require('gulp'),
  imagemin = require('gulp-imagemin'),
  imageminWebp = require('imagemin-webp'),
  imageminJpegtran = require('imagemin-jpegtran'),
  imageminPngquant = require('imagemin-pngquant'),
  imageminGifSicle = require('imagemin-gifsicle'),
  imageminOptiPng = require('imagemin-optipng'),
  imageminSvgo = require('imagemin-svgo'),
  fs = require('fs'),
  path = require('path');

Чтобы не усложнять этот урок, мы ограничим наш вариант использования файлами JPG.

Особо следует отметить WebP: сжатие изображений следующего поколения для Интернета, которое якобы предлагает наилучшее качество изображения при наименьшем доступном размере файла.

Давайте начнем

Некоторым людям (в том числе и мне) нравится указывать пути к своим активам как одну переменную в своем Gulpfile. Это еще более актуально в случае использования Ghost, когда изображения находятся в файловой структуре, совершенно отличной от той, в которой находится наш Gulpfile.

var gulp = require('gulp'),
  imagemin = require('gulp-imagemin'),
  imageminJpegtran = require('imagemin-jpegtran'),
  fs = require('fs'),
  path = require('path');
var paths = {
  styles: {
    src: 'src/less/*.less',
    dest: 'assets/css'
  },
  scripts: {
    src: 'src/js/*.js',
    dest: 'assets/js'
  },
  html: {
    src: 'views/*.hbs',
    dest: 'assets/'
  },
  images: {
    src: '/var/www/my-theme/content/images/2018/',
    dest: '/var/www/my-theme/content/images/2018/'
  }
};

Цикл по папкам

Нам нужно заглянуть в нашу папку / images, чтобы рекурсивно найти все папки, содержащие изображения. Ссылаясь на путь к изображению, который мы указали в путях, мы создадим массив целевых папок:

function image_loop() {
  var folder_arr = []
  fs.readdir(paths.images.src, function(err, folders) {
    for(var i =0; i < folders.length; i++){
      var folder_path = path.join(paths.images.src, folders[i]);
      folder_arr.push(folder_path);
    }
    for(var i =0; i < folder_arr.length; i++) {
        images(folder_arr[i]);
    }
  });
}

fs.readdir() - это метод, который возвращает содержимое любого каталога. Мы создадим функцию под названием image_loop, которая перебирает все папки в целевом каталоге, а затем вызовет другую функцию для сжатия содержимого:

function image_loop() { fs.readdir(paths.images.src, function(err, folders) { for(var i =0; i < folders.length; i++){ var folder_path = path.join(paths.images.src, folders[i]); images(folders[i]); } }); }

Сжатие изображений в каждой папке

image_loop вызывает функцию images один раз для каждой папки для сжатия содержимого каждой папки. Вот где мы на самом деле можем использовать imagemin:

function image_loop() {
  fs.readdir(paths.images.src, function(err, folders) {
    for(var i =0; i < folders.length; i++){
      var folder_path = path.join(paths.images.src, folders[i]);
      images(folders[i]);
    }
  });
}

Достаточно просто, все, что мы делаем, это:

  • Поиск файлов с расширением .jpg в каждой папке.
  • Запуск imageminJpegtran для сжатия каждого файла JPG
  • Укажите подробный, который выводит результат на консоль (например: «Минимизировано 0 изображений»).
  • Запись файлов в место назначения (которое совпадает с источником, таким образом перезаписывая наши файлы)

Положил все это вместе

var gulp = require('gulp'),
  imagemin = require('gulp-imagemin'),
  imageminJpegtran = require('imagemin-jpegtran'),
  fs = require('fs'),
  path = require('path');
var paths = {
  styles: {
    src: 'src/less/*.less',
    dest: 'assets/css'
  },
  scripts: {
    src: 'src/js/*.js',
    dest: 'assets/js'
  },
  html: {
    src: 'views/*.hbs',
    dest: 'assets/'
  },
  images: {
    src: '/var/www/my-theme/content/images/2018/',
    dest: '/var/www/my-theme/content/images/2018/'
  }
};
function images(folder_path) {
  return gulp.src(folder_path + '/*.jpg')
  .pipe(imagemin(
    [imageminJpegtran({progressive: true})],
    {verbose: true}
  ))
  .pipe(gulp.dest(paths.images.dest));
}
function image_loop() {
  fs.readdir(paths.images.src, function(err, folders) {
    for(var i =0; i < folders.length; i++){
      var folder_path = path.join(paths.images.src, folders[i]);
      images(folders[i]);
    }
  });
}
var build = gulp.parallel(styles, scripts, image_loop);
gulp.task('default', build);

И вот оно; Gulpfile, который сжимает ваши изображения, не требуя повторного связывания.

Если вас интересует imagemin или дальнейшая оптимизация своего сайта, я настоятельно рекомендую недавно анонсированную Google бета-версию https://web.dev. Это отличный ресурс для проверки возможностей вашего сайта в скорости, поисковой оптимизации и многом другом.

Первоначально опубликовано на сайте hackersandslackers.com 19 ноября 2018 г.