Skip to content

Astro integration for image compression and conversion, superseding Astro's default image service.

License

Notifications You must be signed in to change notification settings

risu729/astro-better-image-service

Repository files navigation

🚀 astro-better-image-service

astro-better-image-service is an Astro integration for image compression and conversion, superseding Astro's default image service.

🖼️ Features

  • Compress raster images with the maximum compression ratio using sharp.
  • Compress SVG images using svgo.
  • Convert SVG images to raster images using sharp.
  • And, of course, all features of Astro's default image service (sharpImageService) are supported.

⚙️ Installation

Using astro add (recommended)

Run the following command and it will automatically install the package and add the integration to your astro.config.{ts,js,mjs,cjs} file.

bun astro add astro-better-image-service
npx astro add astro-better-image-service

Manually

  1. Add this npm package to dependencies.
bun add astro-better-image-service
npm install astro-better-image-service
  1. Edit your Astro configuration file to include the integration.

astro.config.{ts,js,mjs,cjs}

import betterImageService from "astro-better-image-service";

export default {
  // ...
  integrations: [
    // ... other integrations
    betterImageService(),
    // ... other integrations
  ],
  // ...
};

You may put the betterImageService integration anywhere in the integrations array.
Please note that this integration cannot be used with other integrations using the Image Service API. (I haven't seen any yet.)

❓ How it works

This integration is built using Astro's Image Service API.
It enables us to use all the awesome features of Astro, for example, caching, lazy loading, and more listed in the Astro Images documentation.

⚠️ When not to use

Image optimization with the maximum compression ratio may slow down your build time.
You are discouraged using this integration in SSR environments, because it may slow down the responses.

vs. Astro's default image service (sharpImageService)

  • The default image service (a.k.a. astro:assets) uses the default compression settings of sharp, in which the compression ratio is medium, as referred to in the Astro Discord.

astro-compress sets the compression level to the maximum, whereas astro:assets uses the default settings
We most likely could tune up the settings a bit, though we need to be careful about it taking too much time (notably because of SSR doing it at runtime)
see: https://discord.com/channels/830184174198718474/830184175176122389/1168307099571331155

  • The default image service does not support SVG images.
    It only passes them through without any optimization.
    Also, it does not support converting SVG images to raster images. (format option is ignored)
  • AstroCompress does not cache compressed images, so slows down your build time. PlayForm/Compress#49

  • AstroCompress does not support converting SVG images to raster images.
    * It only compresses built files in outDir, and does not intercept the build process.

  • Unless you set image.service in astro.config.{ts,js,mjs,cjs} to passthroughImageService, Astro optimizes images and AstroCompress compresses them again.

Since astro-better-image-service does not support optimizing HTML, CSS, and JavaScript files, you may use AstroCompress with it to compress them.
For example, you may use the following configuration.

astro.config.{ts,js,mjs,cjs}

import betterImageService from "astro-better-image-service";
import astroCompress from "astro-compress";

export default {
  integrations: [
    betterImageService(),
    astroCompress.default({
      HTML: true,
      CSS: true,
      JavaScript: true,
      Image: false,
      SVG: false,
    }),
  ],
};

💻 Development

Getting Started

Run the following commands to start development.

gh repo clone risu729/astro-better-image-service
cd astro-better-image-service
bun install --frozen-lockfile

Testing

To test this package, you may link it to a project using it by running the following commands.

bun run dev
bun link

# in a project using astro-better-image-service
bun link astro-better-image-service

E2E tests using Playwright run on GitHub Actions.

Commit

To commit, run the following command.
commitizen will ask you to fill in the commit message.

bun commit

Release

This package is released automatically by GitHub Actions using semantic-release.
package.json#version is not updated in git, but automatically updated and published to npm.

📜 License

MIT License