Presentamos libSquoosh

Es Squoosh, pero como una biblioteca de Node.

Nos complace presentar libSquoosh, una biblioteca de Node experimental en la cual se compila la CLI de Squoosh, que te brinda todas las capacidades de la CLI de Squoosh con una interfaz idiomática de JavaScript.

Squoosh.app es una AWP que comprime imágenes en el navegador. Admite muchos formatos de imagen antiguos y nuevos, y los procesa del lado del cliente en el navegador a través de WebAssembly. Esto significa que tus fotos permanecerán seguras en tu computadora en lugar de enviarlas a un servidor en algún lugar, y que Squoosh funciona incluso cuando está sin conexión.

En Chrome DevSummit 2020, anunciamos Squoosh v2, junto con la CLI de Squoosh para llevar todos los códecs de Squoosh a la línea de comandos mediante Node y WebAssembly. Esto te permite comprimir carpetas enteras con un solo comando y usar la CLI para permitirle elegir los parámetros del códec por ti.

La CLI permite mucha automatización, por lo que es natural que los desarrolladores hayan comenzado a solicitar una interfaz más idiomática que invocar de manera programática la CLI de Squoosh a través de la shell. Anton (@atjn en GitHub) se desempeñó en la tarea y separó el código de la CLI de Squoosh en dos partes: el código de la interfaz de línea de comandos y la funcionalidad principal subyacente.

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

Nuestro objetivo es que la compresión de imágenes sea más accesible para los autores de herramientas. Esperamos ver la integración en Webpack, Rollup y otras herramientas de compilación para asegurarnos de que tus imágenes estén optimizadas para la Web.

Me gustaría darle un gran "gracias" a Anton por el tiempo que se comprometió con Squoosh.

Aún es pronto para la CLI de Squoosh y libSquoosh, y tenemos muchas más ideas y planes que nos gustaría implementar. Mientras tanto, prueba libSquoosh. Sin embargo, ten en cuenta que esta es una versión experimental preliminar y que es muy probable que encuentres algunos errores. Si encuentras algunos problemas o tienes preguntas, abre un problema.

Si te interesa colaborar con Squoosh, por ejemplo, a la documentación extremadamente escasa sobre libSquoosh o ayuda con cualquiera de las otras partes de la app, estamos comenzando un programa de mentoría para ayudarte a dar los primeros pasos. Si deseas obtener más información, consulta nuestro problema de seguimiento.