webmanab.html

menu

Gulpで画像圧縮を簡単に自動化するタスクの2018年版 – 『Gulp』

 

toc

  1. ファイルを用意する
    1. 必要なパッケージをインストール
      1. _圧縮するためのパッケージ
      2. _その他のパッケージ
      3. _npm(yarn) からコマンドを叩けるように
      4. _インストール
    2. タスクを定義
      1. コマンドを実行する

        タスクランナーの gulp.js を利用して、画像の圧縮をコマンドひとつで自動化します。2018年版ということで、Node.js の v9.4.0 を利用する現時点の最新な環境でのはなしです。Node.js は nodebrew でバージョン管理しつつインストールしてください。 Yarn がインストールされていることも前提とします。

        ファイルを用意する

        以下のようなディレクトリ構造でファイルを用意します。


        ├── dist ├── src ├── package.json └── gulpfile.babel.js

        src 以下のディレクトリに圧縮前の画像、 dist に圧縮後の画像が保存されることになります。

        必要なパッケージをインストール

        圧縮に必要なパッケージを package.json からインストールするので、以下の記述をして設置します。

        package.json


        { "name": "imagesComp", "version": "1.0.0", "devDependencies": { "babel-register": "^6.26.0", "gulp": "^3.9.1", "gulp-changed": "^3.2.0", "gulp-imagemin": "^4.1.0", "gulp-notify": "^3.2.0", "imagemin-mozjpeg": "^7.0.0", "imagemin-pngquant": "^5.0.1" }, "scripts": { "images": "gulp images" }, "author": "uto usui", "license": "ISC", "description": "Task to compress images" }

        圧縮するためのパッケージ

        gulp-imagemin が圧縮に必要なパッケージで、imagemin-mozjpegimagemin-pngquant は、圧縮率を高めるのに必要なプラグインです。

        その他のパッケージ

        gulp-changed は、変更された画像だけを抽出して圧縮するために、srcdist を比較するのに必要なパッケージで、 gulp-notify はタスク終了を知らせるのに利用します。

        npm(yarn) からコマンドを叩けるように

        scripts には、Gulp のコマンドを定義しています。こうしておくとnpm run images もしくは、yarn run images でコマンドを走らせることができるので、Gulp をグローバルにインストールすることが不要になります。

        インストール

        package.json に記述した内容をインストールします。

        terminal


        sudo yarn

        タスクを定義

        gulpfile.babel.js に画像を圧縮するためのタスクを定義します。

        gulpfile.babel.js


        /** * * ディレクトリ * ├── dist ├── gulpfile.babel.js ├── package.json └── src */ const gulp = require('gulp'), docs = '.', distDir = docs + '/dist', srcDir = docs + '/src', imagemin = require('gulp-imagemin'), pngquant = require('imagemin-pngquant'), // 圧縮率を高めるのにプラグインを入れる png mozjpeg = require('imagemin-mozjpeg'), // 圧縮率を高めるのにプラグインを入れる jpg changed = require('gulp-changed'), notify = require('gulp-notify'); /** * * Compress and save the image. * Reload the browser. * * 画像を圧縮して保存。 * ブラウザを再起動する。 * */ gulp.task('images', () => { return gulp.src(srcDir + '/**/*.{png,jpg,gif,svg}') .pipe(changed(distDir)) // src と dist を比較して異なるものだけ処理 .pipe(imagemin([ pngquant({ quality: '65-80', // 画質 speed: 1, // 最低のスピード floyd: 0, // ディザリングなし }), mozjpeg({ quality: 85, // 画質 progressive: true }), imagemin.svgo(), imagemin.optipng(), imagemin.gifsicle() ])) .pipe(gulp.dest(distDir)) // 保存 .pipe(notify('🍣 images task finished 🍣')); });

        詳細はソースのコメントアウトにざっくりと書き込んだので、参考にしてください。

        コマンドを実行する

        環境の準備はできたので、src ディレクトリに画像を格納してコマンドを実行します。

        terminal


        yarn run images

        すると、


        Requiring external module babel-register Using gulpfile ~/dir/gulpfile.babel.js Starting 'images'... gulp-imagemin: Minified 1 image (saved 2.55 MB - 94.2%) gulp-notify: [Gulp notification] 🍣 images task finished 🍣 Finished 'images' after 744 ms

        こんな感じで画像が圧縮できました。

        おわります。

        Gulpで画像圧縮を簡単に自動化するタスクの2018年版 – 『Gulp』

        share

        tip