0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

脆弱性のないGulp画像圧縮プラグインを公開しました

0
Last updated at Posted at 2025-07-20

Gulpで画像を圧縮するプラグインといえば、gulp-imagemin が有名ですが、インストールするたびに、たくさんの脆弱性が表示されることが懸念でした。

そこで、sharpとsvgoを使用して画像を圧縮する、Gulpのプラグインを開発し、公開しました。現バージョンではjpeg、png、web、svgの圧縮に対応しています。なお、他のファイルは圧縮せずにスキップします。

インストール方法

npm install --save-dev @yohacoo/gulp-image-compress

使い方

import gulp from 'gulp';
import imageCompress from '@yohacoo/gulp-image-compress';

function compressImages(cb) {
  gulp
    .src('src/images/**/*', { encoding: false })
    .pipe(imageCompress())
    .pipe(gulp.dest('dist/images'));
  cb();
}

export default compressImages;

Gulp 5からは、gulp.srcに { encoding: false } をつけてください。そうしないと unsupported image format エラーになります。

オプション付きの例

import gulp from 'gulp';
import imageCompress from '@yohacoo/gulp-image-compress';

function compressImages(cb) {
  gulp
    .src('src/images/**/*', { encoding: false })
    .pipe(
      imageCompress({
        jpeg: { quality: 85, progressive: true },
        png: { quality: 85, progressive: true },
        webp: { quality: 85, alphaQuality: 85 },
        svg: {
          plugins: [
            {
              name: 'preset-default',
              params: {
                overrides: {
                  cleanupIds: false,
                },
              },
            },
            'removeDimensions',
          ],
        },
        allowLargerOutput: true,
        verbose: true,
      })
    )
    .pipe(gulp.dest('dist/images'));
  cb();
}

export default compressImages;

このプラグインはsharpを使って画像を圧縮し、svgoで最適化を行なっています。jpeg、png、webp の各オプションは、そのままsharpに渡されます。同様に svg オプションはsvgoに渡されます。この例では、svgoの preset-default をカスタマイズしています。cleanupIds プラグインをオフに、 removeDimensions プラグインをオンにしています。

verbose をtrueに設定すると、各ファイルの圧縮結果を表示します。

注意事項

シャープによる画像圧縮を行なった結果、元のファイルサイズより大きくなる場合、このプラグインは圧縮結果ではなく、元のファイルをそのまま出力します。この動作を変更したい場合は、options.allowLargerOutput をtrueに設定してください。

API

imageCompress(options?)

options

パラメータ 型 デフォルト 説明
[options] object 圧縮オプション
[options.jpeg] object { quality: 80 } sharpに渡すjpegオプション
[options.png] object { quality: 80 } sharpに渡すpngオプション
[options.webp] object { quality: 80 } sharpに渡すwebpオプション
[options.svg] object { plugins: [ { name: 'preset-default' } ] } svgoに渡すsvgオプション、デフォルトは preset-default
[options.allowLargerOutput] boolean false 元のファイルより大きい出力を許可するかどうか
[options.verbose] boolean false 各画像の圧縮結果をログ出力するかどうか
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?