今回は次世代フォーマットのWEBPについて紹介します。
ほとんどのブラウザで対応されているので、サイトを快適に見れるようにする施策として今後取り入れていった方がいい内容と思いますが、まだ次世代フォーマットに慣れていない方などは以前に紹介した画像圧縮方法と一緒に使用されて徐々に次世代フォーマットにスイッチしていくのも一つの手です。
必要なプラグインのインストール
まず、以下のコマンドで必要なプラグインをインストールしてください。
npm install --save-dev gulp gulp-plumber gulp-notify gulp-webp gulp-rename fancy-log path
gulpfile.mjs
以下のコードをgulpfile.mjs
として保存してください。
import gulp from 'gulp'; // gulpをインポート
const { series, src, dest } = gulp; // series, src, destがそのまま使えるように
import plumber from 'gulp-plumber'; // エラーが発生してもタスクを停止しない
import notify from 'gulp-notify'; // エラー発生時にデスクトップ通知を行う
import webp from 'gulp-webp'; // 画像ファイルをWEBPに変換する
import rename from 'gulp-rename'; // ファイル名を変更する
import log from 'fancy-log'; // ログを抑制するためのモジュール
import path from 'path'; // パス操作用
// 参照元パス
const srcPath = {
img: 'src/image/**/*.{png,jpg}', // 画像ファイルのソース
};
// 出力先パス
const destPath = {
img: 'dist/image', // 画像ファイルの出力先
};
// 画像をWEBPに変換するタスク
const convertToWebP = () => (
src(srcPath.img, { encoding: false }) // 画像ファイルのソース
.pipe(plumber({
errorHandler: (err) => {
notify.onError({
title: `Gulp error in ${err.plugin}`,
message: err.toString()
})(err);
}
})) // エラー時に通知
.pipe(rename((filePath, file) => {
filePath.basename += filePath.extname; // ファイル名に元の拡張子を追加
filePath.dirname = path.relative(file.base, path.dirname(file.path)); // 元のディレクトリ構造を保持
}))
.pipe(webp({ quality: 85 })) // WEBPに変換
.pipe(dest(destPath.img))
);
// デフォルトタスク(Gulpを実行した際に動くタスク)
export default series(convertToWebP);
各ステップの解説
- src(srcPath.img, { encoding: false }):
- 画像ファイルのソースを指定します。
srcPath.img
は、src/image/**/*.{png,jpg}
と定義されており、これらの拡張子を持つすべての画像ファイルが対象になります。 encoding: false
を指定することで、ファイルのエンコーディングを無効にし、画像ファイルが破損しないようにしています。
- 画像ファイルのソースを指定します。
- pipe(plumber({…})):
plumber
を使って、エラーが発生してもタスクを停止しないようにします。notify.onError
を設定することで、エラーが発生した場合にデスクトップ通知を行います。この設定により、エラーの詳細情報を通知します。
- pipe(rename((filePath, file) => {…})):
rename
を使って、ファイル名に元の拡張子を追加します。filePath.basename += filePath.extname
は、ファイル名に元の拡張子を追加するコードです。例えば、example.jpg
がexample.jpg.webp
になります。filePath.dirname = path.relative(file.base, path.dirname(file.path))
は、元のディレクトリ構造を保持するためのコードです。
- pipe(webp({ quality: 85 })):
webp
プラグインを使って画像をWEBP形式に変換します。quality: 85
は、変換後のWEBP画像の品質を設定します。この場合、品質を85に設定しています。
- pipe(dest(destPath.img)):
- 変換後のWEBP画像を出力先ディレクトリ(
dist/image
)に保存します。
- 変換後のWEBP画像を出力先ディレクトリ(
JavaScriptでWEBPに自動振替するサンプルコード
以下のJavaScriptコードを使用して、WEBP対応ブラウザで自動的にWEBP画像に振替えることができます。
function supportsWebP(callback) {
var webP = new Image();
webP.onload = webP.onerror = function () {
callback(webP.height == 2);
};
webP.src = "data:image/webp;base64,UklGRhYAAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=";
}
supportsWebP(function (supported) {
if (supported) {
document.querySelectorAll('img').forEach(img => {
var src = img.src;
if (src.endsWith('.jpg') || src.endsWith('.png')) {
img.src += '.webp';
}
});
}
});
現在のWEBP対応ブラウザ一覧
- Google Chrome (17+)
- Firefox (65+)
- Edge (18+)
- Opera (11+)
- Safari (14+)
まとめ
以上が、Gulpを使って画像をWEBP形式に変換する方法の解説です。
同じ名前のPNGとJPEGが重ならないようにする設定や、WEBP対応ブラウザでの自動振替方法にも対応してありますので画像の最適化を効率的に行うことができるようになります。
まだ私自身も試用段階といった形なので、よりよい方法などありましたら教えていただけたら嬉しいです。