はじめに
画像はそのまま使用すると容量が大きすぎるため画像を圧縮して使用する必要があります。
かといって手動で画像圧縮するのも面倒ですよね。
今回はgulp-imageminというプラグインを使って画像を圧縮する方法について説明していきます。
その他gulpのおすすめのプラグインはこちら
gulpの使い方まとめについてはこちら。
gulpfile.jsのテンプレート紹介についてはこちら。
それではgulpを使って画像を圧縮する説明をします。
解決できること
画像の圧縮をするだけであればTinyPNG等のオンラインのサービスを使うだけで事足ります。
しかし画像の数が何十、何百にもなればオンラインサービスを使って圧縮を行うのにも一苦労です。
gulpを使えば大量の画像でも手軽に圧縮をすることができます。
今回は以下4つのプラグインを使って画像の圧縮をしていきます。
プラグイン名 | 内容 |
gulp-imagemin | 画像を圧縮する |
imagemin-mozjpeg | .jpegを圧縮できるようにする |
imagemin-pngquant | .pngの圧縮率が高い |
gulp-changed | 圧縮済みの画像ファイルに対して再度画像を圧縮しないようにする |
ディレクトリ構成
今回のディレクトリ構成は下記になります。
test
├ node_modules
├ dist
│ └ image
├ src
│ └ image
│ ├ sample.gif
│ ├ sample.png
│ └ sample.jpg
├ gulpfile.js
├ package-lock.json
└ package.json
src/image の中に圧縮前の画像ファイル入れます。
gulp-imageminプラグインを使ってdist/image に圧縮後の画像ファイルを出力します。
gulp-imageminをインストールする
それではgulp-imageminをインストールしていきましょう。
npm i -D gulp-imagemin
画像を圧縮するためのプラグインをインストールします。
// CommonJS形式で記述する場合 (本記事はこちら)
npm i -D gulp-imagemin@7.1.0
// ES Module形式で記述する場合
npm i -D gulp-imagemin
gulp-imagemin公式
プラグインのインストールが完了したらgulpfile.jsを編集していきましょう。
//----------------------------------------------------------------------
// モード
//----------------------------------------------------------------------
"use strict";
//----------------------------------------------------------------------
// モジュール読み込み
//----------------------------------------------------------------------
const gulp = require("gulp");
const { src, dest, series, parallel, watch } = require("gulp");
const imageMin = require("gulp-imagemin");
//----------------------------------------------------------------------
// 関数定義
//----------------------------------------------------------------------
function imagemin(done) {
src("./src/image/**")
.pipe(
imageMin([
imageMin.svgo(),
imageMin.optipng(),
imageMin.gifsicle({ optimizationLevel: 3 }),
])
)
.pipe(dest("./dist/image/"));
done();
}
//----------------------------------------------------------------------
// タスク定義
//----------------------------------------------------------------------
exports.imagemin = imagemin;
/************************************************************************/
/* END OF FILE */
/************************************************************************/
imageminプラグインを追加インストールしよう
上記コードのまま使用してもいいのですが、.jpeg に対応していなかったり.png の圧縮率が低かったりします。
それらを補うimageminプラグインを追加でインストールしていきましょう。
npm i -D imagemin-mozjpeg imagemin-pngquant
こちらがimageminのプラグインです。
.jpeg の圧縮ができるようになるプラグインと.png の圧縮率が高いプラグインです。
こちらもimagemin-mozjpegはバージョンによって記述が違いますので、ご自身の環境に合わせてインストールしてください。
// CommonJS形式で記述する場合 (本記事はこちら)
npm i -D imagemin-mozjpeg@9.0.0 imagemin-pngquant
// ES Module形式で記述する場合
npm i -D imagemin-mozjpeg imagemin-pngquant
imagemin-mozjpeg 公式
imagemin-pngquant公式
それでは追加したプラグインを使用したいので、gulpfile.jsを編集していきましょう。
//----------------------------------------------------------------------
// モード
//----------------------------------------------------------------------
"use strict";
//----------------------------------------------------------------------
// モジュール読み込み
//----------------------------------------------------------------------
const gulp = require("gulp");
const { src, dest, series, parallel, watch } = require("gulp");
const imageMin = require("gulp-imagemin");
const mozjpeg = require("imagemin-mozjpeg"); // 追加
const pngquant = require("imagemin-pngquant"); // 追加
//----------------------------------------------------------------------
// 関数定義
//----------------------------------------------------------------------
function imagemin(done) {
src("./src/image/**")
.pipe(
imageMin([
pngquant({ // 追加
quality: [0.6, 0.7],
speed: 1,
}),
mozjpeg({ quality: 65 }), // 追加
imageMin.svgo(),
imageMin.optipng(),
imageMin.gifsicle({ optimizationLevel: 3 }),
])
)
.pipe(dest("./dist/image/"));
done();
}
//----------------------------------------------------------------------
// タスク定義
//----------------------------------------------------------------------
exports.imagemin = imagemin;
/************************************************************************/
/* END OF FILE */
/************************************************************************/
gulp-changedで再圧縮の処理時間を無くそう
ここまでで画像を圧縮するための記述が完了しました。
続いて画像の再圧縮を無くして画像圧縮全体の処理時間を減らすプラグインをインストールしていきましょう。
npm i -D gulp-changed
gulp-changedをインストールします。
npm i -D gulp-changed
distフォルダ を監視し、圧縮済みの画像ファイルに対して再度画像を圧縮させないようにします。
gulp-changed 公式
それではgulp-changedをgulpfile.jsに反映させていきましょう。
//----------------------------------------------------------------------
// モード
//----------------------------------------------------------------------
"use strict";
//----------------------------------------------------------------------
// モジュール読み込み
//----------------------------------------------------------------------
const gulp = require("gulp");
const { src, dest, series, parallel, watch } = require("gulp");
const imageMin = require("gulp-imagemin");
const mozjpeg = require("imagemin-mozjpeg");
const pngquant = require("imagemin-pngquant");
const changed = require("gulp-changed"); // 追加
//----------------------------------------------------------------------
// 関数定義
//----------------------------------------------------------------------
function imagemin(done) {
src("./src/image/**")
.pipe(changed("./dist/image/")) // 追加
.pipe(
imageMin([
pngquant({
quality: [0.6, 0.7],
speed: 1,
}),
mozjpeg({ quality: 65 }),
imageMin.svgo(),
imageMin.optipng(),
imageMin.gifsicle({ optimizationLevel: 3 }),
])
)
.pipe(dest("./dist/image/"));
done();
}
//----------------------------------------------------------------------
// タスク定義
//----------------------------------------------------------------------
exports.imagemin = imagemin;
/************************************************************************/
/* END OF FILE */
/************************************************************************/
コマンドを実行しよう
以下コマンドを実行しましょう。
npx gulp imagemin
「npx」のコマンド使用時にエラーが出る方はこちらを参照してください。
gulpのインストール先が異なる可能性があります。
以下のようになれば画像が圧縮されています。
[00:00:00] Starting 'imagemin'...
[00:00:00] Finished 'imagemin' after 351 ms
[00:00:00] gulp-imagemin: Minified 3 images (saved 725 kB - 26.3%)
おわりに
以上gulp-imageminを使って画像を圧縮する方法を説明しました。
いかがだったでしょうか。
画像を手動で圧縮するのが手間に感じるようであれば、gulpで自動圧縮することも検討してみてください。
コメント