libSquoosh の概要

Node ライブラリとしての Squoosh です。

このたび、Squoosh CLI が構築された試験運用版の Node ライブラリである libSquoosh を導入いたしました。これにより、JavaScript の慣用的なインターフェースで Squoosh CLI のすべての機能を利用できるようになります。

Squoosh.app は、ブラウザで画像を圧縮する PWA です。新旧の多くの画像形式をサポートし、WebAssembly を介してブラウザでクライアント側で処理します。つまり、写真がどこかのサーバーに送信されるのではなく、自分のパソコン上に安全に保管され、Squoosh はオフラインでも動作します。

Chrome DevSummit 2020 で、Squoosh v2 と Squoosh CLI について発表しました。これにより、Node と WebAssembly を使用して Squoosh のすべてのコーデックをコマンドラインで利用できるようになります。これにより、1 つのコマンドでフォルダ全体を圧縮し、CLI を利用してコーデック パラメータを選択させることができます。

CLI は多くの自動化を可能にするため、開発者がシェルから Squoosh CLI をプログラムで呼び出すよりも、より慣用的なインターフェースを求めるのは自然なことです。Anton(GitHub で @atjn)がタスクに取り組み、Squoosh CLI コードをコマンドライン インターフェース コードと基盤となるコア機能の 2 つの部分に分割しました。

import { ImagePool } from "@squoosh/lib";

// libSquoosh uses a worker-pool under the hood
// to parallelize all image processing.
const imagePool = new ImagePool();

// Accepts both file paths and Buffers/TypedArrays.
const image = imagePool.ingestImage("./squoosh.jpeg");

// Optional.
// await image.preprocess({
//   resize: {
//     enabled: true,
//     width: 128,
//   },
// });

await image.encode({
  // All codecs are initialized with default values
  // that can be individually overwritten.
  mozjpeg: {
    quality: 10,
  },
  avif: {
    cqLevel: 10,
  },
  jxl: {},
});

const { extension, binary } = await image.encodedWith.mozjpeg;
await fs.writeFile(`output.${extension}`, binary);
// ... same for other encoders ...

await imagePool.close();

Google の目標は、ツール作成者が画像圧縮を利用しやすくすることです。Webpack、Rollup、その他のビルドツールとの統合により、画像がウェブに合わせて適切に最適化されることを期待しています。

Anton が Squoosh に取り組んだことに、心から「感謝」の意を表したいと思います。

Squoosh CLI と libSquoosh はまだ初期段階にあり、実装したいアイデアや計画は他にもたくさんあります。当面は libSquoosh をお試しください。ただし、これは早期の試験運用版リリースであり、バグが発生する可能性が高いことにご注意ください。問題が見つかった場合やご不明な点がある場合は、問題としてご報告ください。

libSquoosh に関する非常に少ないドキュメントへの貢献や、アプリの他の部分のサポートなど、Squoosh への貢献に関心をお持ちの場合、Google では、始めるのに役立つメンターシップ プログラムを開始しています。詳しくは、トラッキングに関する問題をご覧ください。