Przedstawiamy libSquoosh

To Squoosh, ale jako biblioteka węzłów.

Z przyjemnością przedstawiamy libSquoosh – eksperymentalną bibliotekę węzłów, na której podstawie stworzono interfejs wiersza poleceń Squoosh. Zapewnia ona wszystkie możliwości interfejsu wiersza poleceń Squoosh z interfejsem JavaScript i idiomatycznym.

Squoosh.app to aplikacja PWA, która kompresuje obrazy w przeglądarce. Obsługuje wiele starych i nowych formatów obrazów oraz przetwarza je po stronie klienta w przeglądarce za pomocą WebAssembly. Dzięki temu zdjęcia pozostają bezpiecznie na komputerze i nie są wysyłane na serwer, a Squoosh działa nawet offline.

Na konferencji Chrome DevSummit 2020 zapowiedzieliśmy wersję 2 Squoosh w wersji 2 oraz interfejsu wiersza poleceń Squoosh, aby umożliwić przeniesienie wszystkich kodeków Squoosh do wiersza poleceń przy użyciu Node i WebAssembly. Dzięki temu możesz skompresować całe foldery za pomocą jednego polecenia i użyć interfejsu wiersza poleceń, aby wybrać parametry kodeka za Ciebie.

Interfejs wiersza poleceń umożliwia znaczną automatyzację, więc naturalne jest, że deweloperzy zaczęli prosić o bardziej idiomatyczny interfejs niż programowe wywoływanie interfejsu wiersza poleceń Squoosh za pomocą powłoki. Anton (@atjn na GitHubie) przystąpił do zadania i dzielił kod interfejsu wiersza poleceń Squoosh na 2 części: kod interfejsu wiersza poleceń i główną funkcję.

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();

Naszym celem jest zwiększenie dostępności kompresji obrazów dla autorów narzędzi. Mamy nadzieję, że uda nam się przeprowadzić integrację z pakietem Webpack, Rollup i innymi narzędziami do tworzenia, aby zapewnić odpowiednią optymalizację obrazów pod kątem internetu.

Pragnę wyrazić wielkie podziękowania za czas poświęcony Antonowi za czas, który poświęcił on swojemu Squooshowi!

Jest wciąż jeszcze wcześnie, aby korzystać z Squoosh CLI i libSquoosh, więc mamy jeszcze wiele pomysłów i planów, które chcemy zrealizować. W międzyczasie wypróbuj libSquoosh. Należy jednak pamiętać, że jest to wczesna, eksperymentalna wersja usługi i z dużym prawdopodobieństwem może w niej wystąpić błędy. Jeśli znajdziesz kilka pozycji lub masz pytania, otwórz problem.

Jeśli chcesz pomagać w pracy w Squoosh, na przykład nad ubogą dokumentacją libSquoosh lub pomocą w innych częściach aplikacji, uruchamiamy program mentorski, który pomoże Ci na początek. Aby dowiedzieć się więcej, zapoznaj się z informacjami o problemach ze śledzeniem.