Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/nitedani/img-optimizer

img-optimizer aims to provide a subset of next/image as an independent library, easy to integrate with your favorite tools.
https://github.com/nitedani/img-optimizer

image-optimization

Last synced: 3 months ago
JSON representation

img-optimizer aims to provide a subset of next/image as an independent library, easy to integrate with your favorite tools.

Awesome Lists containing this project

README

        

# img-optimizer

img-optimizer aims to provide a subset of [next/image](https://nextjs.org/docs/api-reference/next/image) as an independent library, easy to integrate with your favorite tools. img-optimizer
delivers compressed images to the browser on demand. It prioritizes the [avif](https://caniuse.com/avif) format when the browser supports it, falling back to [webp](https://caniuse.com/webp).


Integration examples:
- [Express](./examples/express/)
- [Rakkas](./examples/rakkas/)
- [vite-plugin-ssr](./examples/vite-plugin-ssr/)

Integration guide:

1. Add a server-side request handler for "/img-optimizer":
```ts
import express from "express";
import { createOptimizer } from "img-optimizer/server";

const app = express();
app.use(express.static("public"));
const optimize = createOptimizer({
domains: ["some.domain.com"]
});

app.get("/img-optimizer", async (req, res, next) => {
const result = await optimize({
url: req.url,
headers: req.headers,
});
const { body, status, headers } = result;
res.status(status).header(headers).send(body);
});

app.listen(3000, () => {
console.log("Listening on http://localhost:3000");
});
```

2. Use it on the client/server render:

Simple JS:
```JS
import { createSrcSet } from "img-optimizer";
`


`
```

With React:
```ts
import image from "./test-8k.jpg";
import { Image } from "img-optimizer-react";

export function Page() {
return (
<>


>
);
}
```

### Usage with build tools (webpack, vite):
This library requires the Sharp native dependecies to be present at runtime. There are utilities for both webpack and vite that handle this for you.

- [Vite example](https://github.com/nitedani/vite-plugin-standalone/tree/main/examples/sharp)

- [Webpack](https://github.com/vercel/webpack-asset-relocator-loader)

createOptimizer options:
- cacheSizeMb?: number
img-optimizer caches the compressed images. This option sets the upper limit of the cache size in megabytes.
- sizes?: number[]
img-optimizer can be restricted to only serve specific sizes(width). If the size is not allowed, a 400 bad response will be returned. default: [360, 640, 1024, 1280, 1600, 1920, 2560, 3840]
- formats?: Format[]
default: [
{
format: 'avif',
quality: 45
},
{
format: 'webp',
quality: 65
}
]
- domains?: string[] | true
the domains configuration can be used to provide a list of allowed hostnames for external images. Setting it to true removes the restriction.