imagemin-jpegtran、imagemin-mozjpeg、imagemin-pngquant、imagemin-webp は、それぞれ JPEG、PNG、WebP 形式の画像を圧縮・最適化するための imagemin プラグインです。一方、sharp は高性能な画像処理ライブラリで、リサイズ、フォーマット変換、圧縮など多機能な操作をサポートしています。これらはすべて Node.js 環境で静的アセットのビルド時に使用され、バンドルサイズ削減や Web パフォーマンス向上に貢献します。
フロントエンド開発において、画像の最適化は Core Web Vitals 向上や UX 改善に直結する重要なタスクです。imagemin-* シリーズと sharp はどちらも Node.js で画像処理を行う代表的な選択肢ですが、アーキテクチャや用途が大きく異なります。この記事では、実際のコードを交えながら、それぞれの特性と使いどころを解説します。
imagemin プラグイン群(imagemin-jpegtran など)は、共通の imagemin コアに接続する形で動作します。各プラグインは特定のフォーマットに特化しており、組み合わせて使う必要があります。
// imagemin + 複数プラグイン
const imagemin = require('imagemin');
const imageminJpegtran = require('imagemin-jpegtran');
const imageminPngquant = require('imagemin-pngquant');
(async () => {
await imagemin(['images/*.{jpg,png}'], {
destination: 'build/images',
plugins: [
imageminJpegtran(),
imageminPngquant({ quality: [0.6, 0.8] })
]
});
})();
一方、sharp は単一の API で全フォーマットをカバーします。入力画像の形式を自動判別し、出力形式や処理内容をメソッドチェーンで指定できます。
// sharp(統合型)
const sharp = require('sharp');
(async () => {
await sharp('input.jpg')
.jpeg({ quality: 80 })
.toFile('output.jpg');
await sharp('input.png')
.webp({ quality: 75 })
.toFile('output.webp');
})();
💡 ポイント:
imageminは「フォーマットごとに最適なツールを組み合わせる」思想、sharpは「一つの高速エンジンで全部やる」思想です。
imagemin-jpegtran:可逆圧縮の限界jpegtran は JPEG のメタデータ削除やハフマンテーブル最適化により、画質を維持したままサイズを削減します。ただし、圧縮率は modest(通常 5〜10%)です。
const imagemin = require('imagemin');
const imageminJpegtran = require('imagemin-jpegtran');
await imagemin(['*.jpg'], {
plugins: [imageminJpegtran()]
});
⚠️ 注意:このパッケージは GitHub リポジトリがアーカイブされており、メンテナンスされていません。新規プロジェクトでの使用は避けてください。
imagemin-mozjpeg:高圧縮 lossy JPEGmozjpeg はプログレッシブ JPEG やトレリス量子化を活用し、画質低下を最小限に抑えつつ 30〜60% のサイズ削減を実現します。
const imageminMozjpeg = require('imagemin-mozjpeg');
await imagemin(['*.jpg'], {
plugins: [
imageminMozjpeg({ quality: 75 })
]
});
sharp:柔軟な JPEG 制御sharp ではプログレッシブ出力やモアレ低減オプションも指定可能です。
await sharp('input.jpg')
.jpeg({
quality: 75,
progressive: true,
mozjpeg: true
})
.toFile('output.jpg');
imagemin-pngquant:8 ビット PNG への変換フルカラー PNG を 256 色以下のパレットに変換し、ファイルサイズを 60〜80% 削減します。透明度(alpha チャンネル)も保持可能です。
const imageminPngquant = require('imagemin-pngquant');
await imagemin(['*.png'], {
plugins: [
imageminPngquant({
quality: [0.6, 0.8],
speed: 1 // 高品質モード
})
]
});
sharp:PNG 圧縮オプションsharp も同様の機能を提供しますが、パレット最適化は pngquant ほど洗練されていません。
await sharp('input.png')
.png({
compressionLevel: 9,
adaptiveFiltering: true
})
.toFile('output.png');
💡 実測では、イラスト系画像では
imagemin-pngquantの方が 20〜30% 小さくなる傾向があります。
imagemin-webp:シンプルな変換既存の JPEG/PNG を WebP に変換します。lossy と lossless の両方をサポート。
const imageminWebp = require('imagemin-webp');
await imagemin(['*.jpg'], {
plugins: [
imageminWebp({ quality: 80 })
]
});
sharp:高度な WebP 制御WebP のメタデータやアニメーション対応など、より詳細な設定が可能です。
await sharp('input.jpg')
.webp({
quality: 80,
lossless: false,
alphaQuality: 90
})
.toFile('output.webp');
imagemin プラグイン:各プラグインが個別のバイナリ(例:jpegtran、pngquant)に依存。npm install 時に OS 固有のビルドが必要になる場合があり、Docker や CI 環境でトラブルが発生しやすいです。sharp:事前ビルド済みの libvips バイナリを含んでおり、ほとんどの環境で追加設定不要で動作。処理速度も libvips の並列処理により非常に高速です。ベンチマーク(100 枚の JPEG 処理)では、sharp が imagemin-mozjpeg より 2〜3 倍高速という結果も報告されています。
sharp 推奨)複数サイズのサムネイルを一括生成するケースでは、sharp のメソッドチェーンが圧倒的に簡潔です。
const sizes = [320, 640, 1024];
for (const width of sizes) {
await sharp('original.jpg')
.resize(width)
.jpeg({ quality: 80 })
.toFile(`thumb-${width}.jpg`);
}
imagemin で同様の処理を行うには、別途リサイズツール(例:jimp)と組み合わせる必要があり、処理が分断されます。
Vite や Webpack と連携する場合:
imagemin:vite-plugin-imagemin や image-minimizer-webpack-plugin といったラッパープラグインが充実。sharp:直接 API を呼び出すカスタムプラグインを書く必要があるが、柔軟性は高い。| ユースケース | 推奨パッケージ |
|---|---|
| 新規プロジェクトで包括的な画像処理が必要 | sharp |
| 既存の imagemin ワークフローを維持 | imagemin-mozjpeg + imagemin-pngquant |
| PNG アイコンの極限まで軽量化 | imagemin-pngquant |
| WebP 変換のみ行いたい | imagemin-webp または sharp |
| 可逆 JPEG 圧縮(非推奨) | imagemin-jpegtran(代わりに sharp の lossless WebP を検討) |
sharp を第一候補に:高速、多機能、メンテナンスが活発。imagemin-jpegtran は使用しない:非推奨であり、mozjpeg や WebP の方が圧縮率が高い。<picture> 要素で JPEG/PNG とのフォールバックを必ず実装。画像最適化は「一度設定すれば終わり」ではなく、コンテンツ更新や新フォーマット登場に応じて見直しが必要です。柔軟で将来性のある sharp を中心に、必要に応じて imagemin プラグインを補完的に使うのが、現代的なフロントエンド開発のベストプラクティスと言えるでしょう。
imagemin-jpegtran は lossless(可逆)JPEG 圧縮に特化しており、画質を一切落とさずにファイルサイズを削減したい場合に適しています。ただし、このパッケージは開発が停止されており、新しいプロジェクトでは代替手段を検討すべきです。特にモダンな JPEG 圧縮が必要な場合は imagemin-mozjpeg や sharp の利用を推奨します。
imagemin-mozjpeg は画質をわずかに犠牲にして大幅なファイルサイズ削減を実現する lossy(非可逆)JPEG 圧縮に最適です。ブログや e コマースサイトなど、多数の JPEG を扱うプロジェクトで効果を発揮します。ただし、Node.js ネイティブアドオンのビルドが必要なため、CI/CD 環境での設定に注意が必要です。
imagemin-pngquant は PNG 画像を 8 ビットカラーパレットに変換することで、ファイルサイズを劇的に削減します。透明度を保ちつつ軽量化したいアイコンやイラストに最適ですが、写真のようなグラデーションが多い画像には不向きです。圧縮レベルを調整可能で、品質とサイズのバランスを細かく制御できます。
imagemin-webp は JPEG や PNG を WebP 形式に変換するプラグインです。モダンブラウザ向けに高圧縮率を実現したい場合に有効ですが、Safari などの古いブラウザとの互換性を考慮する必要があります。通常は元画像と並行して WebP 版を生成し、HTML で <picture> 要素を使って切り替える運用が一般的です。
sharp は単一のライブラリで JPEG、PNG、WebP、AVIF など複数フォーマットに対応し、リサイズ、トリミング、圧縮、フォーマット変換を高速に行えます。ビルドパイプライン全体で統一された画像処理を実現したい場合や、高度な操作(例:レスポンシブ画像生成)が必要な場合に最適です。libvips に基づく高速処理が特徴で、大規模プロジェクトでも安定して動作します。
jpegtran imagemin plugin
$ npm install --save imagemin-jpegtran
const imagemin = require('imagemin');
const imageminJpegtran = require('imagemin-jpegtran');
(async () => {
await imagemin(['images/*.jpg'], {
destination: 'build/images',
plugins: [
imageminJpegtran()
]
});
console.log('Images optimized');
})();
Returns a promise for a buffer.
Type: object
Type: boolean
Default: false
Lossless conversion to progressive.
Type: boolean
Default: false
Use arithmetic coding.
Type: buffer
Buffer to optimize.